首页 > 解决方案 > 有没有办法在用 Java 关闭客户端连接后重用它的端口?

问题描述

我想在我的代码中实现一点重启功能。用户应该能够使用相同的端口重新启动 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.

标签: javasocketsnullpointerexceptionport

解决方案


“BindException: Address already in use”的一个可能原因是操作系统在应用程序停止后将端口保留一段时间,以防仍有未完成的连接向其发送数据包。您可以通过在套接字上启用“地址重用”来解决这个问题:

serverSocket = new ServerSocket();
serverSocket.setReuseAddress(true);
serverSocket.bind(new InetSocketAddress(4442);

NullPointerException 是由竞争条件引起的:第二个线程试图在客户端连接被接受之前关闭它。问题中的代码不可能工作,所以我猜这不是你的真实代码。


推荐阅读