![](/img/trans.png)
[英]Java NIO selector.select() always returns only one SelectionKey for OP_ACCEPT SelectionKey
[英]Java Selector select() always returns the last read key
我正在嘗試編寫一個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();
}
}
問候布萊恩
調用flip()
並處理獲取的數據后,需要調用compact()
。 您從來沒有這樣做,所以您正在填充緩沖區,因此read()
返回零,因此您將返回到select()
循環,但是套接字接收緩沖區中仍然有未決數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.