线程“main”java.net.BindException中的绑定服务器套接字异常:地址已在使用:JVM_Bind java [重复]

Posted

技术标签:

【中文标题】线程“main”java.net.BindException中的绑定服务器套接字异常:地址已在使用:JVM_Bind java [重复]【英文标题】:Binding server socket Exception in thread "main" java.net.BindException: Address already in use: JVM_Bind java [duplicate] 【发布时间】:2018-04-17 09:20:03 【问题描述】:

我正在尝试创建一个 Java 程序来从客户端向服务器发送消息并使用套接字编程接收响应,但它出现了这个错误:

线程“main”java.net.BindException 中的异常:地址已在使用中:JVM_Bind 在 java.net.DualStackPlainSocketImpl.bind0(本机方法) 在 java.net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:106) 在 java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387) 在 java.net.PlainSocketImpl.bind(PlainSocketImpl.java:190) 在 java.net.ServerSocket.bind(ServerSocket.java:375) 在 java.net.ServerSocket.(ServerSocket.java:237) 在 java.net.ServerSocket.(ServerSocket.java:128) 在 Bob.main(Bob.java:9)

客户端:

public static void main(String[] args) throws IOException 

    InetAddress addr = InetAddress.getByName("127.0.0.1") ; //set the address of the server to be connected to. Any IP address can be set here as a string
    //If the name is saved in your "etc/hosts" file, then the name can be used instead of the ip address
    //Alternative method: InetAddress.getByAddress -see "***" explanation if interested

    System.out.println("addr = " + addr);

    Socket socket = new Socket(addr, 8080); //attempt to connect to the server by creating a socket using the IP address and Port number of the server

    try 
        System.out.println("socket = " + socket);
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //create an input variable for the socket- accepts input from the socket

        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true); // create an output variable for the socket- writes output to the socket

        //this loop simply writes to the socket 10 times waits for a reply from the socket and then prints the reply received
        for(int i = 0; i < 10; i ++) 
            out.println("I am it: " + i); //write to socket
            String str = in.readLine(); //read from socket
            System.out.println(str);    //print to console line read from socket
        

        out.println("END"); //send string that indicates end of transmission

    catch( SocketException e ) 
        System.out.println("Server closed connection");
    finally
        System.out.println("closing...");
        socket.close(); //close the connection
    

服务器端:

    public static final int PORT = 8080;
    public static void main(String[] args) throws IOException 

    ServerSocket s = new ServerSocket(PORT); //create server socket object
    System.out.println("Started: " + s);

    try 
        Socket socket = s.accept(); //accept a socket connection using the Server Socket created previously
        try 
            System.out.println("Connection accepted: "+ socket);

            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //create an input variable for the socket- accepts input from the socket

            PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);   // create an output variable for the socket- writes output to the socket


            //this loop accepts input from the socket, prints out what it receives anc echoes it back into the socket until it recives the word "END" indicating the end of transmission
            while (true) 
                String str = in.readLine(); //read line from socket
                if (str.equals("END")) break;
                System.out.println("Echoing: " + str);  //print line to console
                out.println("You said: " + str); //echo line read back into socket
            


        catch ( SocketException  e ) 
            System.out.println("Client closed connection");
        finally               //close the present connection
            System.out.println("closing...");
            socket.close();
        

    catch( SocketException e )
        System.out.println("Server socket closed unexpectedly");
    finally               //close the server socket. i.e. stop listening for connections
        s.close();          //without this line, the server would continue waiting for another connection
    

【问题讨论】:

你是在同一台机器上运行它吗?客户端和服务器部分使用相同的端口。 是的,我在同一台机器上运行它 这与连接客户端无关。它发生在您运行服务器时。 SocketException 并不意味着“客户端关闭连接”,并且您没有检查流的结束,确实如此。 【参考方案1】:

java.net.BindException 表示您正在尝试绑定到已占用的端口。

您的服务器有两个实例正在运行,或者其他一些程序已经在使用端口 8080。

【讨论】:

将端口更改为 5050,但仍然给我同样的错误 您在运行两个实例吗?在启动新服务器之前杀死旧服务器。 我只有一台服务器在运行 另外,请查看链接问题:***.com/questions/12737293/… 已修复,谢谢 :)

以上是关于线程“main”java.net.BindException中的绑定服务器套接字异常:地址已在使用:JVM_Bind java [重复]的主要内容,如果未能解决你的问题,请参考以下文章

review33

多线程

为啥 Main 函数上的 Sleep() 会停止所有线程?

android中怎样让main线程和子线程同步一个变量

pthread_exit在main线程中的用处

RunLoop在main线程和自己创建的线程如何启动