【问题标题】:Java NIO socket application: reuse SocketChannel or throw away on lost connection?Java NIO 套接字应用程序:重用 SocketChannel 还是丢掉连接?
【发布时间】: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() 在对等方断开连接时不会神奇地变为假。

标签: java sockets nio


【解决方案1】:

你必须把它扔掉。当连接丢失时,您必须关闭您的 SocketChannel 以正确清理连接。如果您想尝试重新连接,那么只需执行您第一次所做的操作(createSocket、进行非阻塞、初始化连接等)。

【讨论】:

    猜你喜欢
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    相关资源
    最近更新 更多