You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Datagram Socket本地无法接收UDP数据包问题求助

问题分析与解决方案

嘿,这问题一看就有眉目了!你的UDP发送端和接收端根本没在同一个端口上工作,这才导致接收端一直等着收不到数据~

先帮你拆解下核心问题:

  • 你的发送端把数据包发往了端口9850,但接收端却在监听端口8888,端口不匹配,数据自然送不到接收端手里。
  • 另外发送端的DatagramSocket绑定了9850端口,其实UDP发送端完全不需要固定绑定端口(除非你有特殊业务需求),让系统自动分配临时端口就行,这样还能避免端口占用问题。

修改后的发送端代码

public static void main(String[] args) {
    Timer timer = new Timer();
    try {
        InetAddress ip = InetAddress.getLocalHost();
        // 把目标端口改成和接收端一致的8888
        int targetPort = 8888;
        // 给buffer填点测试内容,方便验证接收效果
        byte[] buffer = "Hello UDP!".getBytes();
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length, ip, targetPort);
        try {
            // 发送端不需要绑定固定端口,用无参构造让系统自动分配临时端口
            DatagramSocket socket = new DatagramSocket();
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    System.out.println("will send !");
                    try {
                        socket.send(packet);
                    } catch (IOException e) {
                        e.printStackTrace();
                        return;
                    }
                    System.out.println("was sent !");
                }
            }, 500, 500);
        } catch (SocketException e) {
            e.printStackTrace();
            return;
        }
    } catch (UnknownHostException e) {
        e.printStackTrace();
        return;
    }
}

接收端优化代码(保留核心逻辑,新增内容打印)

public static void main(String[] args) {
    int port = 8888;
    byte[] buffer = new byte[100];
    DatagramPacket packet = new DatagramPacket(buffer, 100);
    try {
        DatagramSocket socket = new DatagramSocket(port);
        while(true) {
            try {
                System.out.println("ready to receive");
                socket.receive(packet);
                // 打印接收到的内容,直观验证接收结果
                System.out.println("received a packet: " + new String(packet.getData(), 0, packet.getLength()));
            } catch (IOException e) {
                e.printStackTrace();
                return;
            }
        }
    } catch(SocketException e) {
        e.printStackTrace();
        return;
    }
}

额外说明

我给代码加了点小优化:发送端填充了测试数据,接收端新增了内容打印,这样你能更直观看到收发效果。既然你已经排除了防火墙和权限问题,修改端口匹配后应该就能正常收发数据了~

内容的提问来源于stack exchange,提问作者Sheed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:31:00