Java:在Linux OS将它们放入TIME_WAIT之前重新使用端口

时间:2015-03-11 22:57:22

标签: java sockets server

我正在尝试使用线程池构建一个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);
  }
}

2 个答案:

答案 0 :(得分:1)

阻止TIME_WAIT堆积在服务器上的方法是首先接收关闭的方法。这只是意味着您应该调整套接字处理代码以进行循环,而不是仅处理单个请求/响应对。当客户端关闭套接字时,您将检测流的结束而不是新请求,关闭套接字,然后退出处理程序。客户端已经完成后关闭套接字意味着TIME_WAIT发生在客户端。

作为另一个好处,您可以在客户端实现连接池。

答案 1 :(得分:0)

不,如果您无法更改TIME_WAIT时间,则无法更改TIME_WAIT时间。

如果可以,您可能会遇到问题,因为TIME_WAIT状态的想法是阻止来自此连接的任何杂散数据包干扰下一个连接。

我想你必须得到另一个IP地址或减少连接。