【问题标题】:NIO: Send message and then disconnect immediatelyNIO:发送消息然后立即断开连接
【发布时间】:2011-01-12 14:53:51
【问题描述】:

在某些情况下,我希望使用非阻塞 I/O (SocketChannel.write(ByteBuffer)) 从服务器向客户端发送错误消息,然后断开客户端。假设我写了消息的全部内容,然后立即断开连接,我认为客户端可能不会收到此消息,因为我猜测操作系统此时实际上还没有发送数据。 p>

这是否正确,如果正确,是否有处理这种情况的推荐方法?

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

【问题讨论】:

    标签: java io nio nonblocking


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您最好启动一个线程并将数据同步写入通道。异步 api 更适合“一个线程调度多个通道”,而不是真正用于“一劳永逸”的通信。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-02-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多