新建一个Python文件就可以使用了,我不是太喜欢弯弯绕绕的程序获取方法,主程序文件和测试程序都在下面,拿走直接用就行。
如果喜欢的话,在时间允许的情况下欢迎去我的Github主页点一波关注,谢谢!
UDP Service 主程序文件
# -*- coding: utf-8 -*-
"""
使用 Socket 处理 UDP 信息
用来处理普通的文本类信息
"""
import socket
import queue
import utils.logUtil
class UdpService_Multi:
"""多线程调用UDP服务时使用UdpService_Multi"""
def __init__(self, host:str, port:int, queue = None, use_queue = False, bufsize=1024):
'''
多线程调用初始化
:param host: 主机地址 都是接受者的地址
:param port: 端口 都是接受者的地址端口
:param queue: 多线程消息队列
:param use_queue: 是否使用多线程消息队列
:param bufsize: 消息大小,默认 1024
'''
# super(UdpService, self).__init__()
self.host = host # 主机地址 都是接受者的地址
self.port = port # 端口 都是接受者的地址端口
self.queue = queue # 多线程消息队列
self.use_queue = use_queue # 是否使用多线程消息队列
self.bufsize = bufsize # 消息大小,默认 1024
def receiver_start(self) -> str or queue:
"""使用UDP协议接收数据,不保证数据是否全被接收!"""
# 指定使用的协议
receiver = socket.socket(type=socket.SOCK_DGRAM)
receiver.bind((self.host,self.port)) # 接收程序的服务地址
while True:
# 接收消息
data, addr = receiver.recvfrom(self.bufsize) # 设置消息长度 int
msg = data.decode('utf8')
if self.use_queue:
# 如果使用多线程消息队列传输消息
if self.queue is None:
# 如果使用多线程消息队列但是并未将目标队列传入方法
# 抛出异常
utils.logUtil.LogSys.show_error("请设置多线程消息队列!!!")
# 如果使用 多线程消息队列
self.queue.put(msg) # 消息队列放入接收到的信息
# print(self.queue.get())
else:
# 如果不使用多线程消息队列
return msg
def send_start(self, msg_queue:queue) -> None:
"""使用UDP协议发送数据,不保证数据能全被送到"""
# 指定使用的协议
sender = socket.socket(type=socket.SOCK_DGRAM)
receiver_addr = (self.host, self.port) # 接收程序的地址
while True:
# 发送消息
send_msg = msg_queue.get() # 从消息队列拿数据
msg = send_msg.strip()
sender.sendto(msg.encode('utf8'), receiver_addr)
class SendNoLoop:
"""发送消息,但不使用多线程"""
def __init__(self, host:str, port:int, queue = None, use_queue = False, bufsize=1024):
# super(UdpService, self).__init__()
self.host = host # 主机地址 都是接受者的地址
self.port = port # 端口 都是接受者的地址端口
self.queue = queue # 多线程消息队列 用于
self.use_queue = use_queue # 是否使用多线程消息队列
self.bufsize = bufsize # 消息大小,默认 1024
# 指定使用的协议
sender = socket.socket(type=socket.SOCK_DGRAM)
receiver_addr = (self.host, self.port) # 接收程序的地址
self.sender = sender
self.receiver_addr = receiver_addr
def send_start(self, msg:str) -> None:
"""使用UDP协议发送数据,不保证数据能全被送到"""
self.sender.sendto(msg.encode('utf8'), self.receiver_addr)
接收端测试程序
# -*- coding: utf-8 -*-
import service.udp.udpService as udpService
import utils.threadUtil as threadUtil
import queue
def main():
host = "localhost" # 设置 host 地址
port = 12237 # 设置端口号
msg_queue = queue.Queue() # 设置消息队列
service = udpService.UdpService_Multi(host=host,port=port,queue=msg_queue,use_queue=True) # 初始化
threadUtil.MyThread("UDP Server",service.receiver_start) # 以子线程启动 UDP 接收服务
print("12")
while True:
msg = msg_queue.get() # 从消息队列读取信息
print("main",msg)
threadUtil.MyThread.join() # join
if __name__ == '__main__':
main()
发送端测试程序
# -*- coding: utf-8 -*-
import service.udp.udpService as udpService
import queue
if __name__ == '__main__':
host = "localhost" # 设置 host 地址
port = 12237 # 设置端口号
udp_service = udpService.SendNoLoop(host=host,port=port) # UDP 服务初始化
udp_service.send_start("Hello") # 发送消息