如何用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。