[英]Java sockets: open connections from server to client
我有一个客户端服务器问题,具有以下独特要求:1。服务器必须打开与已知客户端的N个连接,客户端只能使用这些连接从服务器请求数据。
到目前为止,我尝试执行以下操作但遇到了一些问题:
在客户端上有一个套接字侦听器,让它将收到的每个连接排入ArrayBlockingQueue。
客户端应用程序将使用上面队列中可用的连接来从服务器请求数据
我在服务器上为每个套接字创建一个线程(worker),并通过N个工作线程监听数据请求。
当我等待工作线程(在服务器上)的传入请求时,我使用InputStream.isAvailable()来检查是否有东西等待读取。
问题:服务器端的工作线程不知道套接字连接是否仍然存在? 即使在客户端应用程序上关闭套接字后,它们仍继续侦听请求。
如果套接字连接仍然存在,如何让我的服务器感觉到?
我在这里采取正确的方法吗?
是否有一个框架可以使实施更容易和更好?
你为什么不反转协议?
您已使用netty标记了该问题。 你尝试过使用Netty吗? 无论哪种情况,我都会推荐它。
问题:服务器端的工作线程不知道套接字连接是否仍然存在?
是的他们这样做。 当客户端关闭连接时,他们将读取EOS。 没问题。
即使在客户端应用程序上关闭套接字后,它们仍继续侦听请求。
只有你忽略了EOS条件。
如果套接字连接仍然存在,如何让我的服务器感觉到?
如果在读取时获得EOS,请关闭套接字并停止读取循环。
我在这里采取正确的方法吗?
您的问题描述已回到正面。 是客户端创建与服务器的连接,而不是相反。
当我等待工作线程(在服务器上)的传入请求时,我使用InputStream.isAvailable()来检查是否有东西等待读取。
InputStream.isAvailable()
从不告知对等方是否已关闭连接。 您必须调用read()
来检查连接是否已关闭。
如果必须使用InputStream.isAvailable()
,则必须至少定期向OutputStream
写入内容,然后您将获得一个IOException
,指示连接已关闭(例如, connection reset by peer
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.