跳至主要內容

UDP编程

刘春龙原创...大约 2 分钟Python教程文档

UDP 编程介绍

UDP 协议时,不需要建立连接,只需要知道对方的 IP 地址和端口号,就可以直接发数据包。但是,能不能到达就不知道了。虽然用 UDP 传输数据不可靠,但它的优点是和 TCP 比,速度快,对于不要求可靠到达的数据,就可以使用 UDP 协议。

创建 Socket 时,SOCK_DGRAM指定了这个 Socket 的类型是 UDP。绑定端口和 TCP 一样,但是不需要调用listen()方法,而是直接接收来自任何客户端的数据。recvfrom()方法返回数据和客户端的地址与端口,这样,服务器收到数据后,直接调用sendto()就可以把数据用 UDP 发给客户端。

UDP 编程的实现

UDP 接收数据

【示例】接收数据(服务端)

from socket import *
s = socket(AF_INET, SOCK_DGRAM)  # 创建UDP类型的套接字
# 绑定接收信息端口
s.bind(('127.0.0.1', 8888))  # 绑定一个端口,ip地址和端⼝号
print("等待接收数据!")
redata = s.recvfrom(1024)  # 1024表示本次接收的最⼤字节数
print(redata)
print(f'收到远程信息:{redata[0].decode("gbk")}, from {redata[1]}')
s.close()

【示例】接收数据(客户端)

from socket import *
s = socket(AF_INET, SOCK_DGRAM)  # 创建套接字
addr = ('127.0.0.1', 8888)  # 准备接收方地址
data = input("请输入:")
# 发送数据时,python3需要将字符串转成byte
s.sendto(data.encode('gbk'), addr)  # 默认的网络助手使用的编码是gbk
s.close()

持续通信

【示例】UDP 接收数据(服务端)

from socket import *
s = socket(AF_INET, SOCK_DGRAM)  # 创建UDP类型的套接字
s.bind(("127.0.0.1", 8888))  # 绑定端口,ip可以不写
print("等待接收数据!")
while True:
    recv_data = s.recvfrom(1024)  # 1024表示本次接收的最大字节数
    recv_content = recv_data[0].decode('gbk')
    print(f"收到远程信息:{recv_content},from {recv_data[1]}")
    if recv_content == "88":
        print("结束聊天!")
        break
s.close()

【示例】UDP 发送数据(客户端)

from socket import *
s = socket(AF_INET, SOCK_DGRAM)  # 创建UDP类型的套接字
addr = ("127.0.0.1", 8888)
while True:
    data = input("请输入:")
    s.sendto(data.encode("gbk"), addr)
    if data == "88":
        print("结束聊天!")
        break
s.close()

结合多线程实现 UDP 双向自由通信

【示例】UDP 实现多线程服务端

from socket import *
from threading import Thread
udp_socket = socket(AF_INET, SOCK_DGRAM)
# 绑定接收信息端口
udp_socket.bind(('127.0.0.1', 8989))
# 不停接收
def recv_data():
    while True:
        redata = udp_socket.recvfrom(1024)
        print(f'收到信息:{redata[0].decode("gbk")}, from {redata[1]}')
# 不停发送
def send_data():
    while True:
        data = input('输入信息:')
        addr = ('127.0.0.1', 8080)
        udp_socket.sendto(data.encode('gbk'), addr)
if __name__ == '__main__':
    # 创建两个线程
    t1 = Thread(target=send_data)
    t2 = Thread(target=recv_data)
    t2.start()
    t1.start()
    t1.join()
    t2.join()

【示例】UDP 实现多线程客户端

from socket import *
from threading import Thread
udp_socket = socket(AF_INET, SOCK_DGRAM)
# 绑定接收信息端口
udp_socket.bind(('127.0.0.1', 8080))
# 不停接收
def recv_data():
    while True:
        redata = udp_socket.recvfrom(1024)
        print(f'收到信息:{redata[0].decode("gbk")}, from {redata[1]}')
# 不停发送
def send_data():
    while True:
        data = input('输入信息:')
        addr = ('127.0.0.1', 8989)
        udp_socket.sendto(data.encode('gbk'), addr)
if __name__ == '__main__':
    # 创建两个线程
    t1 = Thread(target=send_data)
    t2 = Thread(target=recv_data)
    t2.start()
    t1.start()
    t1.join()
    t2.join()
上次编辑于:
贡献者: 刘春龙
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.7