1

我正在尝试用 Java 编写代码到热插拔套接字。

这是我目前正在使用的代码的要点:

// initial server initialization
ServerSocket server1 = new ServerSocket(port);

// ... code to accept and process requests

// new server initialization
ServerSocket server2 = new ServerSocket();

// attempt at hotswap
server1.close();
server2.bind(port);

// .. more code

代码如上所示,但我想知道在第一个套接字关闭和第二个套接字打开之间丢失消息的可能性。

两个问题:

有没有办法确保没有连接被丢弃?

如果有一种方法可以确保没有连接被丢弃,如果 ServerSocket 类的实例位于不同的虚拟机中,它是否仍然有效?

提前致谢。

4

1 回答 1

0

ServerSocket 的关闭意味着它server1的处理程序不处理新的传入连接,这些由server2. 到目前为止,一切都很好。当 server1 不再有任何已连接Socket的 s 时,您可以对其进行垃圾收集。

在第一个 ServerSocket 关闭并打开第二个 ServerSocket 之后,将有一段时间(更短或更长)端口在 OS 网络驱动程序中标记为“未打开”(因为 OS 无法知道我们打算启动一个关闭第一个套接字后直接新建套接字)。

在此期间传入的 TCP 请求将收到来自操作系统的消息,指出端口未打开,并且可能不会重试,因为它得到了端口未打开的确认。

一种可能的解决方法

使用 java NIO 构造,它为每个传入请求生成一个新线程,请参阅 ServerSocketChannel 并确保查看库http://netty.io/,其中有几个构造。

确保您可以动态设置传入请求的处理程序(并且线程安全:),这将可以无缝更改传入请求的处理,但您将无法交换 ServerSocket(但这可能不是正是你想要的,要么)。

于 2013-12-29T10:51:59.807 回答