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()
标签:__,UDP,socket,Python,self,udp,Threading,recv
From: https://www.cnblogs.com/cnpolaris/p/17364594.html