JAVA写的一个接收SOCKET数据的程序,多线程,一方面负责接收,一方面负责给用户分发,现在遇到一个比较奇怪的现象:运行1个小时左右,就接收不到数据,如果接收数据的线程重新new 一个接收对象,瞬间可以收到少量的数据,但是马上又接收不到数据了,知道再new出来一个对象(程序中有一个线程负责判断接收数据是否超时,如果超时,就会重新启动接收数据的线程);这个时候,如果把这个进程KILL掉,再启动,马上就恢复正常,接收速度大大提高,但是过了一个小时之后,又会接收不到数据。在接收不到数据的时候用pstack看了一下线程,20个左右。
请问这个应该是哪里的问题呢?

解决方案 »

  1.   

    一种情况,你的socket连接数是有限制的,有可能是连接没有得到释放导致的,连接数超了,资源耗尽。
    还有一种情况,在一台机器上多个socket的情况,两个socket用到同一个端口,IP的情况,这样也会出问题。没具体研究过,楼主有时间看看这个,看有不有用
    http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6213296
      

  2.   


    下面的程序是线程中判断是否超时的代码:
    -----------------------------------------------
    if(!this.check_time())
    {
    System.out.println("正在重新启动监听线程...");
    try
    {
    receive_socket_data.sock.close();
    System.out.println("已经关闭Socket数据的线程.."); } catch (IOException e)
    {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    receive_socket_data.sock = null;





    }
    ---------------------------------------------------
    在另一个类中,这样启动多线程:
    if(server_socket == null || server_socket.isClosed())
    {
    server_socket = new ServerSocket(socket_server.socket_port);
    server_socket.setReuseAddress(true);
    }

    sock = server_socket.accept();
    sock.setReuseAddress(true);
    System.out.println("new client connected.");
    SendHelper sh = new SendHelper(sock);
    sh.start();