使用 python 的 socket 模块,很容易快速搭建 udp 服务器,以便完成业务的需求,下面就来通过代码展示这种便捷性
import socket
# AF_INET 表示使用IPv4, SOCK_DGRAM 则表明数据将是数据报(datagrams)
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)
import socket
# AF_INET 表示使用IPv4, SOCK_DGRAM 则表明数据将是数据报(datagrams)
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 进制,可能会使用到如下的工具方法
import re
import struct
def msg_to_hex(msg):
"""
将字符串消息转换成16进制消息
"""
hex_msg = b""
# 分割字符串,按照两个字符作为一个项
for item in re.findall(r'.{2}', msg):
# 字符串转换成 16 进制
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