python使用单个socket同时发送与接收信息

首先是导入所需的模块,包括socket与多线程所需的内容,time用于控制信息的发送间隔。

import time
import socket
import threading

1. 发送信息的广播线程

这里用多个端口模拟不同的地址,ports中储存了所有需要发送的端口地址
注:此处ports并未写入参数,实际使用中根据具体需要写入类的参数或者从全局变量中取出ports。

# 广播线程
class broadcast(threading.Thread):
	def __init__(self, threadID, name, interval, soc):
		threading.Thread.__init__(self)
		self.threadID = threadID
		self.name = name
		self.interval = interval
		self.soc = soc
	def run(self):
		while True:
			# 使用自定义的create_msg()方法创建要发送的文本信息
			msg = create_msg()
			msg = msg.encode(encoding='UTF-8')
			# 对所有port都进行一次发送
			for port in ports:
				self.soc.sendto(msg, ("127.0.0.1", port))
			# interval为每次发送给所有端口之后间隔的时间
			time.sleep(self.interval)

2. 接收信息的处理线程

# 接收线程		
class recieve(threading.Thread):
	def __init__(self, threadID, name, soc):
		threading.Thread.__init__(self)
		self.threadID = threadID
		self.name = name
		self.soc = soc
	def run(self):
		while True:
			msg = ""
			addr = ""
			try:
				data, addr = self.soc.recvfrom(2048)
				msg = data.decode(encoding='UTF-8')
			except:
				pass
			# 利用自定义的deal_msg()方法处理接收的文本信息
			result = deal_msg(msg)
			# 可以根据获取的result在后面继续做一些其它操作

3. 创建线程

# 此处配置为UDP协议,根据具体需要调整
soc = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# run_port为当前socket运行的端口
soc.bind(("127.0.0.1", run_port))
# 创建发送线程,每轮发送间隔一秒
UPDATE_INTERVAL = 1
thread_broadcast = broadcast(1, "broadcast", UPDATE_INTERVAL, soc)
# 创建接收线程
thread_recieve = recieve(2, "recieve", soc)

4. 启动线程

# 启动线程
thread_broadcast.start()
thread_recieve.start()

还可以根据具体需要增加一些其它的线程,例如计算内容等。

猜你喜欢

转载自blog.csdn.net/starvapour/article/details/108416351