UDP地址已被占用?

4

我正在跟随http://docs.oracle.com/javase/tutorial/networking/datagrams/broadcasting.html上的UDP教程。 我已经复制了所有的代码并编译了它,现在如果我先编译客户端,然后再编译服务器,服务器会在控制台打印出这个:

Exception in thread "main" java.net.BindException: Address already in use: Cannot bind
at java.net.PlainDatagramSocketImpl.bind0(Native Method)
at java.net.PlainDatagramSocketImpl.bind(Unknown Source)
at java.net.DatagramSocket.bind(Unknown Source)
at java.net.DatagramSocket.<init>(Unknown Source)
at java.net.DatagramSocket.<init>(Unknown Source)
at java.net.DatagramSocket.<init>(Unknown Source)
at QuoteServerThread.<init>(QuoteServerThread.java:19)
at MulticastServerThread.<init>(MulticastServerThread.java:10)
at MulticastServer.main(MulticastServer.java:3)

QuoteServerThread第19行是

socket = new DatagramSocket(12345);

MulticastServerThread第10行是

public MulticastServerThread() throws IOException {
    super("MulticastServerThread"); // line 10
}

MulticastServer第3行是

public class MulticastServer {
    public static void main(String[] args) throws java.io.IOException {
        new MulticastServerThread().start(); // line 3
    }
}

如果我先启动服务器,然后再启动客户端,客户端会在控制台上打印出以下内容。
Exception in thread "main" java.net.BindException: Address already in use: Cannot bind
at java.net.PlainDatagramSocketImpl.bind0(Native Method)
at java.net.PlainDatagramSocketImpl.bind(Unknown Source)
at java.net.DatagramSocket.bind(Unknown Source)
at java.net.MulticastSocket.<init>(Unknown Source)
at java.net.MulticastSocket.<init>(Unknown Source)
at MulticastClient.main(MulticastClient.java:9)

MulticastClient的第9行是

MulticastSocket socket = new MulticastSocket(12345);

看到这些错误,我认为与监听端口有关,那么我该如何修复呢?

画布

4个回答

5

这可能是因为您已经运行了一个服务器实例。同一端口只能有一个服务器侦听。检查是否已经运行了一个实例(如果您使用的是Eclipse,则应在命令窗口中看到此内容),然后在运行另一个实例之前终止它。

还有可能是某个流没有正确关闭。如果您正在运行一个IDE,重新启动IDE应该可以解决问题,尽管偶尔我不得不重新启动计算机。有可能有更好的解决方案,但这是对我有效的方法。


刚刚关闭并重新打开Eclipse,但仍然出现相同的错误 :( - Canvas
@Canvas 你能试一下你的电脑吗?如果从教程开始到现在你没有更改过客户端和服务器之间的任何东西,那么这不应该是代码错误。 - Kyle
我只改了端口,就这样了,但好的,稍后会试一下 :) - Canvas
2
我重新编写了代码,现在它可以正常工作了。我注意到的是,QuoteServerThread不能使用相同的端口,因此我的客户端、服务器和QuoteServer都在12345端口上,这就导致了错误。所以我将我的QuoteServer更改为12345,服务器和客户端更改为4446,现在一切都正常工作 :) - Canvas
1
"同一时间只有一个服务器可以监听给定的端口。" 如果我在服务器和客户端上创建DatagramSocket,并在同一台机器上运行,这是否说明了您所描述的情况? - Nicholas Miller

0
可能发生的情况是客户端有两个连接到同一端口的电线。当您从服务器接收到消息时,客户端机器由于有两个不同的DatagramSocket指向同一端口,不知道要将消息重定向到哪个线程。

0
你可以做以下操作: 使用netstat命令查看哪个应用程序正在使用该端口,然后使用tasklist和taskkill来结束该端口上的应用程序。

请查看此问题已经接受的答案;问题在于客户端和服务器尝试监听相同的端口。虽然在发现这些信息之前,这可能是一个有用的评论(而不是答案)。 - Andrew Barber
  1. 当我回答时,没有被接受的答案。
  2. 我的答案仍然适用。有时用户会为不同的应用程序启动两个独立的Tomcat实例,这可能会导致此问题。因此,netstat是一种快速查找的方法。
  3. 有时用户认为通过简单关闭终端来关闭正在运行的实例,而实例仍在后台运行。因此,如果应用程序是通过终端和IDE启动的,则接受的答案将无效。
- Dinesh Arora

0
  1. 打开任务管理器
  2. 搜索以OpenJDK开头的进程名称。
  3. 结束/终止该进程。
  4. 现在再次运行您的程序。

您无需重新启动IDE。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接