3

サーバーを書いているとします。サーバーはクライアントの接続を受け入れ、ネットワークから要求を読み取り、それらを処理して結果を返します。また、すべてのソケットを手動で処理したいとします (演習として)。

java.nioノンブロッキング APIでソケットを処理する単一のスレッドが必要です。リクエストを完全に読み取ると、非同期で処理を開始し(リクエストを使用するか、別のスレッドに渡します)、すぐににFuture戻ります。selector

処理が終了すると、「ソケット スレッド」は応答を受け取り、ソケットを介してクライアントに送り返します。しかし、私はそれを行う方法がわかりません。

上記の設計が間違っているということですか?サーバーをどのように実装することをお勧めしますjava.nioか?

4

1 に答える 1

2

リクエストがキューに入れられ、セレクタ スレッドが にあるselector.select()場合、 を呼び出しますselector.wakeup()。セレクタ スレッドは次のようにループを実行します。

while (selector.isOpen() && !Thread.interrupted()) {
    for (;;) {
        Request r=queue.poll(); // requests can be both to read and write
        if (r==null) {
            break;
        }
        processRequest(r);
    }

    selector.select(); // wait for next event

    // Iterate over the set of keys for which events are available
    Iterator<SelectionKey> selectedKeys = selector.selectedKeys().iterator();
    while (selectedKeys.hasNext()) {
        SelectionKey key = selectedKeys.next();
        selectedKeys.remove();
        processKey(key);
    }
}
于 2013-04-21T04:06:04.170 に答える