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

时间:2015-04-11 20:19:34

标签: java sockets netbeans serversocket

我正在使用套接字在Java上构建一个简单的客户端/服务器程序。我已经按照几个教程创建了一个简单的客户端/服务器程序,这个程序让我走得很远,但是当我尝试运行我的服务器类时,当我输入某些端口并且什么也不做,或者使用其他一些端口时,它会冻结给我异常“java.net.BindException:Address in in use:JVM_Bind”。

以下是我的服务器类的一些关键部分;

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);
        }
    }
}  

就像我说的那样,我已经按照教程进行了比较,如果我做了什么与他们相比没什么差别,但是我遇到了问题而我的服务器什么也没做,冻结,或者给出了异常。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

java.net.BindException: Address already in use: JVM_Bind
当您尝试使用已经在使用的端口号运行程序时,会发生

,这可能是系统上的其他程序或其他程序实例已经冻结"。

至于冻结,

socket = serverSocket.accept();

将等待客户端与此套接字建立连接。如果没有另一个程序作为客户端运行,那么这个程序将会冻结"等待一个。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

仅当服务器/ tomcat使用同一端口时,才会出现上述错误。

在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)将列出在该端口上运行的进程。第二个(杀死45270)将终止进程,端口将是免费的。重新启动tomcat或使用该端口的任何其他进程后,它将起作用。