【问题标题】:Bind error even with setReuseAddress(true) [duplicate]即使使用 setReuseAddress(true) 也绑定错误 [重复]
【发布时间】:2017-03-14 12:51:17
【问题描述】:

也许我误解了这段代码的使用,但据我了解,调用 setReuseAddress(true) 将允许使用该端口,即使计算机仍然认为它正在使用中。

场景:我有以下代码。当它崩溃时,它不会关闭端口,因此它会在下次启动时引发绑定错误。我曾使用 setReuseAddress(true) 尝试强制它打开端口,但它会引发相同的错误。如果这是正确的代码,我该如何使用它?如果是错误的代码,什么会允许这种行为?

import java.io.IOException;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

public class ServerPsswd {

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


        ServerSocket listener = new ServerSocket();
        listener.setReuseAddress(true);
        listener.bind(new InetSocketAddress(9090));
        try {
            while (true) {
                Socket socket = listener.accept();
                try {
                    PrintWriter out =
                        new PrintWriter(socket.getOutputStream(), true);
                    out.println("tada!");
                    out.println("yays");
                } finally {
                    socket.close();
                }
            }
        }
        finally {
            listener.close();
        }
    }
}

【问题讨论】:

  • 啊,问题实际上可能是我无意中运行了它的 2 个实例

标签: java sockets


【解决方案1】:

https://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#setReuseAddress(boolean)

是在当前连接关闭后的超时时间内允许连接

【讨论】:

  • 好的,所以当端口根本没有关闭时,这对程序崩溃没有帮助。有标准的处理方法吗?
  • 它专为高容量端口设计,每次连接都需要几毫秒/微秒
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 2018-04-13
  • 2020-11-28
相关资源
最近更新 更多