【发布时间】:2017-10-10 12:01:47
【问题描述】:
作为一个练习,我们要实现一个服务器,它有一个线程来监听连接,接受它们并将套接字扔到 BlockingQueue 中。然后池中的一组工作线程通过队列并处理通过套接字进入的请求。
每个客户端都连接到服务器,发送大量请求(在发送下一个请求之前等待响应)并最终在完成后断开连接。
我目前的方法是让每个工作线程在队列中等待,获取一个套接字,然后处理一个请求,最后将(仍然打开的)套接字放回队列中,然后再处理可能来自不同客户端的另一个请求。客户端的数量比工作线程的数量多,所以很多连接排队。
这种方法的问题:即使客户端没有发送任何东西,线程也会被客户端阻塞。可能的伪解决方案,都不尽如人意:
- 在
inputStream上调用available(),如果返回0,则将连接放回队列。问题:无法检测客户端是否仍然连接。 - 同上,但使用
socket.isClosed()或socket.isConnected()来确定客户端是否仍然连接。问题:这两种方法都没有检测到客户端挂断,正如 EJP 在Java socket API: How to tell if a connection has been closed? 中很好地描述的那样 - 通过读取或写入来探测客户端是否仍然存在。问题:读取块(即返回到不活动的客户端阻塞队列的原始情况)和写入实际上向客户端发送了一些东西,导致测试失败。
有没有办法解决这个问题? IE。是否可以在不阻塞或发送内容的情况下区分断开连接的客户端和被动客户端?
【问题讨论】:
标签: java multithreading sockets