java - 多个线程监听一个 UDP 端口?

标签 java multithreading sockets udp

我有一个问题。我有一个客户端程序,用于监听服务器的 UDP 端口。这些服务器发送数据包(每秒一个),其中包含其 TCP 端口。这些端口是识别服务器的方式。当这样的数据包第一次到达时,服务器将存储在一个集中的集合中。如果服务器在 5 秒内未能发送这些数据包,则该服务器被视为离线并从集合中删除。

我想做的是为每个服务器生成一个新线程。这个线程应该只听一台服务器。如果服务器超时,该线程会从集合中删除该服务器并自行终止。

我已经用 ThreadPool 实现了它,但它根本不起作用。到目前为止我发现的是,这可能是由于不同线程的检查,如果一个数据包确实是它应该监听的数据包,传入数据包的顺序完全困惑,导致困惑地删除和添加服务器集合。

是否有可能多个线程可以监听一个 UDP 端口?我怎样才能实现所需的行为?

感谢您的帮助!

编辑

在主线程中:

datagramSocket = new DatagramSocket(udpPort);
datagramSocket.setReuseAddress(true);

以及在新线程中。

java.net.BindException: Address already in use
 [java]     at java.net.PlainDatagramSocketImpl.bind0(Native Method)
 [java]     at java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:95)
 [java]     at java.net.DatagramSocket.bind(DatagramSocket.java:376)
 [java]     at java.net.DatagramSocket.<init>(DatagramSocket.java:231)
 [java]     at java.net.DatagramSocket.<init>(DatagramSocket.java:284)
 [java]     at java.net.DatagramSocket.<init>(DatagramSocket.java:256)
 [java]     at proxy.ServerHandler.<init>(ServerHandler.java:32)
 [java]     at proxy.DatagramSocketListener.run(DatagramSocketListener.java:59)
 [java]     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
 [java]     at java.util.concurrent.FutureTask.run(FutureTask.java:262)
 [java]     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
 [java]     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
 [java]     at java.lang.Thread.run(Thread.java:744)

编辑 2

再次感谢!但是现在在主线程中:

datagramSocket = new DatagramSocket();
datagramSocket.setReuseAddress(true);
datagramSocket.bind(new InetSocketAddress(udpPort));

在新线程中:

datagramSocket = new DatagramSocket();
datagramSocket.setReuseAddress(true);
datagramSocket.connect(server.getAddress(), udpPort);

结果:

 [java] java.net.SocketException: already bound
 [java]     at java.net.DatagramSocket.bind(DatagramSocket.java:360)
 [java]     at proxy.DatagramSocketListener.<init>(DatagramSocketListener.java:33)
 [java]     at proxy.ProxyCli.<init>(ProxyCli.java:74)
 [java]     at proxy.ProxyCli.main(ProxyCli.java:30)

但这是我第一次初始化 DatagramSocket???

最佳答案

在新线程的同一端口上创建一个新套接字。您必须在所有套接字(包括原始套接字)上设置 SO_REUSEADDR 才能实现这一点。然后,将新套接字连接到所需的目标。然后该套接字将只接收来自该目标的数据报。

关于java - 多个线程监听一个 UDP 端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19611918/

相关文章:

java - 如何打印 'while' 的执行次数?

java - 有效地将 Java 字符串转换为表示 C 字符串的以 null 结尾的 byte[]? (ASCII)

java - 如何从使用另一个线程不断追加的文件中读取数据?

java - 连接到局域网

java - 如何在 Tab 键时选择 JTextField 中的文本

java - Spring Integration Bridge 注解配置导致 BeanCurrentlyInCreationException

c - while 循环中的套接字和连接调用

node.js - 多个监听器和removeListener删除所有Socket.io

multithreading - 如何在 Go 中用 channel 替换 goroutine 循环

multithreading - SQLite-插入操作会阻止读取吗?