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

时间:2010-02-03 13:17:45

标签: java io nio nonblocking

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

启动线程并同步向通道写入数据可能会更好。 async api更倾向于“一个线程调度多个通道”而不是真正用于点火和忘记通信。

答案 2 :(得分:0)

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