java - 绑定(bind)异常 : Address already in use even with unique port

标签 java linux eclipse sockets port

我昨天问过这个问题,但没有人能弄清楚我遇到的问题。所以我希望提供一个更新的代码,加上昨天的建议。基本上,我一直在尝试在服务器和客户端之间建立连接,但是每当我执行服务器然后执行客户端时,我都会得到这个异常:Address already in use。显而易见的答案是给它一个新的端口,但即使这样我仍然会收到这个错误。我假设它与我的代码某处出错有关。有人能发现吗?我附上了服务器类和客户端类。

这是我得到的错误:

Exception in thread "main" java.net.BindException: Address already in use
    at java.net.PlainSocketImpl.socketBind(Native Method)
    at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:376)
    at java.net.ServerSocket.bind(ServerSocket.java:376)
    at java.net.ServerSocket.<init>(ServerSocket.java:237)
    at java.net.ServerSocket.<init>(ServerSocket.java:128)
    at MessageServer.main(MessageServer.java:16)

服务器代码:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;

public class MessageServer {

    public static void main(String[] args) throws IOException {
        try {
            int port = 53705;

            ServerSocket server = new ServerSocket(port);

            while (true) {
                System.out.println("Waiting for client...");
                //server.setReuseAddress(true);
                Socket client = server.accept();

                System.out.println("Client from " + server.getInetAddress() + " connected.");
                BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                String inputLine = in.readLine();
                System.out.println("Client said: '"+inputLine+"'");
                Writer count = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
                byte c [] = count.toString().getBytes();
                count.flush();
                count.close();
                in.close();
            } 
        } catch (IOException e) {
            System.err.println(e);
        }
    }
}

客户端代码:

import java.net.*;
import java.io.*;

public class MessageSendClient {

    public static void man(String args[]) throws IOException {
        String servername = "localhost";
        int port = 53705;
        Socket server;
        //server.setReuseAddress(true);
        try {
            server = new Socket (servername,port);

            System.out.println("Connected to " + server.getInetAddress());
            DataInputStream in = new DataInputStream(new BufferedInputStream(server.getInputStream()));

            server.close();
            byte c[] = new byte[100];
            int num = in.read(c);
            String count = new String(c);

            System.out.println("Server said: " + count);

        } catch (Exception e) { }
    }
}

最佳答案

当服务器程序试图在端口 53705 上打开套接字进行监听时,您会遇到错误。 Address already in use 消息意味着,您机器上的另一个进程已经在使用端口 53705。可能是某个守护进程偶然打开了同一个端口,或者您的 Web 浏览器打开了这个端口端口,并且仍在使用它。

不过,最有可能的是您有另一个服务器程序实例在后台某处运行。检查所有终端窗口,或检查 IDE 中包含正在运行的程序状态的选项卡。

顺便说一下,“唯一端口”有点误导,因为端口 53705 在任何方面都不是“唯一”的,它恰好是您(或某人)选择的端口号,您希望 尚未使用。要获得真正唯一的端口,请使用 new ServerSocket(0),它会要求系统分配一个未使用的端口。要找出分配了哪个端口,请使用 serverSocket.getLocalPort()。您可以将其打印出来,然后将其作为命令行选项传递给客户端程序。

关于java - 绑定(bind)异常 : Address already in use even with unique port,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23329580/

相关文章:

java - ''Launch MainActivity' ' 代码阻止文本显示

java - double 移动小数点

c# - 您应该在 Java/C# 中使用国际标识符吗?

java - AIDE 应用程序的问题

python - 如何获取网络上文件的真实 URL。 (Python)

java - 使用 intelliJ IDEA 或 eclipse 替换/更新所有文件中的所有导入语句

android - Eclipse:新更新后 xml 图形布局错误

java - 将对象上传到 Google Cloud Storage

c++ - C 代码在 Windows 中编译,在 Linux 上给出编译错误

linux - Docker 无效标签值