【问题标题】:java.net.BindException How can I clear the sockets or what ever is causing it?java.net.BindException 如何清除套接字或导致它的原因?
【发布时间】:2013-06-30 12:01:39
【问题描述】:

我需要一些帮助,我想我遇到了一个与网络相关的简单问题。它还将帮助我更好地了解这一切是如何工作的,因为它知道什么不是 .close()'ed。我敢肯定这很简单,但对我来说它都是全新的。这是客户端程序。如果我能解决这个问题,我很可能会附加服务器。谢谢

    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: Address already in use: JVM_Bind ?

【问题讨论】:

  • 您是否打算让start 递归调用自身?
  • 你能发布错误信息吗?
  • 这段代码的结构方式存在几个主要问题。主要问题是您没有关闭服务器套接字。我建议您阅读描述 Java 套接字编程的 许多 教程之一,并应用其中描述的技术。具体来说,您只需要打开一次服务器套接字,并启动一个单独的线程来处理每个连接。

标签: java networking stream


【解决方案1】:

问题就在这几行之内。

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. 接受连接。这将导致为您和客户端创建一个新的套接字以进行通信

客户:

  1. 连接到服务器套接字
  2. 通过套接字与它交谈。

如果这没有意义,我可以给出一些代码示例。

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

【讨论】:

    【解决方案2】:

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

    您也没有关闭任何套接字。

    它们是资源,因此您不应依赖 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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-22
      • 2011-01-08
      • 2019-03-17
      相关资源
      最近更新 更多