【问题标题】:UDP Address already in use?UDP 地址已在使用中?
【发布时间】:2013-02-26 18:06:13
【问题描述】:

我正在关注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);

查看错误,在我看来这与监听端口有关,我该如何解决这个问题?

画布

【问题讨论】:

    标签: java networking udp


    【解决方案1】:

    这可能是因为您已经在运行服务器实例。一次只有一台服务器可以侦听给定端口。检查您是否已经在运行一个实例(如果您使用的是 Eclipse,您应该在命令窗口中看到这一点)并在运行另一个实例之前终止它。

    虽然也有可能没有正确关闭流。如果您正在运行 IDE,重新启动 IDE 应该可以解决问题,尽管有时我不得不重新启动计算机。可能是解决此问题的更好解决方案,但这对我有用。

    【讨论】:

    • 刚刚关闭并重新打开 Eclipse 仍然出现相同的错误 :(
    • @Canvas 试试你的电脑?如果您没有在教程中更改客户端和服务器之间的任何内容,则不应是代码错误。
    • 我确实更改了端口,仅此而已,但是好的,我会尝试一下 :)
    • 我重新编写了代码,它现在可以工作了,我注意到,QuoteServerThread 不能使用相同的端口,所以我的客户端、服务器和 QuoteServer 都在端口 12345 上,这就是导致错误的原因,所以我将我的 QuoteServer 更改为 12345,将服务器和客户端更改为 4446,一切正常 :)
    • "一次只有一个服务器可以监听给定端口。"如果我在我的服务器和客户端上创建一个 DatagramSocket,并在同一台机器上运行,这是否体现了您所描述的内容?
    【解决方案2】:

    您可以执行以下操作:

    使用 netstat coomand 查看哪个应用程序正在使用该端口。 然后使用 tasklist 和 taskkill 杀死该端口的应用程序。

    【讨论】:

    • 查看这个问题已经被接受的答案;问题是客户端和服务器试图监听同一个端口。不过,在发现该信息之前,这可能是一个有用的评论(而不是答案)。
    • 1.当我回答时,没有接受的答案。 2. 我的答案仍然成立。有时用户会为不同的应用程序启动两个单独的 tomcat 实例,这可能会导致此问题。因此 netstat 是一种快速查找的方法。 3. 有时用户认为他们已经关闭了正在运行的实例,只需在实例仍在后台运行时关闭终端即可。如果应用程序是使用终端和通过 IDE 启动的,那么接受的答案将不起作用。
    【解决方案3】:

    可能发生的情况是您在客户端有两条线连接到同一个端口。当您从服务器接收到消息时,客户端机器不知道要重定向消息的哪个线程,因为它们有两个不同的 DatagramSocket 提示指向同一个端口

    【讨论】:

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

      您无需重新启动 IDE。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-05
        • 2016-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        相关资源
        最近更新 更多