【问题标题】:Java: establishing socket connection poolJava:建立套接字连接池
【发布时间】:2014-10-17 09:34:50
【问题描述】:

我有一个使用 Java 套接字的客户端-服务器应用程序。到目前为止,它的工作方式如下:

客户端打开到服务器的套接字连接。服务器的 socketHandler 线程将新的套接字放到 LinkedBlockingQueue 上。 Worker 线程从队列中获取一个套接字,然后从流中获取和读取一个对象(客户端将对象发送到服务器),然后将答案写回客户端并关闭套接字。

但现在我想创建一个连接池,以便连接可以保持打开状态,但我仍然想要 LinkedBlockingQueud。

我的想法是每个新连接都放在一个队列中,我们称之为 openSocketQueue,然后 socketHandler 线程(或其他线程)遍历 openSocketQueue 并检查是否有新数据可用(不读取数据) .如果数据可用,它将从队列中删除套接字并将其放入 LinkedBlockingQueue。工作人员完成后,套接字不会关闭,而是放回 openSocketQueue。

这合理吗?如何以有效的方式遍历套接字检查是否有新数据可用?

顺便说一句,我不能换蔚来,因为我没有时间。

【问题讨论】:

  • 既然你想避免使用 NIO 的异步优势,这是唯一的选择。所以你只想使用套接字。其他软件包,如 netty 、 mina 也可以提供帮助。如果您想使用“反应器设计模式”,那么上述软件包将有所帮助。否则,您将需要使用循环。
  • 将 SO_REUSEADDR 与套接字一起使用怎么样?
  • SO_REUSEADDR 与此问题无关。

标签: java sockets queue connection-pooling


【解决方案1】:

你完全糊涂了。

连接池是在客户端实现的而不是调用new Socket(),而是查看由目标 IP:port 键入的集合;而不是关闭,而是将连接返回到池;然后你添加一个线程来关闭池中已经存在太久的套接字,例如15 秒。

正如我们在您的other thread 中讨论的那样,您在服务器上所需要的只是每个连接循环读取请求直到 EOS 的线程。这些available()/LinkedBlockingQueue 的东西都没有。

【讨论】:

    猜你喜欢
    • 2015-11-12
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多