在 Java 中关闭客户端连接后,有没有办法重用它的端口?
Is there a way to reuse the Port of a Clientconnection after closing it in Java?
我想在我的代码中实现一点重启功能。
用户应该能够使用相同的端口重新启动 ClientConnection。
我的主要 class 使用端口 4442 打开一个新的 ClientConnection,我稍后想关闭连接(我试图关闭 Socket 和 Serversocket)然后创建 [=19 的新实例=].
我现在有两个问题:
首先抛出端口绑定异常和 Nullpointerexception。
ServerSocket serverSocket;
Socket clientsocket;
@Override
public void run() {
try {
serverSocket = new ServerSocket(4442);
System.out.println("Server is running");
clientsocket = serverSocket.accept();
PrintWriter out =
new PrintWriter(clientsocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(clientsocket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Server server = new Server();
new Thread(server).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
server.clientsocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
new Thread(new Server()).start();
}
}
Exception in thread "Thread-2" java.lang.NullPointerException
at Server.run(Server.java:40)
at java.base/java.lang.Thread.run(Thread.java:832)
Server is running
java.net.BindException: Address already in use: bind
at java.base/sun.nio.ch.Net.bind0(Native Method)
Am I overseeing something obvious or is it not possible to reuse the same port.
I've read some posts about the close-Method in another Thread.
This line: server.clientsocket.close(); is throwing a nullpointer exception too and i don't know why.
“BindException:地址已在使用”的可能原因是操作系统在应用程序停止后将端口保留一段时间,以防仍有未完成的连接向其发送数据包。您可以通过在套接字上启用“地址重用”来解决这个问题:
serverSocket = new ServerSocket();
serverSocket.setReuseAddress(true);
serverSocket.bind(new InetSocketAddress(4442);
NullPointerException 是由竞争条件引起的:第二个线程试图在客户端连接被接受之前关闭它。问题中的代码无法运行,所以我猜这不是您的真实代码。
我想在我的代码中实现一点重启功能。 用户应该能够使用相同的端口重新启动 ClientConnection。
我的主要 class 使用端口 4442 打开一个新的 ClientConnection,我稍后想关闭连接(我试图关闭 Socket 和 Serversocket)然后创建 [=19 的新实例=].
我现在有两个问题: 首先抛出端口绑定异常和 Nullpointerexception。
ServerSocket serverSocket;
Socket clientsocket;
@Override
public void run() {
try {
serverSocket = new ServerSocket(4442);
System.out.println("Server is running");
clientsocket = serverSocket.accept();
PrintWriter out =
new PrintWriter(clientsocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(clientsocket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Server server = new Server();
new Thread(server).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
server.clientsocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
new Thread(new Server()).start();
}
}
Exception in thread "Thread-2" java.lang.NullPointerException
at Server.run(Server.java:40)
at java.base/java.lang.Thread.run(Thread.java:832)
Server is running
java.net.BindException: Address already in use: bind
at java.base/sun.nio.ch.Net.bind0(Native Method)
Am I overseeing something obvious or is it not possible to reuse the same port.
I've read some posts about the close-Method in another Thread.
This line: server.clientsocket.close(); is throwing a nullpointer exception too and i don't know why.
“BindException:地址已在使用”的可能原因是操作系统在应用程序停止后将端口保留一段时间,以防仍有未完成的连接向其发送数据包。您可以通过在套接字上启用“地址重用”来解决这个问题:
serverSocket = new ServerSocket();
serverSocket.setReuseAddress(true);
serverSocket.bind(new InetSocketAddress(4442);
NullPointerException 是由竞争条件引起的:第二个线程试图在客户端连接被接受之前关闭它。问题中的代码无法运行,所以我猜这不是您的真实代码。