こんにちは私は単純なJava NIOサーバーを実装しようとしています。ソケットセレクタはセレクタにsocketChannelを登録します。したがって、私はクライアントに耳を傾け、いくつかの応答を返信したい。 socketChannelがセレクタに登録された後、クライアント(NIO以外)が何らかのデータを送信しても、Serverは読み取ることができません。生成されたキーはまだ反復されています。NIOサーバーがクライアントを聞くことができません
詳細表示:サーバー側:
**First thread**:
ます。public void実行(){ ながら、(真){
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");
NB:単一のスレッドで実行すると、同じプログラムが動作しますが、上記の方法で実装された場合、クライアントに耳を傾けません。 この問題を解決するのを手伝ってください。
今日、人々は6年前のJava-1.4書式をイテレータに使用しているのはいつも不思議です。古いJavaの本とチュートリアルはまだまだ広まっていますか?それは私を悲しくする。 –