请教各位大虾一个问题,假如我用一个线程建立SOCKET连接,当我突然把这个线程结束掉的时候,那么这个线程所创建的这个SOCKET是否也跟着一起结束,其所占用的资源是否完全释放?因为最近经常遇到SOCKET突然出现异常的情况,打算当出现异常的时候重新初始化一个SOCKET来建立连接,所以用这种方法来实现,不知道可不可行?

解决方案 »

  1.   

    线程一般是主动结束,应该有时间close socket。
      

  2.   

    socket出异常的话,楼主可以catch异常并主动close socket,就不会有socket还在不在这样的疑问了。
      

  3.   

    个人感觉不会 ,如果你开辟某个线程去连接Socket 当你的Socket 连接成功了以后,那么你这个线程的任务就结束了啊。 我感觉可以这样做,发生异常的时候直接处理并发出连接关闭,然后再通过该线程重新建立套接字。 
      

  4.   

    线程如果被强行终止,并且在终止之前,线程没有调用Socket的close方法,
    那么,线程终止后,Socket是不会被关闭的,socket的相关资源,暂由操作系统来维护。当然,操作系统针对这种情况,操作系统也有相关的策略来回收Socket资源 ,
    比如超时未发送、接收,自动断开Socket并回收相应资源。以上都为个人理解。如有不对,请指正。
      

  5.   

    我有试过当出现异常的时候
    sct.close();
    sct=null;
    sct=new Socket();//重新连接
    不过还是不行,我有上BAIDU查,有一个说法是说当调用sct.close()的时候,底沉的连接并未断开。这问题困扰很久了,纠结啊。
      

  6.   


    BAIDU说的也不一定准Socket连接不是应该要把IP地址和端口号写上才能连吗,那么就算底层的连接并未断开也不要紧,反正服务端的ServerSocket必须accept之后才能保证新的Socket起作用,所以只要服务端的Socket能够正常关闭,客户端原先的Socket自然而然会关闭,感觉应该是这样吧
      

  7.   


    我今天自己测试了下,在连接断开的时候,客户端重新连接,如果用以下方法会提示
    java.net.SocketException: Socket closed
    1   try{
    2   if(clientSocket!=null)
    3    clientSocket.close();
    4    clientSocket=new Socket("122.118.11.102",8080);
    5    }catch(Exception e2)
    6    {}
    但如果把2 3 两行注释掉,这没有问题,不知道是什么原因,清楚的说下。
      

  8.   

    光close/new socket不行的,上面的input/outputStream都要close/get才行。