Java选择器select()始终返回上次读取的键
我正在尝试编写一个TCP服务器来读取客户端发送的数据。我希望在读取之后保持客户端连接打开,以便能够读取任何后续发送的数据 我正在执行的代码如下:Java选择器select()始终返回上次读取的键,java,selector,nio,Java,Selector,Nio,我正在尝试编写一个TCP服务器来读取客户端发送的数据。我希望在读取之后保持客户端连接打开,以便能够读取任何后续发送的数据 我正在执行的代码如下: while(true) { try { int keysSelected = selector.select(); System.out.println("keysSelected = " + keysSelected); if (keysSelected
while(true) {
try {
int keysSelected = selector.select();
System.out.println("keysSelected = " + keysSelected);
if (keysSelected < 1) {
continue;
}
} catch (IOException e) {
e.printStackTrace();
break;
}
Iterator<SelectionKey> keyIterator = selector.selectedKeys().iterator();
while(keyIterator.hasNext()) {
SelectionKey key = keyIterator.next();
keyIterator.remove();
if (key.isAcceptable()) {
processAcceptRequest(selector, key);
} else if (key.isReadable()) {
processQueryRequest(key);
}
}
}
问候
Brian在调用
flip()
并处理所获得的数据后,需要调用compact()
。你从来没有这样做过,所以你在填充缓冲区,所以read()
返回零,所以你在返回select()
循环,但是套接字接收缓冲区中仍然有挂起的数据。在调用flip()
之后,你需要调用compact()
,并处理你得到的数据。你从来没有这样做过,所以你在填充缓冲区,所以read()
返回零,所以你返回到select()
循环,但是套接字接收缓冲区中仍然有挂起的数据。不幸的是,这似乎不能解决问题。尽管读取的结果始终为-1,但读取的键仍然始终返回?这意味着EOS,因此您应该关闭通道。不幸的是,这似乎无法解决问题。尽管读取的结果始终为-1?这意味着EOS,因此您应该关闭通道,但读取的键仍然始终返回。
private void processQueryRequest(SelectionKey key) {
ByteBuffer byteBuffer = ByteBuffer.allocate(32);
SocketChannel clientChannel = (SocketChannel) key.channel();
try {
byteBuffer.clear();
while(clientChannel.read(byteBuffer) > 0) {
byteBuffer.flip();
Charset charset = Charset.forName("UTF-8");
CharBuffer charBuffer = charset.decode(byteBuffer);
System.out.println(charBuffer.toString());
}
} catch (IOException e) {
e.printStackTrace();
}
}