【问题标题】:How to design Java server with NIO?如何使用 NIO 设计 Java 服务器?
【发布时间】:2013-04-20 13:15:51
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java sockets concurrency network-programming nio


    【解决方案1】:

    当一个请求被放入队列,并且选择器线程在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);
        }
    }
    

    【讨论】:

    • 太棒了! selector.wakeup 似乎是我正在寻找的 API。
    猜你喜欢
    • 1970-01-01
    • 2011-10-26
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    相关资源
    最近更新 更多