简体   繁体   English

BindException:地址已被使用

[英]BindException: Address already in use

I am trying my hands on socket programming in Java. To get things roll, I tried a very simple server and client code snippet as below我正在 Java 尝试进行套接字编程。为了让事情顺利进行,我尝试了一个非常简单的服务器和客户端代码片段,如下所示

public class Server {

    //initialize socket and input stream
    private Socket socket = null;
    private ServerSocket server = null;
    private DataInputStream in = null;

    public Server(int port) {
        // starts server and waits for a connection
        while (true) {
            try{
                server = new ServerSocket(port);
                System.out.println("Server started");
                System.out.println("Waiting for a client ...");
                socket = server.accept();
                System.out.println("Client accepted");
                // takes input from the client socket
                in = new DataInputStream(
                        new BufferedInputStream(socket.getInputStream()));
                String line = "";
                // reads message from client until "Over" is sent
                while (!line.equals("Over"))
                {
                    try
                    {
                        line = in.readUTF();
                        System.out.println(line);
                    }
                    catch(IOException i)
                    {
                        System.out.println(i);
                    }
                }
                System.out.println("Closing connection");
                // close connection
                socket.shutdownInput();
                socket.shutdownOutput();
                socket.close();
                in.close();
            }
            catch(IOException i){
                System.out.println(i);
            }
        }
    }

    public static void main(String args[]) {
        new Server(5000);
    }
}

Client.java looks like below Client.java 如下所示

public class Client {

    // initialize socket and input output streams
    private Socket socket = null;
    private DataInputStream input = null;
    private DataOutputStream out = null;
    // constructor to put ip address and port
    public Client(String address, int port)
    {
        // establish a connection
        try
        {
            socket = new Socket(address, port);
            System.out.println("Connected");
            // takes input from terminal
            input = new DataInputStream(System.in);
            // sends output to the socket
            out = new DataOutputStream(socket.getOutputStream());
        }
        catch(UnknownHostException u)
        {
            System.out.println(u);
        }
        catch(IOException i)
        {
            System.out.println(i);
        }// string to read message from input
        String line = "";
        // keep reading until "Over" is input
        while (!line.equals("Over"))
        {
            try
            {
                line = input.readLine();
                out.writeUTF(line);
            }
            catch(IOException i)
            {
                System.out.println(i);
            }
        }
        // close the connection
        try
        {
            input.close();
            out.close();
            socket.close();
        }
        catch(IOException i)
        {
            System.out.println(i);
        }
    }
    public static void main(String args[]) {
        Client client = new Client("127.0.0.1", 5000);
    }
}

It works fine for the first connection with the client.它适用于与客户端的第一次连接。 As soon as the client sends Over server starts giving exception java.net.BindException: Address already in use .一旦客户端发送Over服务器开始给出异常java.net.BindException: Address already in use

Even if I am closing the socket, why the port is in use?即使我正在关闭套接字,为什么端口正在使用中?

The following lines of code is trying to create ServerSocket again (in fact, infinite number of times) on the port, 5000 and that is why you are getting the error.以下几行代码试图在端口5000上再次创建ServerSocket (实际上是无数次),这就是您收到错误的原因。

while (true) {
    try{
        server = new ServerSocket(port);

Do it as follows:做如下:

try{    
    server = new ServerSocket(port);    
}catch(IOException i){    
    System.out.println(i);
}   
while (true) {
    try{

Take Server out of while loop and some more code changes将服务器从 while 循环中取出并更改更多代码

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {


    //initialize socket and input stream
    private Socket socket = null;
    private ServerSocket server = null;
    private DataInputStream in = null;

    public Server(int port) throws IOException {
        // starts server and waits for a connection
        server = new ServerSocket(port);
        while (true) {
            try{

                System.out.println("Server started");
                System.out.println("Waiting for a client ...");
                socket = server.accept();
                System.out.println("Client accepted");
                // takes input from the client socket
                in = new DataInputStream(
                        new BufferedInputStream(socket.getInputStream()));
                String line = "";
                // reads message from client until "Over" is sent
                while (!line.equals("Over"))
                {
                    try
                    {
                        line = in.readUTF();
                        System.out.println(line);
                    }
                    catch(IOException i)
                    {
                        System.out.println(i);
                    }
                }
                System.out.println("Closing connection");
                // close connection
                socket.close();
                in.close();
            }
            catch(IOException i){
                System.out.println(i);
            }
        }
    }

    public static void main(String args[]) throws IOException {
        new Server(5000);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM