使用 Python 来搭建 UDP 服务器
使用 python 的 socket 模块,很容易快速搭建 udp 服务器,以便完成业务的需求,下面就来通过代码展示这种便捷性
搭建 UDP Server
import socket
udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp.bind(('0.0.0.0', 1777))
while True:
rec_msg, addr = udp.recvfrom(1024)
client_ip, client_port = addr
print('client_ip:', client_ip, 'client_port:', client_port)
print('msg from client:', rec_msg.decode('utf8'))
ack_msg = 'Hello, udp client.'
udp.sendto(ack_msg.encode('utf8'), addr)
- 使用 udp.bind() 方法绑定 ip 和 port
- 通过 udp.recvfrom() 方法来收取客户端发送的 udp 消息(该方法是阻塞的,直到有消息来才能够向下执行)
- 可以在 addr 中获取到 client_ip, client_port,你可以自行记录,以便 server 和 不同的 client 进行通信
- 收取到的消息使用 decoce() 方法解码,可以得到对应的字符串消息
- 使用 udp.sendto() 方法可以将消息发送到对应的客户端
UDP Client
import socket
udp_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client_msg = 'Hello udp server.'
udp_client.sendto(client_msg.encode('utf8'), ('127.0.0.1', 1777))
while True:
rec_msg, addr = udp_client.recvfrom(1024)
print('msg form server:', rec_msg.decode('utf8'))
该段代码是客户端模拟发送 udp 消息,以及收取 server 的响应消息,其中相关的方法,可以参考上面的描述
用 16 进制来收发消息
如果你使用 16 进制来收发消息,可能希望在编码的时候就使用 “16 进制字符串”表示,发送时再将该 “16 进制字符串”消息转码成真正的 16 进制,可能会使用到如下的工具方法
import re
import struct
def msg_to_hex(msg):
"""
将字符串消息转换成16进制消息
"""
hex_msg = b""
for item in re.findall(r'.{2}', msg):
hex_str = int(item, 16)
hex_msg += struct.pack('B', hex_str)
return hex_msg
def hex_to_msg(hex_msg):
"""
将16进制消息转换成字符串消息
"""
msg = ''.join(['%02x' % h for h in hex_msg])
return msg
|