gpt4 book ai didi

Java NIO 服务器

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:15:00 40 4
gpt4 key购买 nike

目前我正在开发 Java NIO 服务器(单线程)并且遇到了一些问题。服务器接受传入连接,将初始数据包(该数据包包含客户端用于进一步通信的一些数据)写入客户端但不从中读取。服务器仅在我关闭客户端时才尝试读取,当然,它会返回 -1。

当接受连接时,它被注册在:

selectionKey = socketChannel.register(_selector, SelectionKey.OP_READ)

selectionKey.isReadable() 返回 false(应该吗?)

在发送初始数据包之前,ops 更改为:

_selectionKey.interestOps(_selectionKey.interestOps() | SelectionKey.OP_WRITE)

发送初始数据包后,ops 更改为:

selectedKey.interestOps(selectedKey.interestOps() & ~SelectionKey.OP_WRITE)

数据包被发送。

可能是什么问题?会不会跟客户有关?

最佳答案

selectionKey.isReadable() returns false (should it?)

当然,直到有数据要读取,或者流结束。

Before sending initial packet, ops are changed to:

_selectionKey.interestOps(_selectionKey.interestOps() | SelectionKey.OP_WRITE)

坏主意。 OP_WRITE 几乎总是准备就绪,即除非套接字发送缓冲区已满,因此您只会导致您的 Selector.select() 方法无意识地旋转。

当你想写信给 channel 时,写信就可以了。在经典循环中执行此操作:

while (buffer.position() > 0)
{
buffer.flip();
int count = channel.write(buffer);
buffer.compact();
if (count == 0)
{
// see below ...
}
}

如果 count 为零,您应该然后注册 OP_WRITE,跳出循环,然后返回到 选择器 循环。如果您在没有发生这种情况的情况下退出此循环,请注销 OP_WRITE。

请注意,这意味着每个 channel 都有一个写入缓冲区。出于类似的原因(read() 返回零),每个 channel 还需要一个读取缓冲区。这反过来又意味着包含它们的 channel “ session ”对象,这可能是 channel 选择键的附件。

关于Java NIO 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7053924/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com