【发布时间】:2020-07-19 16:03:32
【问题描述】:
我想在我的代码中实现一点重启功能。 用户应该能够使用相同的端口重新启动 ClientConnection。
我的主类使用 4442 端口打开一个新的 ClientConnection,稍后我想关闭连接(我试图关闭 Socket 和 Serversocket)然后创建一个新的类实例。
我现在有两个问题: 首先抛出一个端口绑定异常和一个 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$1.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.
【问题讨论】:
-
您的第一个线程启动服务器。它等待连接,该连接可能随时进入(可能需要很长时间)。第二个线程试图关闭,但不等待任何东西;它基本上马上就开始了。它在第一个线程可以以公共方式分配
server变量之前执行,因此 NPE 和服务器没有关闭。然后,您尝试启动另一个Server实例,即使前一个实例由于上述错误而没有关闭。请记住,除非您告诉它们,否则线程不会相互等待。您的代码缺乏线程协调。 -
感谢您的评论。这可以通过在服务器对象上同步来解决吗?还是我需要使用锁/条件。
-
你能澄清一下你想要做什么:“我稍后想关闭连接”——“稍后”是什么意思? “稍后”是什么时候?目前,您正试图在“客户端套接字”存在之前关闭它
-
您需要将第二个线程
wait用于第一个线程notify。第一个线程通知第二个线程后,第二个线程会通知第三个线程开始一个新的连接。但是你真的需要所有这些线程来做你想做的事吗? -
嗯,我想要一个重启选项,但我开始想,那不值得。
标签: java sockets nullpointerexception port