2
클라이언트가 보낸 데이터를 읽는 TCP 서버를 쓰려고합니다. 나는 후속 데이터를 읽을 수 있도록 읽기 후에 클라이언트 연결을 열린 상태로 유지하려고합니다. Java 선택기 select()는 항상 마지막 읽기 키를 반환합니다.
내가 실행하고 코드
은 다음과 같습니다 : 는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);
}
}
}
내가 경험하고 문제는 그 어떤 클라이언트가 연결 전에, 선택기 블록 선택 호출. 첫 번째 클라이언트가 서버에 연결하여 데이터를 쓰고 나면 읽을 데이터가 없어도 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();
}
}
감사 브라이언
불행히도 이것은 문제를 해결하지 못하는 것 같습니다. 읽기 결과가 항상 -1이지만 읽기에 대한 키가 항상 리턴됩니다. – Brian
이것은 EOS를 의미하므로 채널을 폐쇄해야합니다. – EJP