Python+UDP+Threading

发布时间 2023-04-29 22:45:29作者: CNPolaris

Python+UDP+Threading

近期用python socket使用TCP协议做了一个小型的数据收发服务器,后来由于在实际场景中使用时,出现网络不佳导致出现错误的情况,改成了使用UDP协议重做了一版,总体效果变好了。下面是通用代码,实际使用时在这基础上进行修改即可。

# -*- coding: utf-8 -*-
import json
import socket
import queue
import struct
import threading
from concurrent.futures import ThreadPoolExecutor

UDP_HOST = '0.0.0.0'
UDP_PORT = 11400
BUFSIZE = 1024
UDP_ADDR = (UDP_HOST, UDP_PORT)

class RecvMsg(threading.Thread):
    def __init__(self, udp_socket: socket.socket, q):
        threading.Thread.__init__(self)
        self.udp_socket = udp_socket
        self.q = q

    def run(self) -> None:
        while True:
            recv_data, addr = self.udp_socket.recvfrom(BUFSIZE)
            recv_data = recv_data.decode('utf-8')
            print(f"收到数据{recv_data}")
            if recv_data == '':
                continue
            self.q.put(msg_list)	# 存放在消息队列


class SendMsg(threading.Thread):

    def __init__(self, udp_socket: socket.socket, q: queue):
        threading.Thread.__init__(self)
        self.udp_socket = udp_socket
        self.q = q

    def run(self) -> None:
        while True:
            if not self.q.empty():
                msg = self.q.get()	# 从消息队列中取出
                print(f"发送数据{msg}")
                self.udp_socket.sendto(msg.encode("utf-8"), client_aad)# client_addr是目标客户端地址 tuple

def main():
    
    q = queue.Queue()	# 消息队列
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    udp_socket.bind(UDP_ADDR)

    t_recv = RecvMsg(udp_socket, q)	# 负责收数据的线程
    t_send = SendMsg(udp_socket, q)	# 负责转发数据的线程

    t_recv.start()
    t_send.start()
    
    print("==" * 20 + "服务启动" + "==" * 20)
	print("==" * 20 + "等待连接" + "==" * 20)

if __name__ == "__main__":
    main()