【发布时间】:2012-02-25 12:01:27
【问题描述】:
我正在开发一个中间件应用程序,该应用程序创建并维护与多个服务器的 TCP/IP 连接。如果应用程序检测到连接丢失,它将尝试在计时器上重新连接,直到重新建立连接。
应用程序在非阻塞模式下使用 java.nio.SocketChannel 对象,使用 Selector/SelectionKey 来处理套接字事件。
一旦连接丢失,最好是丢弃当前的 SocketChannel 对象,并创建一个新的对象来重新连接(同时获得一个新的 SelectionKey),还是重用相同的 SocketChannel 和 SelectionKey(我猜这直到重新建立连接)?
【问题讨论】:
-
简单地说:你不能重用SocketChanngel
-
注意到了。谢谢!令我惊讶的是,即使在连接丢失后,SocketChannel 仍会报告 isConnected()。
-
除非关闭
isConnected()将返回 true,前提是连接已建立。收到异常或收到 EOF (-1) 后,只需关闭通道。 -
isConnected()在对等方断开连接时不会神奇地变为假。