【发布时间】:2012-08-25 18:12:28
【问题描述】:
我正在使用 Java 进行客户端-服务器模拟,其中客户端(线程)连接到服务器以获取一些数据。几秒钟后,需要杀死随机选择的客户端(线程)之一。我关闭了它用于与服务器通信的套接字并让他死了(通过退出 run() 方法)。问题是当新创建的线程试图创建与以前使用的相同的套接字(相同的地址和相同的端口)连接到服务器时,我得到:
java.net.BindException: Address already in use
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:374)
at java.net.Socket.bind(Socket.java:627)
at java.net.Socket.<init>(Socket.java:423)
at java.net.Socket.<init>(Socket.java:319)
创建socket的代码:
private void createNewSocket(InetAddress sIP, int sPort,
InetAddress cIP, int cPort) {
try {
socket = new Socket(sIP, sPort, cIP, cPort);
} catch (IOException e) {
e.printStackTrace();
System.err.println("Socket unsuccessfully created");
}
try {
in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream())), true);
} catch (IOException e) {
e.printStackTrace();
try {
socket.close();
} catch (IOException e2) {
System.err.println("Socket unsuccessfully closed");
}
}
}
public void run() {
createNewSocket(gprsServerIP, Util.PORT_SERVER_PORT,
clientIP, sendPort);
out.println(REQUEST);
try {
serverPort = Integer.parseInt(in.readLine());
TCPClient.serverPort[clientID] = serverPort;
System.out.println("Server port: " + serverPort + '\n' +
"Send port: " + sendPort + '\n');
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
System.err.println("Socket unsuccessfully closed");
}
}
while (true) {
if (clientID == TCPClient.selectedID) {
TCPClient.selectedID = -1;
createNewSocket(gprsServerIP, Util.PORT_SERVER_PORT,
clientIP, sendPort);
out.println(FREE_PORT + serverPort);
try {
socket.close();
} catch (IOException e2) {
System.err.println("Socket unsuccessfully closed");
}
//System.out.println(socket.isClosed());
System.out.println("Port:" + serverPort + " is free");
TCPClient.id[clientID] = -1;
break;
}
}
clientCount--;
}
【问题讨论】:
-
连接时不必指定客户端 ip 和客户端端口。如果省略它们,它将选择一个可用端口
-
你能发布你的
run()方法的代码吗? -
我需要使用它们,因为客户端在 Ubuntu 中的 VM 和 Windows 7 中的服务器上运行,我需要指定客户端端口和 IP 用于其他目的。
-
“其他用途”例如?
-
可能你的程序异常关闭,Socket 仍然绑定在进程上。操作系统将在几分钟后启动该进程。你可以通过 ServerSocket.setReuseAddress(true) 避免这种情况
标签: java multithreading sockets networking tcp-ip