我有一个使用 Java 套接字的客户端-服务器应用程序。到目前为止,它的工作方式如下:
客户端打开到服务器的套接字连接。服务器的socketHandler线程将新的套接字放入LinkedBlockingQueue中。工作线程从队列中获取套接字,并从流中获取和读取对象(客户端将对象发送到服务器),并将答案写回客户端并关闭套接字。
但现在我想创建一个连接池,以便连接可以保持打开状态,但我仍然想要 LinkedBlockingQueud。
我的想法是,每个新连接都放在一个队列中,我们称之为 openSocketQueue,然后 socketHandler 线程(或其他线程)迭代 openSocketQueue 并检查是否有新数据可用(不读取数据) 。如果数据可用,它将从队列中删除套接字并将其放入 LinkedBlockingQueue 中。 Worker 完成后,套接字不会关闭,而是放回到 openSocketQueue 中。
这样合理吗?如何以有效的方式迭代套接字检查是否有新数据可用?
顺便说一句,我无法更改为 NIO,因为我没有时间这样做。
最佳答案
你完全糊涂了。
连接池是在客户端实现的:而不是调用new Socket()
,而是在由目标 IP:port 键入的集合中查找;您可以将连接返回到池中,而不是关闭;然后添加一个线程来关闭池中已经存在太久的套接字,例如15 秒。
服务器上您所需要的只是每个连接一个线程,循环读取请求直到 EOS,正如我们在您的 other thread 中讨论的那样。这些 available()/LinkedBlockingQueue
都不是。
关于Java:建立socket连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26422107/