UDP:User Datagram Protocal 用户数据报协议 是 OSI/RM 模型中隶属于传输层的面向无连接的网络数据传输协议
UDP数据传输速度快,不保证可靠传输。
UDP 服务端开发步骤如下:
⚫ 引入依赖的模块
⚫ 定义服务器描述信息
⚫ 创建 U DP 套接字对象 并绑定主机
⚫ 消息循环:和连接进入的客户端之间发送 / 收取消息
⚫ 关闭连接,释放资源
代码如下:
服务端代码如下:
# 引入需要的包
import socket
# 定义服务器信息
HOST = ''
PORT = 9000
ADDRESS = (HOST, PORT)
BUFFER = 1024
# 创建UDP套接字对象
udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定主机
udp_server.bind(ADDRESS)
print("udp server is starting, waiting for data....")
# 不需要监听
while True:
# 接收数据
msg, addr = udp_server.recvfrom(BUFFER)
try:
print("client:", addr, msg.decode("utf-8"))
except:
print("client:", addr, msg.decode("gbk"))
# 发送数据
info = input("请输入你要发送的数据:")
udp_server.sendto(info.encode("utf-8"), addr)
# 服务器退出,先关套接字
udp_server.close()
客户端代码如下:
# 引入需要的包
import socket
# 定义连接信息
HOST = '192.168.13.38'
PORT = 9000
ADDRESS = (HOST, PORT)
BUFFER = 1024
# 创建套接字对象
udp_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 收发消息
while True:
info = input("请输入你要发送的消息:")
udp_client.sendto(info.encode("utf-8"), ADDRESS)
if info == "BYE":
udp_client.close()
break
# 接收消息
msg, addr = udp_client.recvfrom(BUFFER)
try:
print(addr, " say : ", msg.decode("utf-8"))
except:
print(addr, " say : ", msg.decode("gbk"))
面向对象的连接(socketserver)
socketserver 是 python 中提供的一个可以用于面向对象服务端开发的一个高级模块,封装 了底层 socket 的大量操作实现,通过提供面向对象的操作方式简化程序开发
⚫ socketserver 模块
BaseServer 基础服务类型,包含核心功能
TCPServer/UDPServer TCP/UDP 服务类型
UnixStreamServer/UnixDatagramServer 面向文件的 TCP/UDP 服务类型 ForkingMixin/ThreadingMixin 核心派生线程类型 ForkingTCPServer/ForkingUDPServer 线程派生类型和 TCP/UDP 混合类型
ThreadingTCPServer/ThreadingUDPServer 同上
BaseRequestHandler 基础请求处理类型 StreamReqeustHandler/DatagramRequestHandler 面向连接/无连接的请求处理类型
基于 socketserver 的 TCP 服务端的编程开发
代码如下:
# 引入需要的模块
import socket
# 创建一个集合:用来存储连接的多个客户端
client_set = set()
# 定义服务器信息
HOST = ''
PORT = 22666
ADDRESS = (HOST, PORT)
BUFFERS = 1024
# 创建UDP服务器套接字并绑定当前主机
udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_server.bind(ADDRESS)
# 消息的转发
while True:
# 接受一个客户端的消息
recv_msg, client_addr = udp_server.recvfrom(BUFFERS)
client_set.add(client_addr)
# 转发给所有客户端
for client in client_set:
udp_server.sendto(recv_msg, client)
客户端代码如下:
# 引入需要的包
import socket
# 连接主机的信息
HOST = '192.168.13.38'
PORT = 22666
ADDRESS = (HOST, PORT)
BUFFER = 1024
# 定义套接字连接对象
udp_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 定义登记信息消息
info = input("请输入你的昵称:")
udp_client.sendto(info.encode("utf-8"), ADDRESS)
while True:
# 接受一次消息
msg, addr = udp_client.recvfrom(BUFFER)
print(addr, " say : ", msg.decode("utf-8"))
# 发送消息
info = input("消息:")
udp_client.sendto(info.encode("UTF-8"), ADDRESS)
UDP与TCP面向对象的编程类似,不同的地方在与UDP导入的包与TCP不同UDP导入的包为:UDPServer 和 DatagramRequestHandler