関連するコード -- 注意 命令は、データを操作するいくつかのメソッドを持つ単なるクラスです。新しいスレッドが作成され、読み取られたデータで動作します。
スレッドを読む:
while(true) {
System.out.println(".");
if(selector.select(500) == 0)
continue;
System.out.println("processing read");
for(SelectionKey sk : selector.keys()) {
Instructions ins = myHashTable.get(sk);
if(ins == null) {
myHashTable.put(sk, new Instructions(sk));
ins = myHashTable.get(sk);
}
ins.readChannel();
}
}
READCHANNEL
public void readChannel() {
BufferedReader reader = new BufferedReader(Channels.newReader((ReadableByteChannel) this.myKey.channel(), "UTF-8"));
Worker w = new Worker(this, reader.readLine());
(new Thread(w)).start();
}
その後、新しいスレッドはさらにInstructions
メソッドを呼び出します。
ins 関数が終了すると、Writer に書き込む場合があります。
Writer out = Channels.newWriter((WritableByteChannel) key.channel(), "UTF-8");
out.write(output);
out.flush();
クライアント (Flash ムービー) が出力を受信して処理することを確認できます。
最後に、w
終了します。
ただし、クライアントから最初のメッセージを受信し、処理が成功した後は、READ THREAD
ループによって処理されるメッセージはなくなります。キーはセレクターに登録されており、読み取る準備ができていると思います。すべてのキーをループして、チャンネルで isReadable と isRegistered で読み取れるかどうかを確認しましたが、これまでのすべてのケースで結果が true です。ただし、クライアントから 2 番目のメッセージが送信されると、読み取りスレッドに表示される唯一の応答は「.」文字は 0.5 秒ごとに出力されるのではなく、継続的に高速に出力されます。したがって、データはチャネルにあると思いますが、何らかの理由でセレクターがキーを選択していません。
誰でも私を助けることができますか?