仅在第一次运行时接收来自 Java 的 UDP 消息

Posted

技术标签:

【中文标题】仅在第一次运行时接收来自 Java 的 UDP 消息【英文标题】:UDP messages from Java are received only on first run 【发布时间】:2020-06-16 20:17:53 【问题描述】:

我正在使用 Java 的 DatagramSocket 将 UDP 消息从 Java 发送到本地主机上的特定端口。我用 netcat 监听这个端口:nc -ul 9122.

在我的 Java 代码第一次运行时(在启动 nc 之后)- 消息被接收并显示在我的 shell 上。在彼此运行时 - 未收到消息。只有重启 nc 才行。

这是我的 Java 代码:

public static void main(String[] args) throws IOException, InterruptedException 
    byte[] buf = "Hi There\n".getBytes();

    InetAddress address = InetAddress.getLocalHost();
    DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 9122);

    DatagramSocket datagramSocket = new DatagramSocket();
    datagramSocket.connect(InetAddress.getLocalHost(), 9122);
    if(datagramSocket.isConnected()) 
        datagramSocket.send(packet);
        Thread.sleep(500);
        datagramSocket.send(packet);
        Thread.sleep(500);
        datagramSocket.send(packet);

    

我错过了什么? 谢谢

【问题讨论】:

【参考方案1】:

这似乎是ncat 的一个功能。收到一个UDP数据包后,只接受来自同源主机和端口的数据包。它类似于连接:ncat 的实例仅处理来自单个客户端的数据包。

当你启动 Java 程序时,它会选择一个任意的本地端口,当你重新启动它时,你会得到一个不同的端口。您可以通过将其传递给DatagramSocket 构造函数来设置固定的本地端口:

DatagramSocket datagramSocket = new DatagramSocket(12345);

【讨论】:

以上是关于仅在第一次运行时接收来自 Java 的 UDP 消息的主要内容,如果未能解决你的问题,请参考以下文章

Java:通过 TCP 发送/接收数据并从 UDP 接收图像

多线程Udp服务器:将接收的数据重定向到线程

多线程 Udp 服务器:将接收到的数据重定向到线程

Java UDP 客户端不接收数据包

仅在活动运行时将意图从服务发送到活动

仅在第一次加载 Angular 网页时使用 Safari 接收 401 状态