こんにちは私は単純なJavaNIOサーバーを実装しようとしています。これはsocketChannelをセレクターに登録します。したがって、私はクライアントに耳を傾け、いくつかの応答を送り返したいと思います。socketChannelがセレクターに登録された後、クライアント(非NIO)がデータを送信しても、サーバーは読み取ることができません。ただし、生成されたキーはまだ繰り返されています。
詳細ビュー:サーバー側:
**First thread**:
public void run(){while(true){
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(true);
serverSocketChannel.socket().bind(inetAdressOfServer);
SocketChannel clientChannel = serverSocketChannel.accept();
new Listener("").addSocketChannel(clientChannel);
}}
**Second Thread**:
static Selector selector = Selector.open();
public boolean addSocketChannel(SocketChannel clientChannel) {
SelectionKey key = clientSocketChannel.register(selector, selector.OP_READ|SelectionKey.OP_WRITE);
key.attach(new ChannelCallback(clientSocketChannel));
return key.isValid();
}
public void run() {
Set keysSet = selector.keys();
Iterator i = keysSet.iterator();
while (i.hasNext()) {
SelectionKey key = (SelectionKey) i.next();
}
if (key.isReadable()) {
//read and do something
}
}
Client Side:
Socket socket = new Socket(serverIP, serverPort);
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
dos.writeBytes(str + "\n");
注意:シングルスレッドで実行すると同じプログラムが機能しますが、上記の方法で実装すると、クライアントをリッスンしなくなります。この問題の解決にご協力ください。