gpt4 book ai didi

java - 如何避免 java.net.BindException : Address already in use

转载 作者:可可西里 更新时间:2023-11-01 02:34:53 25 4
gpt4 key购买 nike

以下运行了 1 小时然后关闭:

public class Mp extends JWindow implements MouseListener, MouseMotionListener {
public static Mp j;
private int serverPort = 0;
private ServerSocket serverSock = null;
private Socket sock = null;

public static void main(final String[] args) throws IOException, InterruptedException, Exception {
j = new Mp();
j.setVisible(true);
j.waitForConnections();
}

public void waitForConnections() {
while (true) {
try {
sock = serverSock.accept();
System.out.println("[TCPMediaHandler]: Accepted new socket");
TCPMediaHandler handler = new TCPMediaHandler(sock);
handler.start();
} catch (IOException e) {
e.printStackTrace(System.err);
}
}
}

public Mp() throws IOException {
this.serverPort = 38891;
serverSock = new ServerSocket(serverPort);
serverSock.setReuseAddress(true);
//serverSock.setSoTimeout(500);
//serverSock.setSoLinger(true, 0);
System.out.println("[TCPMediaHandler]: Server started");
this.v1.setBackground(Color.BLACK);
this.v1.addMouseListener(this);
/* Close the window */
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
System.exit(0);
}
});
}

当我重新运行相同的程序时,它失败并显示 java.net.BindException:

$ java -cp /var/tmp/dist/Mp.jar test.Mp
Exception in thread "main" java.net.BindException: Address already in use
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:353)
at java.net.ServerSocket.bind(ServerSocket.java:336)
at java.net.ServerSocket.<init>(ServerSocket.java:202)
at java.net.ServerSocket.<init>(ServerSocket.java:114)
at test.Mp.<init>(Mp.java)
at test.Mp.main(Mp.java)

大概需要3到4分钟,才会再次执行成功。如何让它关机后立即工作?

跟进:

$ netstat | grep 38891
tcp 35 0 localhost:38891 localhost:37842 CLOSE_WAIT
tcp 0 0 localhost:34955 localhost:38891 ESTABLISHED
tcp 32 0 localhost:38891 localhost:37824 CLOSE_WAIT
tcp 0 0 localhost:38891 localhost:34955 ESTABLISHED

$ lsof -w -n -i tcp:38891
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
xdg-scree 5254 sun 29u IPv4 231948 0t0 TCP *:38891 (LISTEN)
xdg-scree 5355 sun 29u IPv4 231948 0t0 TCP *:38891 (LISTEN)
xdg-scree 5455 sun 29u IPv4 231948 0t0 TCP *:38891 (LISTEN)
telnet 7058 sun 3u IPv4 242987 0t0 TCP 127.0.0.1:34955->127.0.0.1:38891 (ESTABLISHED)
sleep 9002 sun 29u IPv4 231948 0t0 TCP *:38891 (LISTEN)
sleep 9005 sun 29u IPv4 231948 0t0 TCP *:38891 (LISTEN)
sleep 9008 sun 29u IPv4 231948 0t0 TCP *:38891 (LISTEN)

最佳答案

你会看到你的 setReuseAddress(true) 被调用得太晚了,即在绑定(bind)抛出异常之后。

您可以通过三个步骤创建一个未绑定(bind)的 ServerSocket,使其可重用,然后绑定(bind)它。

ServerSocket ss = new ServerSocket();
ss.setReuseAddress(true);
ss.bind(new InetSocketAddress(12345));

关于java - 如何避免 java.net.BindException : Address already in use,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9762859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com