Java:建立套接字连接池
我有一个使用Java套接字的客户机-服务器应用程序。到目前为止,它的工作方式如下: 客户端打开到服务器的套接字连接。服务器的socketHandler线程将新套接字放入LinkedBlockingQueue。工作线程从队列中获取套接字,并从流中获取和读取对象(客户端将对象发送到服务器),然后将应答写回客户端并关闭套接字 但是现在我想创建一个连接池,这样连接就可以保持打开,但是我仍然需要LinkedBlockingQueud 我的想法是,将每个新连接放在一个队列上,让我们称之为openSocketQueue,然后socketHandler线程(或其他线程)在openSocketQueue上迭代,并检查是否有可用的新数据(不读取数据)。如果数据可用,它将从队列中删除套接字并将其放在LinkedBlockingQueue上。工作进程完成后,套接字不会关闭,而是放回openSocketQueue 这合理吗?如何通过套接字迭代检查是否有新的数据可用Java:建立套接字连接池,java,sockets,queue,connection-pooling,Java,Sockets,Queue,Connection Pooling,我有一个使用Java套接字的客户机-服务器应用程序。到目前为止,它的工作方式如下: 客户端打开到服务器的套接字连接。服务器的socketHandler线程将新套接字放入LinkedBlockingQueue。工作线程从队列中获取套接字,并从流中获取和读取对象(客户端将对象发送到服务器),然后将应答写回客户端并关闭套接字 但是现在我想创建一个连接池,这样连接就可以保持打开,但是我仍然需要LinkedBlockingQueud 我的想法是,将每个新连接放在一个队列上,让我们称之为openSocket
顺便说一句,我不能换成NIO,因为我没有时间做这个。你完全糊涂了 连接池是在客户端实现的:不调用
newsocket();返回到池的连接,而不是关闭;并添加一个线程,关闭池中已存在太长时间(例如15秒)的套接字
在服务器上,您所需要的只是每个连接一个线程,该线程循环读取请求直到EOS,正如我们在本文中讨论的那样。所有这些都不可用()/LinkedBlockingQueue
stuff.因为您想避免使用NIO的异步优势,所以这是唯一剩下的选项。因此您只想使用套接字。其他软件包如netty、mina也可以提供帮助。如果你想使用“反应堆设计模式”,那么上面的软件包会有所帮助。否则,您将需要求助于循环。将SO_REUSEADDR与套接字一起使用怎么样?SO_REUSEADDR
与此问题无关。