Java UDP地址已在使用中?

Java UDP地址已在使用中?,java,networking,udp,Java,Networking,Udp,我在学习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(Unkn

我在学习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)
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)
MulticastServerThread第10行是

public MulticastServerThread() throws IOException {
    super("MulticastServerThread"); // line 10
}
多播服务器第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.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)
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)
看看这些错误,在我看来,这似乎与监听端口有关,我该如何着手解决这个问题


Canvas

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


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

您可以执行以下操作:

使用netstat命令查看哪个应用程序正在使用该端口。
然后使用tasklist和taskkill在该端口终止应用程序。

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

  • 开放式任务管理器
  • 搜索以OpenJDK开头的进程名称
  • 结束/终止进程
  • 现在再次运行您的程序

  • 您不需要重新启动IDE。

    刚刚关闭并重新打开Eclipse,仍然会出现相同的错误:(@Canvas试用您的计算机?如果您没有从教程中更改客户端和服务器之间的任何内容,则不应该是代码错误。我确实更改了端口,仅此而已,但好的,将尝试一下:)我重新编辑了代码,现在可以工作了,我注意到的是,QuoteServerThread不能使用相同的端口,所以我的客户端、服务器和QuoteServer都在端口12345上,这就是导致错误的原因,所以我将QuoteServer改为12345,服务器和客户端改为4446,一切正常:)“一次只能有一台服务器监听给定端口。“如果我在服务器和客户端上创建DatagramSocket,并在同一台机器上运行,这是否说明了您所描述的内容?请参阅已被接受的问题答案;问题是客户端和服务器试图侦听同一端口。不过,在信息被发现之前,这可能是一个有用的评论(而不是答案)。1。当我回答时,没有被接受的答案。2.我的答案仍然有效。有时,用户启动两个seprate tomcat实例,例如,用于不同的应用程序,这可能会导致此问题。因此,netstat是一种快速找到答案的方法。3.有时,用户认为他们关闭了正在运行的实例,只需在实例仍在后台运行时关闭终端即可。所以,如果应用程序是使用终端和IDE启动的,那么接受的答案将不起作用。