代码之家  ›  专栏  ›  技术社区  ›  Adamski

NIO:发送消息,然后立即断开连接

  •  3
  • Adamski  · 技术社区  · 15 年前

    在某些情况下,我希望使用非阻塞I/O将错误消息从服务器发送到客户机( SocketChannel.write(ByteBuffer) )然后断开客户机。假设我写下消息的全部内容,然后立即断开连接,我假设客户机 可能不 接收这条消息,因为我猜操作系统目前还没有发送数据。

    这是正确的吗?如果是这样,是否有建议的方法来处理这种情况?

    我正在考虑使用计时器,如果我想断开客户机的连接,我会发送一条消息,然后在1-2秒后关闭它们的连接。

    3 回复  |  直到 7 年前
        1
  •  1
  •   user207421    7 年前

    socketchannel.write将在非阻塞模式下返回可以立即发送到网络而不阻塞的字节数。您的问题让我认为您希望write方法使用整个缓冲区,并尝试异步地向网络发送额外的数据,但这不是它的工作方式。

    如果您确实需要确保在断开套接字之前将错误消息发送到客户机,那么我只需在调用write方法之前启用阻塞。使用非阻塞模式,您必须在一个循环中调用write,计算每次调用发送的字节数,并在成功地将整个消息传递到套接字时退出循环(我知道,解决方案不好,不必要的代码,忙等待等等)。

        2
  •  0
  •   Lorenzo Boccaccia    15 年前

    您最好启动一个线程并同步地将数据写入通道。异步API更倾向于“一个线程调度多个通道”,而不是真正用于触发和忘记通信。

        3
  •  0
  •   Steffen Heil    13 年前

    这个 close() socket方法确保,使用write-before发送的所有内容实际上在套接字真正关闭之前发送。然而,这假设 write() 能够将所有数据复制到TCP堆栈输出窗口,但这并不总是有效。有关此问题的解决方案,请参阅其他答案。