Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用NIO设计Java服务器?_Java_Sockets_Concurrency_Network Programming_Nio - Fatal编程技术网

如何用NIO设计Java服务器?

如何用NIO设计Java服务器?,java,sockets,concurrency,network-programming,nio,Java,Sockets,Concurrency,Network Programming,Nio,假设我正在编写一个服务器。服务器接受客户机连接,从网络读取请求,处理它们并返回结果。还假设我想手动处理所有套接字内容(作为练习) 我希望有一个线程来处理带有java.nio非阻塞API的套接字。当它完全读取请求时,它开始异步处理它(使用Future或将请求传递给另一个线程),并立即返回到选择器 当处理完成时,“套接字线程”应该收到响应,通过套接字将其发送回客户端。然而,我不知道如何做到这一点 这是否意味着上述设计是错误的?您建议如何使用java.nio实现服务器 当请求被放入队列时,选择器线程位

假设我正在编写一个服务器。服务器接受客户机连接,从网络读取请求,处理它们并返回结果。还假设我想手动处理所有套接字内容(作为练习)

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

当处理完成时,“套接字线程”应该收到响应,通过套接字将其发送回客户端。然而,我不知道如何做到这一点


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

当请求被放入队列时,选择器线程位于
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);
    }
}
while(selector.isOpen()&&!Thread.interrupted()){
对于(;;){
Request r=queue.poll();//请求既可以读取也可以写入
if(r==null){
打破
}
处理请求(r);
}
selector.select();//等待下一个事件
//迭代事件可用的键集
迭代器selectedKeys=selector.selectedKeys().Iterator();
while(selectedKeys.hasNext()){
SelectionKey=selectedKeys.next();
selectedKeys.remove();
进程键(key);
}
}

太棒了<代码>选择器。唤醒
似乎就是我要找的API。