初始化了一个Socket,它占用了一个端口,现在用Socket.close,结果Socket的状态怎么还是连接的?(用的是Socket.isConnected判断),现在希望传输完成后,能关闭Socket,并及时释放被占用的端口,释放端口是关键,请问各位高手,该如何做,小弟试来试去都没有成功,尽管Socket已经close了,可是端口还是被占着。

解决方案 »

  1.   

    把Socket写成一个线程,然后关闭线程.突然想出来的不对,别怪我.
      

  2.   

    public void run() {
                Socket clientSocket;
                ObjectOutputStream o_toServer;
                ObjectInputStream o_fromServer;
                for (int iip = 1; ; iip++) {
                    vecvec receive_ip = new vecvec();  //vecvec为自定义类型
                    try {
                        data.check = "";  //data为自定义要发送的类的实例化
                        data.message = "";
                        clientSocket = new Socket(Server_ip, 8100, localAddress, port); //port为自指定端口
                        o_toServer = new ObjectOutputStream(clientSocket.getOutputStream());
                        o_toServer.writeObject(data);
                        o_fromServer = new ObjectInputStream(clientSocket.getInputStream());
                        receive_ip = (vecvec) o_fromServer.readObject();
                        o_toServer.close();
                        o_fromServer.close();
                        clientSocket.close();
                        System.out.println("clientSocket.isClosed: " + clientSocket.isClosed() + "  clientSocket.isConnected: " +clientSocket.isConnected());  //clientSocket.isConnected的返回结果为什么是true
                        while (true) {
                            try {
                                sleep(3000);
                            } catch (InterruptedException er) {
                                System.out.println("等待异常" + er);
                            }
                            clientSocket = null;
                            System.out.println("clientSocket's status: " + clientSocket);
                            break;
                        }
                    } catch (InvalidClassException es) {
                        System.out.println("客户类异常!" + "." + es);
                    } catch (NotSerializableException es) {
                        System.out.println("客户类没有串行化!" + "." + es);
                    } catch (IOException es) {
                        System.out.println("不能写到服务器!" + "." + es);
                        return;
                    } catch (ClassNotFoundException ees) {
                        System.out.println("readObject()异常" + ees);
                    }
                    try {
                        sleep(10000);
                    } catch (InterruptedException er) {
                        System.out.println("载入线程异常" + er);
                    }
                }
            }
    //----------------------------------------------------------------------------------
    每当循环到第二次或第三次时,就出现错误“java.net.BindException: Address already in use: connect”,出现端口被占用的现象,请问各位高手,为什么出现端口被占用,有时是在第二次,而有时是在第三次,为什么Socket占用的端口不能通过close方法或赋null被释放?
      

  3.   

    clientSocket = new Socket(Server_ip, 8100, localAddress, port); 
    不能释放的端口是port,为本机指定的端口
      

  4.   

    多线程当然会这样,每次new的时候判断一下,如果端口还开着就睡一会再try。
    如果不用多线程就不会有你的问题。
      

  5.   

    可是错误发生在
    clientSocket = new Socket(Server_ip, 8100, localAddress, port); 
    啊?
      

  6.   

    有啊,port用于指定本地端口,
    冲突就在这里,第二次初始化会出现错误!
      

  7.   

    难道是没有及时把端口释放掉.楼主可以看看 clientSocket是否还有其他方法去处理这个问题.
      

  8.   

    你的应该是类似的客户端的代码,bindException应该是服务器端的代码抛出来的,是当你一个ServerSocket占用一个端口,再次请求这个端口时会出现的情况
    至于Socket关闭后仍为Connected状态的问题一会看看
      

  9.   

    可能是tcp协议的问题。在tcp/ip协议中,当一方主动提出关闭后,这时它并不立即释放端口,它还会监听一段时间。因为当另一方发出关闭请求后,主动方要发送确认已告诉另一方已接到关闭请求.若主动关闭的一方关闭后就立即释放发端口,当另一方放送关闭时,主动方就不能发出确认。这时另一方就会以为对方没有受到关闭信息,就会重fa!
     这种状态叫做半关闭状态。它有个等待时间。当一方主动提出关闭后就会进入T I M E _ WA I T状态。
      具体的状态可以在cmd下,用netstat命令查看。
      牢记T C P连接是全双工的。具体的可以看tcp/ip详解一书,它上面对这个问题有很清楚的描述!
      

  10.   

    那么在服务器端关闭ServerSocket能否解决问题呢?
    --------------------------------
    angelleecash(陈亮) :
    是当你一个ServerSocket占用一个端口,再次请求这个端口时会出现的情况
    --------------------------------
    请问,这个端口是指服务器端的占用得端口吗?
    可是我试了,
    clientSocket = new Socket(Server_ip, 8100, localAddress, port); //port为自指定端口
    如果port在每次循环中都发生变化就一切OK,这说明还是本地端口出现为题。
      

  11.   

    每次循环的时候,在同一个端口建立socket,
    就会出现这种情况,
    虽然说,clientSocket是局部变量,但是当system.gc还未来得及收集垃圾,
    端口还是被占用的,所以会出现:java.net.BindException: Address already in use:
      

  12.   

    那请问各位,有没有能解决这个问题,实现目标的方法呢?
    小弟没太用过system.gc,能指点否?