3

假设我正在编写服务器。服务器接受客户端连接,从网络读取请求,处理它们并发回结果。还假设我想手动处理所有套接字的东西(就像练习一样)。

我希望有一个线程来处理具有java.nio非阻塞 API 的套接字。当它完全读取一个请求时,它开始异步处理它(使用Future或将请求传递给另一个线程)并selector立即返回。

当处理完成时,“套接字线程”应该接收到通过套接字将其发送回客户端的响应。但是我不知道该怎么做。

这是否意味着上面的设计是错误的?您如何建议使用 实施服务器java.nio

4

1 回答 1

2

When a request is put in the queue, and the selector thread is in selector.select(), call selector.wakeup(). The selector thread executes loop like this:

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 回答