java.net.BindException如何清除套接字或导致它的原因?

时间:2013-07-02 22:52:55

标签: java networking stream

我需要一些帮助,我想我遇到了一个与网络相关的简单问题。它还可以通过了解什么不是.close()来帮助我更好地理解这一切是如何工作的。我确信这很简单,但对我来说这一切都很新。这是客户端程序。如果我能解决这个问题,我很可能会附加服务器。感谢

    public class Server {
    public static void main(String[] args) {
        start();
    }

    static int start = 0;

    public static void start() {
        try {
            ServerSocket serverSocket = new ServerSocket(4567);
            Socket socket = serverSocket.accept();
            //1) Take and echo input (In this case a message)
            BufferedReader bf = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String message = bf.readLine();
            System.out.println("Message recieved from Client:" + message);
            //2) Response of client message
            PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
            printWriter.println("Server echoing back the message ' " + message + " ' from Client");
        } catch (IOException e) {
            System.out.println("e " + e);
            System.exit(-1);
        }
        start++;

            clearUp();

        if (start < 5) {
            System.out.println("Closing binds and Restarting" + start);

            start();
        }
    }

    public void clearUp(){
        //How would I clear the stuff that is left bound
          so I can restart via start() and avoid the
          java.net.BindException: Address already in use: JVM_Bind ?
    }

}

如何清除绑定的东西,以便我可以通过start()重新启动并避免java.net.BindException:地址已在使用中:JVM_Bind?

2 个答案:

答案 0 :(得分:3)

问题在于这些问题。

public static void start() {
    try {
        ServerSocket serverSocket = new ServerSocket(4567);
        //tells server to listen on 4567
 ....

if (start < 5) {
        System.out.println("Closing binds and Restarting" + start);

        start();
}

您正在反复调用start,并告诉ServerSocket在同一端口上侦听。

相反,您想要做的是,有一个ServerSocket,由服务器保持监听。然后常规Socket连接到ServerSocket,服务器accepts连接,这将返回一个新的Socket供他们进行通信。您的问题似乎表明这是客户端代码,而传统客户端不应该有ServerSocket,因为它没有侦听某个端口。

你想做的是 服务器:

  1. 在某个端口上创建serversocket。循环。
  2. 等待来自客户端的连接
  3. 接受连接。这将导致为您和客户端创建一个新的套接字以进行通信
  4. 客户:

    1. 连接到服务器套接字
    2. 通过套接字与它交谈。
    3. 如果这没有意义,我可以提供一些代码示例。

      请注意,为了让您的服务器与多个客户端通信,您需要使用线程。

答案 1 :(得分:0)

我不知道你为什么要重新绑定,所以我已经删除了那一点。

你也没有关闭任何插座。

它们是资源,所以你不应该依赖java自己正确地清理它们。

public static void start() {
    ServerSocket serverSocket = null;
    int exitCode = 0;
    try {
        serverSocket = new ServerSocket(4567);
        while(start < 5){
            Socket socket = serverSocket.accept();
            //1) Take and echo input (In this case a message)
            BufferedReader bf = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String message = bf.readLine();
            System.out.println("Message recieved from Client:" + message);
            //2) Response of client message
            PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
            printWriter.println("Server echoing back the message ' " + message + " ' from Client");
            // close resource
            socket.close();
            start++;
        }
    } catch (IOException e) {
        System.out.println("e " + e);
        exitCode = -1;
    } finally {
        if (serverSocket != null){
            try {
                // close server
                serverSocket .close();
            } catch (IOException e) {
                System.out.println("e " + e);
            }
        }
    }
    if (exitCode != 0){
        System.exit(exitCode);
    }
}