Как я могу создать различные селекторы для принятия нового соединения в Java NIO - PullRequest
0 голосов
/ 24 мая 2009

Я хочу написать программирование сокетов Java с использованием Java NIO. Работает нормально. Но я использую тот же селектор для принятия чтения и записи клиентам.

Как я могу создать различные селекторы для принятия нового соединения в Java NIO, чтения и записи. Есть ли онлайн-справка.

На самом деле, когда я занят чтением или записью, мой селектор использует больше итератора. Таким образом, если подключено большее количество клиентов, выполнение приема новой связи замедляется. Но я не хочу, чтобы прием клиентов был медленным

// Создать селектор и зарегистрировать два канала сокетов Селектор селектор = ноль; пытаться { // Создать селектор selector = Selector.open ();

    // Create two non-blocking sockets. This method is implemented in
    // e173 Creating a Non-Blocking Socket.
    SocketChannel sChannel1 = createSocketChannel("hostname.com", 80);
    SocketChannel sChannel2 = createSocketChannel("hostname.com", 80);

    // Register the channel with selector, listening for all events
    sChannel1.register(selector, sChannel1.validOps());
    sChannel2.register(selector, sChannel1.validOps());
} catch (IOException e) {
}

// Wait for events
while (true) {
    try {
        // Wait for an event
        selector.select();
    } catch (IOException e) {
        // Handle error with selector
        break;
    }

    // Get list of selection keys with pending events
    Iterator it = selector.selectedKeys().iterator();

    // Process each key at a time
    while (it.hasNext()) {
        // Get the selection key
        SelectionKey selKey = (SelectionKey)it.next();

        // Remove it from the list to indicate that it is being processed
        it.remove();

        try {
            processSelectionKey(selKey);
        } catch (IOException e) {
            // Handle error with channel and unregister
            selKey.cancel();
        }
    }
}

public void processSelectionKey(SelectionKey selKey) throws IOException {
    // Since the ready operations are cumulative,
    // need to check readiness for each operation
    if (selKey.isValid() && selKey.isConnectable()) {
        // Get channel with connection request
        SocketChannel sChannel = (SocketChannel)selKey.channel();

        boolean success = sChannel.finishConnect();
        if (!success) {
            // An error occurred; handle it

            // Unregister the channel with this selector
            selKey.cancel();
        }
    }
    if (selKey.isValid() && selKey.isReadable()) {
        // Get channel with bytes to read
        SocketChannel sChannel = (SocketChannel)selKey.channel();

        // See e174 Reading from a SocketChannel
    }
    if (selKey.isValid() && selKey.isWritable()) {
        // Get channel that's ready for more bytes
        SocketChannel sChannel = (SocketChannel)selKey.channel();
        }
}

Спасибо Дипак

Ответы [ 2 ]

0 голосов
/ 24 мая 2009

Каждый селектор нуждается в собственной нити.

Если вам нужно несколько селекторов, почему бы просто не использовать блокировку NIO, это будет намного проще. Неблокирующая IO имеет смысл, только если вы хотите, чтобы соединения разделяли потоки.

0 голосов
/ 24 мая 2009

Существует множество интерактивной справки .

Если вы хотите создать новый селектор, создайте еще один селектор (так же, как это было сделано в скопированном вами примере кода). Вы можете зарегистрировать каналы с ним только для операции соединения, если хотите (документы покрывают это, но операция OP_ACCEPT). Вы, вероятно, хотите, чтобы пул потоков выполнял работу по обработке клиента - таким образом, ваш основной поток может ставить рабочие элементы в очередь и сразу же возвращаться к принятию новых подключений на слушающем сокете.

...