我正在尝试编写一个读取客户端发送的数据的TCP服务器。我希望在读取后保持客户端连接打开,以便能够读取任何后续发送的数据。
我正在执行的代码如下:
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);
}
}
}
我遇到的问题是,在任何客户端连接之前,选择器块上的select调用。在第一个客户端连接并将数据写入服务器后,即使没有要读取的数据,select也会连续返回OP_READ键?我做错了什么?
读取的代码是:
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();
}
}
此致 布赖恩
答案 0 :(得分:0)
致电compact()
后,您需要致电flip()
并处理您获得的数据。你永远不会这样做,所以你正在填充缓冲区,所以read()
返回零,所以你返回select()
循环,但是套接字接收缓冲区中仍有未决数据。