2017-11-27 24 views
-2

채널에서 데이터를 사용할 수있는 경우에만 Server가 socketChannel을 읽도록 NIO Server \ Client 애플리케이션을 작성하고 싶습니다. 내 데모 응용 프로그램 테스트 목적을 위해 클라이언트가 서버에 연결할 수 있지만 서버에 요청을 보내지 마십시오. 그러나 selectionKey.isReadable() 항상 true를 반환합니다. 클라이언트가 요청을 보내지 않으므로 isReadalble()이 false를 반환해야하므로 기대합니다. 에 직면하는 문제 isReadable = true 내 피할 수없는 socketChannel에서 데이터를 읽으려고 내 애플리케이션을 만드는 것입니까? 소켓 채널에서 읽을 데이터가있을 때 내 서버에 알릴 수있는 방법이 있습니까? 이있다 IsReadable()가 항상 true를 돌려 내 서버 응용 프로그램에서() 메소드를 읽어 태그 :NIO : 버퍼에서 데이터를 사용할 수없는 경우 socketChannel.read (buffer)를 피하는 방법

private void read(SelectionKey selectionKey){  
    if(selectionKey.isReadable()){  
     SocketChannel socketChannel = (SocketChannel)selectionKey.channel(); 
     ByteBuffer buffer = ByteBuffer.allocate(256); 
     try { 
      socketChannel.read(buffer); 
      String value = new String(buffer.array()).trim(); 
      System.out.println("Value is: " +value); 
     } catch (IOException e) { 
      System.out.println("Not able to read"); 
     } 
    } 
} 
나는 데이터가있는 경우에만 서버가 된 SocketChannel을 읽고 싶은 일 NIO 서버 \ 클라이언트 응용 프로그램을 작성하려는

답변

1

채널에서 사용할 수 있습니다.

이것이 바로 SelectorOP_READ입니다.

내 데모 애플리케이션에서 클라이언트는 서버에 연결 만하지만 서버에 요청을 보내지는 않습니다.하지만 selectionKey.isReadable()은 항상 true를 반환합니다.

그래서 읽을 수 있습니다.

클라이언트가 요청을 보내지 않으므로 isReadable()은 false를 반환해야합니다.

틀린. 또한 피어가 연결을 닫은 경우 true를 반환합니다. 따라서 데이터가없고 채널을 읽을 수있는 경우 피어가 연결을 닫아야합니다. read()의 반환 값을 무시하므로 결코 알 수 없으므로 채널을 닫지 않으므로 읽을 수 있습니다.

socketChannel.read(buffer); 
String value = new String(buffer.array()).trim(); 

이 있어야한다 :

int count = socketChannel.read(buffer); 
if (count == -1) 
{ 
    socketChannel.close(); 
    return; 
} 
String value = new String(buffer.array(), 0, buffer.limit()); 

자신의 프로토콜을 trim()를 호출 할 필요가 없어야합니다. 공백을 원하지 않으면 보내지 마십시오.