2017-11-27 9 views
-2

NIO Server \ Clientアプリケーションを作成します。テスト目的のための私のデモでは、クライアントはサーバーに接続するだけでサーバーに要求を送信することはありませんが、selectionKey.isReadable()は常にtrueを返します。クライアントが要求を送信しないので、私は期待していますisReadalble() falseを返す必要があります。 私がに直面している問題は、isReadable = trueです。実際に避けたいsocketChannelからデータを読み取ろうとするアプリケーションになりますか? ソケットチャネルで読み取るデータがあるときに私のサーバーに通知する方法はありますか? はisReadable()は常にtrueを返します私のサーバーアプリケーションに()メソッドを読み込み、次のとおりです。NIO:バッファ内で利用可能なデータがない場合、socketChannel.read(バッファ)を避ける方法

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への読みたい1つのNIOサーバー\ Clientアプリケーションを書きたい

答えて

1

チャンネルで利用可能です。

これは、SelectorOP_READが対象です。

私のデモでは、テスト目的のアプリケーションクライアントはサーバーに接続するだけですが、サーバーに要求を送信することはありませんが、selectionKey.isReadable()は常にtrueを返します。

です。

クライアントが要求を送信しないため、isReadable()はfalseを返す必要があります。

間違っています。また、ピアが接続を閉じた場合はtrueを返します。したがって、データがなく、チャネルが読み取り可能である場合、ピアは接続を閉じる必要があります。返り値read()を無視しているので、決して見つけられないので、チャンネルを決して閉じることはできません。

これは次のようになります。

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

独自のプロトコルにtrim()を呼び出すための必要はないはずです。スペースを必要としない場合は、送信しないでください。

関連する問題