2014-10-17 181 views
1

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

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

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

我的想法是,每个新的连接都放在一个队列中,让我们调用它openSocketQueue,然后socketHandler线程(或其他线程)遍历openSocketQueue并检查是否有新的数据可用(不读取数据)。如果数据可用,则将该套接字从队列中移除并放入LinkedBlockingQueue。工作完成后,套接字未关闭,但放回到openSocketQueue。

这是合理的吗?我如何迭代套接字来检查是否有新的数据以有效的方式被访问?

顺便说一句,我不能改变为NIO,因为我没有时间。

+0

既然你想避免使用NIO的异步好处,这是唯一的选择left.So你只想使用套接字。像netty,mina等其他软件包也可以提供帮助。如果你想使用“反应堆设计模式”,那么上述软件包将有所帮助。否则,你将需要诉诸循环。 – 2014-10-17 10:30:54

+0

使用SO_REUSEADDR插座怎么样? – machinery 2014-10-17 11:31:45

+0

'SO_REUSEADDR'与这个问题没有任何关系。 – EJP 2014-10-18 22:50:31

回答

2

你完全困惑。

在客户端执行连接池而不是调用new Socket()您查看以目标IP:端口为关键字的集合;而不是关闭你返回连接池;并添加一个线程来关闭池中已经存在很久的套接字,例如15秒。

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