可能是tcp协议的问题。在tcp/ip协议中,当一方主动提出关闭后,这时它并不立即释放端口,它还会监听一段时间。因为当另一方发出关闭请求后,主动方要发送确认已告诉另一方已接到关闭请求.若主动关闭的一方关闭后就立即释放发端口,当另一方放送关闭时,主动方就不能发出确认。这时另一方就会以为对方没有受到关闭信息,就会重fa! 这种状态叫做半关闭状态。它有个等待时间。当一方主动提出关闭后就会进入T I M E _ WA I T状态。 具体的状态可以在cmd下,用netstat命令查看。 牢记T C P连接是全双工的。具体的可以看tcp/ip详解一书,它上面对这个问题有很清楚的描述!
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被释放?
不能释放的端口是port,为本机指定的端口
如果不用多线程就不会有你的问题。
clientSocket = new Socket(Server_ip, 8100, localAddress, port);
啊?
冲突就在这里,第二次初始化会出现错误!
至于Socket关闭后仍为Connected状态的问题一会看看
这种状态叫做半关闭状态。它有个等待时间。当一方主动提出关闭后就会进入T I M E _ WA I T状态。
具体的状态可以在cmd下,用netstat命令查看。
牢记T C P连接是全双工的。具体的可以看tcp/ip详解一书,它上面对这个问题有很清楚的描述!
--------------------------------
angelleecash(陈亮) :
是当你一个ServerSocket占用一个端口,再次请求这个端口时会出现的情况
--------------------------------
请问,这个端口是指服务器端的占用得端口吗?
可是我试了,
clientSocket = new Socket(Server_ip, 8100, localAddress, port); //port为自指定端口
如果port在每次循环中都发生变化就一切OK,这说明还是本地端口出现为题。
就会出现这种情况,
虽然说,clientSocket是局部变量,但是当system.gc还未来得及收集垃圾,
端口还是被占用的,所以会出现:java.net.BindException: Address already in use:
小弟没太用过system.gc,能指点否?