使用 Python 来搭建 UDP 服务器

文章目录

  • 使用 Python 来搭建 UDP 服务器
    • 搭建 UDP Server
    • UDP Client
    • 用 16 进制来收发消息

使用 Python 来搭建 UDP 服务器

使用 python 的 socket 模块,很容易快速搭建 udp 服务器,以便完成业务的需求,下面就来通过代码展示这种便捷性

搭建 UDP Server

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)
  • 使用 udp.bind() 方法绑定 ip 和 port
  • 通过 udp.recvfrom() 方法来收取客户端发送的 udp 消息(该方法是阻塞的,直到有消息来才能够向下执行)
  • 可以在 addr 中获取到 client_ip, client_port,你可以自行记录,以便 server 和 不同的 client 进行通信
  • 收取到的消息使用 decoce() 方法解码,可以得到对应的字符串消息
  • 使用 udp.sendto() 方法可以将消息发送到对应的客户端

UDP Client

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 进制字符串”消息转码成真正的 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

你可能感兴趣的:(python)