我正在尝试向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类的实例位于不同的虚拟机中,是否有办法确保没有断开连接,它仍然可以工作吗?
提前致谢。
最佳答案
ServerSocket的关闭意味着server1
的处理程序不处理新的传入连接,这些连接由server2
处理。到目前为止,一切都很好。当不再有连接的Socket
时,可以对server1进行垃圾回收。
关闭第一个ServerSocket并打开第二个ServerSocket后,在一段时间(较短或更长时间)内,在OS网络驱动程序中将端口标记为“未打开”(因为OS无法知道我们打算启动一个服务器)。在关闭第一个套接字后直接添加新套接字)。
在此期间,传入的TCP请求将从操作系统返回一条消息,提示该端口未打开,并且可能会重试,因为它已确认该端口未打开。
可能的解决方法
使用java NIO构造,该构造会为每个传入请求生成一个新线程,请参阅ServerSocketChannel并确保签出库http://netty.io/,该库具有多个构造。
确保可以动态设置传入请求的处理程序(并确保线程安全:),这将使无缝更改传入请求的处理成为可能,但是您将无法交换ServerSocket(但是可能不会)正是您想要的)。
关于java - 热插拔ServerSocket(Java),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9959001/