2017-12-21 9 views
-5
public TcpClientChannelSelector(String ip, int port) throws IOException    
{ 
    socketChannel = SocketChannel.open(); 
    socketChannel.configureBlocking(false); 
    socketChannel.socket().connect(new InetSocketAddress(ip, port),5000); 
    readBuffer = ByteBuffer.allocate(BUFF_SIZE); 
    writeBuffer = ByteBuffer.allocate(BUFF_SIZE); 
    isConnected = false; 
    registerChannel(socketChannel, SelectionKey.OP_CONNECT | SelectionKey.OP_READ); 
} 

答えて

0

私はTIMOUTを設定すると、アプリが例外「IllegalBlockingModeException」

をスローを投げ、私のAndroidアプリ上でのSocketChannelを使用もちろんそれはしました。タイムアウトはブロックモードです。

socketChannel.configureBlocking(false); 

チャンネルを非ブロックモードにしました。ここで

socketChannel.socket().connect(new InetSocketAddress(ip, port),5000); 

あなたはモードを遮断する意味タイムアウトと接続しようとしている。また、完全に無意味OP_CONNECTに登録することができます。

意味がありません。

接続タイムアウトを使用する場合は、チャネルを非ブロッキングモードにする前に接続し、OP_CONNECTには登録しないでください。

ノンブロッキングモードを使用する場合は、5000msタイムアウトパラメータを省略し、この後に続くSelector.select()コールでタイムアウトを使用します。

+0

タイムアウトを設定するときにノンブロッキングモードを設定できないことを理解できますか? タイムアウトを設定すると、Selector snoopが失敗します。 –

+0

しかし、今私はそれを非ブロックに設定し、タイムアウトを聞きたいのですが、どうすればいいのですか?... –

+0

相互に不一致な目的の間に*決定する必要があります。ノンブロッキングモードに設定した場合、ブロックされませんので、タイムアウトの問題はありません。タイムアウトが必要な場合は、ブロッキングモードを使用します。私はすでにこれをすべて述べてきました。私はあなたが「セレクタ」スヌープで何を意味しているのか、なぜ私がすでに答えている質問を私に聞いているのか分かりません。 – EJP

関連する問題