首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >热插拔ServerSocket (Java)

热插拔ServerSocket (Java)
EN

Stack Overflow用户
提问于 2012-04-01 03:31:39
回答 1查看 265关注 0票数 1

我正在尝试用Java编写代码来实现热插拔。

下面是我目前使用的代码的要点:

代码语言:javascript
复制
// 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类的实例位于不同的虚拟机中时,它仍然有效吗?

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2013-12-29 18:52:00

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

会有一段时间(更短或更长),在关闭第一个ServerSocket和打开第二个socket之后,端口在OS网络驱动程序中被标记为“未打开”(因为操作系统无法知道我们在关闭第一个socket后直接启动新socket的意图)。

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

可能的变通方法

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9959001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档