我正在尝试用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类的实例位于不同的虚拟机中时,它仍然有效吗?
提前谢谢。
发布于 2013-12-29 18:52:00
关闭ServerSocket意味着server1的处理程序不处理新的传入连接,这些连接由server2处理。到目前为止一切正常。当server1不再有任何连接的Socket时,您可以对它进行垃圾回收。
会有一段时间(更短或更长),在关闭第一个ServerSocket和打开第二个socket之后,端口在OS网络驱动程序中被标记为“未打开”(因为操作系统无法知道我们在关闭第一个socket后直接启动新socket的意图)。
在此期间,传入的TCP请求将从操作系统收到端口未打开的消息,并且很可能不会重试,因为它得到了端口未打开的确认。
可能的变通方法
使用java NIO构造,它为每个传入的请求产生一个新的线程,请参阅ServerSocketChannel,并确保检索库http://netty.io/,其中有几个构造。
确保您可以动态设置传入请求的处理程序(和线程安全:),这将使无缝更改传入请求的处理成为可能,但您将无法交换ServerSocket (但这可能也不是您想要的)。
https://stackoverflow.com/questions/9959001
复制相似问题