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

标签 java io nio nonblocking

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

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

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

最佳答案

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

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

关于java - NIO:发送消息然后立即断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2192083/

相关文章:

io.netty.channel.AbstractChannel$AnnotatedConnectException : Connection Time out: No further Information:

c - 文件输入/输出和搜索

java - 查询InputStream "System.in"

java - 字节缓冲区性能

java - 对具有大量版本的长表进行全面扫描只会得到一小部分行

java - "FailingHttpStatusCodeException: Too much redirect for"- HtmlUnit 将无法加载

java - 带条件替换的正则表达式

Android - 将 ostream 输出正确映射到 android native 日志?

java - ByteBuffer 的 Compact() 之后位置设置为 0

java - 将上传的文件保存在磁盘、ubuntu 路径上