对于练习,我们将实现一个服务器,该服务器具有侦听连接的线程,接受它们并将套接字引入BlockingQueue。池中的一组工作线程然后通过队列并处理通过套接字进入的请求。Java:使用队列管理比线程更多的连接
每个客户端连接到服务器,发送大量的请求(在发送下一个请求之前等待响应),并最终在完成时断开连接。
我目前的方法是让每个工作线程在队列中等待,获取套接字,然后处理一个请求,并最终将(仍然打开的)套接字放回队列中,然后再处理另一个请求, 。有更多的客户端比工作线程多,所以很多连接排队。
此方法的问题:即使客户端不发送任何内容,线程也会被客户端阻止。可能的伪解决方案,都不能令人满意:在inputStream
- 呼叫
available()
,并把连接回到队列中,如果返回0的问题:这是不可能的检测,如果客户端仍连接。 - 如上所述,但使用
socket.isClosed()
或socket.isConnected()
来确定客户端是否仍连接。问题:这两种方法都没有检测到客户端挂起,正如EJP在Java socket API: How to tell if a connection has been closed? - 中很好地描述的一样,通过读取或写入客户端来探测客户端是否仍在那里。问题:读取块(即回到非活动客户端阻塞队列的原始情况),并且写入实际上会将某些内容发送给客户端,从而使测试失败。
有没有办法解决这个问题?即是否有可能区分一个断开的客户端与被动客户端没有阻止或发送的东西?
如果我理解正确,这个问题与阻塞IO无关,可用()中的问题用于解决这个问题。相反,问题在于如何判断客户是否意外关闭,或只是安静。我认为使用NIO对此并无帮助。 –
我试图处理更大的查询'这种方法的问题:即使客户端不发送任何东西,线程也会被客户端阻止。两个模型都存在断开连接的客户端,但至少在NIO中,您并不等待它们。 – ptomli
同样可以使用available()no?还没有等待。 –