java nio とセレクターを使って自分でサーバーを作りました。必要に応じて、クライアントから直接データと回答を受け取ることができます。
しかし今は、データを処理し、いつでも各クライアントにデータを送信するスレッドが必要です。
では、どうすればそれを行うことができますか?また、各クライアントにデータを書き込むためにすべてのチャネルをメモリに保持する方法は?
必要に応じて、Java nio を使用してコードの一部を投稿できます。
java nio とセレクターを使って自分でサーバーを作りました。必要に応じて、クライアントから直接データと回答を受け取ることができます。
しかし今は、データを処理し、いつでも各クライアントにデータを送信するスレッドが必要です。
では、どうすればそれを行うことができますか?また、各クライアントにデータを書き込むためにすべてのチャネルをメモリに保持する方法は?
必要に応じて、Java nio を使用してコードの一部を投稿できます。
サーバーはすべてのクライアントを認識している必要があるため、ランナブルで新しいスレッドを作成し、それがサーバーを認識していることを確認してください。クライアントがメッセージを送信すると、データ プロセッサ スレッドを介してメッセージが解析され、その仕事が行われます。タスクの処理が完了したら、サーバーに通知して、すべてのクライアントを更新できるようにします。
ヒント: LinkedBlockingQueueのようなものを使用して処理スレッドの待機キューを作成する必要があります。これにより、タスクの終了を待たずに常にタスクをキューに入れることができます。その後、thead は、処理が必要なキューにあるものを待ちます。このようにして、処理スレッドは、実際にキューにタスクがある場合にのみ CPU リソースを使用します。
これがコード例です
public abstract class Queue implements Runnable {
private final LinkedBlockingQueue<Message> queue;
public Queue() {
this.queue = new LinkedBlockingQueue<Message>();
}
/**
* Adds a message to the queue.
* @param message
*/
public void add(final Message message) {
try {
queue.put(message);
} catch (final InterruptedException e) {
e.printStackTrace();
}
}
/**
* Waits for new messages
*/
@Override
public void run() {
while(true) {
try {
final Message message = queue.take();
processMessage(message);
} catch (final InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* Processes the new message
*/
protected abstract void processMessage(Message message);
}