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