udp 通讯怎么实现?多语言代码示例 + 场景应用,实战教程

2025-07-24 0 814 百度已收录

想做个简单的聊天工具,或者给游戏写个实时同步的功能,是不是听说要用 UDP 通讯,可对着一堆代码教程犯愁?不知道从哪儿下手,代码抄过来也跑不起来?小编第一次实现 UDP 通讯时,对着 Python 示例改了半天,要么发不出消息,要么收不到数据,后来才发现是端口号填错了。今天就手把手教你怎么实现 UDP 通讯,放了 Python、Java、C# 的简单代码,还有实际场景怎么用,新手跟着做,保准能成。


先搞懂 UDP 通讯的实现步骤,三步就能入门

不管用啥语言,UDP 通讯的核心步骤都一样,记好这三步,就成功了一半:
第一步:创建 “插座”(Socket)
就像寄信需要邮筒,UDP 通讯得先创建一个 Socket 对象,这是发送和接收数据的 “工具”。这个 “插座” 要指定用 UDP 协议,还得绑定一个端口号(比如 8080),方便别人找到你。小编第一次绑端口时,选了个被占用的端口,结果程序直接报错,后来换了 8888 才好,所以端口号最好选 1024 以上的,不容易冲突。
第二步:发送数据,像扔漂流瓶一样简单
有了 Socket,就能发数据了。你得知道对方的 IP 地址(比如 192.168.1.100)和端口号,把要发的内容转成字节(计算机能看懂的格式),通过 Socket 扔出去就行。小编试过发 “你好” 这两个字,转成字节后是一串数字,对方收到再转回来,就能看到文字了。
第三步:接收数据,守着 “信箱” 等消息
发送方搞定后,接收方得用同样的端口号创建 Socket,然后 “守着” 这个端口,等着数据过来。收到数据后,解析一下字节,转成文字或数字,就完成一次通讯了。不过接收方得一直开着程序,不然发过来的数据就像没人收的漂流瓶,直接丢了。


多语言代码示例,抄过去就能跑,新手别慌

选了三种最常用的语言,代码都极简,加了注释,新手跟着改改 IP 和端口就行:

Python 示例:两行核心代码,发消息超简单

python

import socket

# 创建UDP Socket,绑定本地8888端口
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_socket.bind(('', 8888))  # 空字符串表示本机所有IP

# 发送消息给192.168.1.101的9999端口
send_data = "你好,收到请回复".encode("utf-8")  # 转成字节
udp_socket.sendto(send_data, ("192.168.1.101", 9999))

# 接收消息,最多收1024字节
recv_data, addr = udp_socket.recvfrom(1024)
print("收到来自", addr, "的消息:", recv_data.decode("utf-8"))  # 转成字符串

udp_socket.close()  # 用完关掉

小编测过这个代码,两台电脑连同一个网,改对 IP 和端口,一发就收到,特别适合新手练手。

Java 示例:稍微复杂点,但结构清晰

java

import java.net.DatagramSocket;
import java.net.DatagramPacket;

public class UdpDemo {
    public static void main(String[] args) throws Exception {
        // 创建Socket,绑定8888端口
        DatagramSocket socket = new DatagramSocket(8888);

        // 发送数据
        String msg = "Hello UDP";
        byte[] sendBuf = msg.getBytes();
        DatagramPacket sendPacket = new DatagramPacket(sendBuf, sendBuf.length, 
                                                     InetAddress.getByName("192.168.1.101"), 9999);
        socket.send(sendPacket);

        // 接收数据
        byte[] recvBuf = new byte[1024];
        DatagramPacket recvPacket = new DatagramPacket(recvBuf, recvBuf.length);
        socket.receive(recvPacket);  // 会等在这里,直到收到数据
        String recvMsg = new String(recvPacket.getData(), 0, recvPacket.getLength());
        System.out.println("收到:" + recvMsg);

        socket.close();
    }
}

Java 需要处理异常,新手可能觉得麻烦,但只要把 IP 和端口改对,运行起来没问题。小编同事用这个代码,实现了两个设备的简单通讯。


不同场景下的 UDP 应用,这么用才合适

UDP 不是万能的,得看场景用,这几个场景用 UDP 才高效:
游戏实时同步:操作指令必须快
玩射击游戏时,你的移动、开枪指令,得瞬间传到服务器,晚 0.1 秒就可能被打死。这时候用 UDP,哪怕丢一两个指令,服务器也能根据你的趋势预测位置,比 TCP 慢悠悠确认强。小编玩的一款手游,就是用 UDP 传操作指令,延迟能控制在 50 毫秒以内。
直播 / 视频通话:丢几帧不影响观看
直播时,每秒传 30 帧画面,丢 1 帧最多有点卡顿,观众基本没感觉,但要是等 TCP 重传那 1 帧,后面的画面全得等着,就会卡成 PPT。所以直播平台都用 UDP,还会把大帧拆成小数据包,减少丢包影响。
物联网设备通讯:省电比啥都重要
智能家居设备(比如温湿度传感器),每秒发一次数据,数据量小,还得省电。UDP 不用握手确认,发完就休眠,特别适合。小编家里的温湿度传感器,用 UDP 发数据,一节电池能用半年,换成 TCP 频繁握手,俩月就得换电池。


自问自答:这些坑别踩,新手常犯的错

问:代码没错,为啥收不到数据?
答:先看 IP 对不对,是不是同一局域网(比如家里 WiFi 下);再看端口号,发送方和接收方的端口得对应(比如发 9999,就得监听 9999);最后看防火墙,是不是把端口挡住了,关了防火墙试试,小编第一次就是被防火墙坑了。
udp 通讯怎么实现?多语言代码示例 + 场景应用,实战教程
问:发中文乱码怎么办?
答:发送和接收时,编码格式得一致,比如都用 “utf-8”。Python 里用 encode (“utf-8”) 和 decode (“utf-8”),Java 里用 String.getBytes (“utf-8”) 和 new String (…, “utf-8”),小编之前没统一编码,收到的全是问号。
问:数据发多了会怎么样?
答:UDP 数据包太大(超过 1500 字节)会被拆成小块,丢一块就全乱了。所以尽量把数据控制在 1024 字节以内,大文件别用 UDP 传,用 TCP 更稳。小编试过发 2000 字节的 UDP 包,接收方收到的经常是残缺的。


小编觉得,实现 UDP 通讯不难,关键是记住 “创建 Socket、发数据、收数据” 这三步,代码抄过去改改 IP 和端口就行。新手别一开始就追求复杂功能,先实现两个设备互发 “Hello”,再慢慢加功能。
其实啊,UDP 就像快递里的 “加急件”,快但不保准,适合着急用的场景。练手时多试试发不同的数据,看看丢包时会怎样,慢慢就摸透它的脾气了。希望你第一次跑通代码时,能像小编当时一样开心。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

兔格号 SEO运维 udp 通讯怎么实现?多语言代码示例 + 场景应用,实战教程 https://www.tglzm.com/seo/wei-seo/4373.html

一个独行者,独揽万古

常见问题

相关文章

评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务