为什么我不能在Java.net上使用任何端口?

时间:2019-05-28 08:17:38

标签: java serversocket

我正在尝试进行在线聊天,但是当我启动代码时,总是得到 java.net.BindException:地址已在使用中(绑定失败)。我尝试过多次更改端口,但始终会遇到相同的异常。有时代码仍然可以执行,并且一切正常,但是异常仍然是我的问题。我知道有些问题与我的类似,但只有Windows用户可以使用,我是Mac用户。这是代码(尚未完全完成,错误发生在服务器部分@ new ServerSocket();上)

public Server(Client c) {

    try {
        ServerSocket serverSocket = new ServerSocket(65531);
        while (true) {
            Socket s = serverSocket.accept();
            new Thread() {
                @Override
                public void run() {
                    super.run();

                    try {
                        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(s.getInputStream()));
                        String message = bufferedReader.readLine();
                        System.out.println("Antwort vom Client: " + message);
                        c.receivedMessage(message);
                        System.out.println("Adresse: "+s.getInetAddress().toString());
                        System.out.println(s.getInetAddress().getHostAddress());
                        s.close();
                    } catch (Exception e) {

                    }
                }
            }.run();


        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

编辑:

我在应用程序运行之前和之后检查了端口,并且仅在运行时使用了端口,因此服务器套接字可以正常工作,但是我仍然遇到异常

2 个答案:

答案 0 :(得分:1)

异常 java.net.BindException: Address already in use 试图告诉您Java应用程序正在尝试在特定端口上进行连接,但是该端口已被其他进程使用,并且JVM绑定到该特定端口端口。

您需要找出哪个进程已经在使用该端口并杀死它,然后再尝试连接到套接字。这样可以做到:

以cmd(以管理员身份)输入以下内容:

netstat -ano | findstr :<yourPortNumber>

然后在标识PID后执行以下命令:

taskkill /PID <typeyourPIDhere> /F

再次运行第一个命令,以确保该过程已成功终止。如果先前的操作成功,您将得到一个空行。

了解更多:https://javarevisited.blogspot.com/2011/12/address-already-use-jvm-bind-exception.html#ixzz5pCppM2qn

编辑:以下是在Mac上终止该进程的方法:

netstat -vanp tcp | grep <port number>

如果您使用的是 macOS El Capitan Centos 7 ,请参阅此answer

答案 1 :(得分:0)

由于先前的程序运行,该端口很可能仍在使用中,并且未正确关闭套接字。因此,在发生错误或运行不完整之后,套接字仍然是打开的,因此使用了端口。

也许您想阅读有关try-with-resource的信息,或者添加一个finally来确保套接字创建成功就可以关闭它。

确保关闭所有正在运行的Java进程和/或只需重新启动PC即可释放端口。然后编辑代码以正确关闭端口,然后重试。