ServerSocket 端口问题(java.net.BindException:地址已被使用:JVM_Bind)

ServerSocket port issue (java.net.BindException: Address already in use: JVM_Bind)

我正在 Java 上使用套接字构建一个简单的客户端/服务器程序。我已经按照几个教程创建了一个简单的客户端/服务器程序,这让我走到了这一步,但是当我尝试 运行 我的服务器 class 时,它要么在我输入某些端口时冻结,要么什么都没有,或者对于其他一些端口,它给了我例外 "java.net.BindException: Address already in use: JVM_Bind"。

这是我的服务器的一些关键部分 class;

public void start() throws IOException {
    isRunning = true;
    serverSocket = new ServerSocket(getPort());
    while (isRunning) {
        try {
            clientConnection();
            setupStreams();
        } catch (IOException ex) {
            addOutput("Connection unsuccessful.");
            System.out.println(ex);
            System.exit(1);
        }
    }
}

private void clientConnection() throws IOException {
    addOutput("Listening for client...");
    socket = serverSocket.accept();
    addOutput("Connection successful."); // print out username which connected
}

private void setupStreams() throws IOException {
    serverIn = new ObjectInputStream(socket.getInputStream());
    serverOut = new ObjectOutputStream(socket.getOutputStream());
}

private void btnConnectActionPerformed(ActionEvent evt) {                                           
    if (evt.getSource() == this.btnConnect) {
        try {
            start();
        } catch (IOException ex) {
            System.out.println(ex);
        }
    }
}  

就像我说的,我已经按照教程学习了,我所做的与他们所做的相比并没有太大区别,但是我遇到了问题,我的服务器只是什么都不做并冻结,或者给出异常。

有什么想法吗?

java.net.BindException: Address already in use: JVM_Bind

当您尝试 运行 您的程序使用已被系统上的其他程序或另一个程序实例使用的端口号 "freezed".

至于冻结,

socket = serverSocket.accept();

将等到客户端与此套接字建立连接。如果没有另一个程序 运行ning 作为客户端,这个程序将 "freeze" 等待一个。

我稍微修改了我的代码,似乎解决了这个问题。主要修复是在构造函数中设置服务器,这似乎已经修复了它。虽然,我仍然不明白为什么我以前的做法不起作用。但是,它现在有效了。

只有当 server/tomcat 使用相同的端口时才会出现上述错误。

On Mac 请使用以下命令:

I514W:~ skumar$ lsof -i :8082
COMMAND   PID     USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
java    45270 skumar47  411u  IPv6 0x34323c1bdd54744d      0t0  TCP *:us-cli 
(LISTEN)

I514W:~ skumar$ kill 45270

第一个 (lsof -i :8082) 将列出该端口上的进程 运行。第二个(kill 45270)将终止进程并且端口将空闲。重新启动 tomcat 或使用该端口的任何其他进程后,它将正常工作。