【发布时间】: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