Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:建立套接字连接池_Java_Sockets_Queue_Connection Pooling - Fatal编程技术网

Java:建立套接字连接池

Java:建立套接字连接池,java,sockets,queue,connection-pooling,Java,Sockets,Queue,Connection Pooling,我有一个使用Java套接字的客户机-服务器应用程序。到目前为止,它的工作方式如下: 客户端打开到服务器的套接字连接。服务器的socketHandler线程将新套接字放入LinkedBlockingQueue。工作线程从队列中获取套接字,并从流中获取和读取对象(客户端将对象发送到服务器),然后将应答写回客户端并关闭套接字 但是现在我想创建一个连接池,这样连接就可以保持打开,但是我仍然需要LinkedBlockingQueud 我的想法是,将每个新连接放在一个队列上,让我们称之为openSocket

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

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

但是现在我想创建一个连接池,这样连接就可以保持打开,但是我仍然需要LinkedBlockingQueud

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

这合理吗?如何通过套接字迭代检查是否有新的数据可用


顺便说一句,我不能换成NIO,因为我没有时间做这个。

你完全糊涂了

连接池是在客户端实现的:不调用
newsocket();返回到池的连接,而不是关闭;并添加一个线程,关闭池中已存在太长时间(例如15秒)的套接字


在服务器上,您所需要的只是每个连接一个线程,该线程循环读取请求直到EOS,正如我们在本文中讨论的那样。所有这些都不可用()/LinkedBlockingQueue
stuff.

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