Java:建立socket连接池

标签 java sockets queue connection-pooling

我有一个使用 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/

相关文章:

java - 如何根据区域设置格式化数字

java - 嵌套循环导致 OutOfMemory 错误 : Java heap space

java - 使用 xpath 获取没有兄弟节点的节点以及父节点

c - 为什么我们需要在 C 并发服务器中为每个客户端创建不同的进程?

c - 为什么客户端将网络服务器的消息回显给它?

c# - Queue<T> 线程安全 : one writer, 一个读者

java - RCP Eclipse 模型窗口

c++ - 处理多个客户端的单个 TCP/IP 服务器(在 C++ 中)?

php - 如何通过作业 ID 从 Redis 队列中删除作业?

c - Linux 中队列的 mq_receive 中的奇怪输出