我正在尝试用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类的实例位于不同的虚拟机中,它仍然可以工作吗?
提前致谢。
答案 0 :(得分:0)
关闭ServerSocket意味着server1
的处理程序不处理新的传入连接,这些由server2
处理。到现在为止还挺好。当垃圾邮件不再连接Socket
时,您可以对其进行垃圾收集。
在关闭第一个ServerSocket并打开第二个ServerSocket之后,在OS网络驱动程序中将端口标记为“未打开”的(更短或更长)时间段(因为操作系统无法知道我们的意图)在关闭第一个套接字后直接启动新套接字。)
在此期间传入的TCP请求将从操作系统返回一条消息,表明端口未打开,并且可能不会重试,因为它确认端口未打开。
可能的解决方法
使用java NIO构造,它为每个传入请求生成一个新线程,请参阅ServerSocketChannel并确保签出具有多个构造的库http://netty.io/。
确保您可以动态设置传入请求的处理程序(以及线程安全:),这样可以无缝地更改传入请求的处理,但是不是能够交换ServerSocket(但这可能不是你想要的)。