我正在尝试使用线程池构建一个java多线程服务器。我已经将执行我的操作的线程数量限制为15但是每次服务器套接字接受新连接时它都会在新端口上创建连接,一旦线程完成,它就会关闭套接字,但linux会将端口置于TIME_WAIT状态。此服务器接收大量流量,并且由于等待,它会快速耗尽可用端口并挂起,直到定时等待到期为止。我没有root权限来更改等待时间,所以有没有办法重新使用端口而不是将它们放入TIME_WAIT?
public static void main(String argv[]) throws Exception{
init_LogServer.initMarshal();
ServerSocket socket = new ServerSocket(44431);
ConcurrentHashMap<Integer, String> transactionMap = new ConcurrentHashMap<Integer,String>();
CountTrans Tracker = new CountTrans(transactionMap);
ExecutorService executor = Executors.newFixedThreadPool(15);
System.out.println("Waiting...");
//listen for log packets
while(true){
//open socket
Socket connectionSocket = socket.accept();
//send to thread
Runnable worker = new LogThread(connectionSocket, Tracker);
executor.execute(worker);
}
}
答案 0 :(得分:1)
阻止TIME_WAIT堆积在服务器上的方法是首先接收关闭的方法。这只是意味着您应该调整套接字处理代码以进行循环,而不是仅处理单个请求/响应对。当客户端关闭套接字时,您将检测流的结束而不是新请求,关闭套接字,然后退出处理程序。客户端已经完成后关闭套接字意味着TIME_WAIT发生在客户端。
作为另一个好处,您可以在客户端实现连接池。
答案 1 :(得分:0)
不,如果您无法更改TIME_WAIT时间,则无法更改TIME_WAIT时间。
如果可以,您可能会遇到问题,因为TIME_WAIT状态的想法是阻止来自此连接的任何杂散数据包干扰下一个连接。
我想你必须得到另一个IP地址或减少连接。