使用 Java NIO 的事件驱动服务器

Event Driven server using Java NIO

我正在尝试使用 java NIO 构建异步(非阻塞)HTTP 服务器。我目前有一个线程池实现,并希望将其变成单线程事件驱动。

事件驱动服务器究竟是如何工作的? 我们还需要线程吗?

我一直在阅读 Java 通道、缓冲区和选择器。 那么在我创建了一个serverSocketChannel和selector并监听请求之后,我是否需要将请求交给其他线程,让他们处理并服务于请求。如果是这样,它与线程池实现有何不同。

而且如果我不创建更多可以处理请求的线程,同一个线程怎么还能继续监听请求并处理它们。我说的是可扩展的,比如总共有 100 万个请求,同时有 1000 个请求。

I've been reading on Java channels, buffers and selectors. So after I create a serverSocketChannel and the selector and listen to requests, Do I need to hand over the request to other threads so that they can process them and serve the request.

不,我们的想法是在数据可用时处理数据,不一定使用线程。

复杂性来自于处理数据的需要。例如,您可能不会立即收到完整的请求。在这种情况下,您需要将其缓冲到某个地方,直到您收到完整的请求,或者逐个处理它。

收到请求后,您需要发送响应。同样,整个响应通常不能立即发送。你在不阻塞的情况下尽可能多地发送,然后使用选择器等待,直到你可以发送更多(或者另一个事件发生,比如另一个请求进来)。