使用redis订阅可以让两台电脑通信,但是只能一台作为发送端,一台作为接收端,类似于C/S模式,如果想让两台都可以发送并接受,则需要通过多进程来实现:
PC1的发送和PC2的接收对应一个频道,PC2的发送和PC1的接收对应另一个频道,使用多进程来并发
简单举个例子:
pc1向pc2发送字符串,pc2收到后根据字符串进行处理,并将处理结果发送给pc1,原理很简单,直接上代码
pc1.py
#PC2作为被控制端,先开始订阅并监听
#PC1作为控制端,先开始发送
#需要先启动PC2,PC1给PC2发送的最初3条消息,PC2收不到
#使用多进程 :pc1和pc2都一直处于监听状态
# redisChat1:pc1向pc2发送
# redisChat2:排除向pc1发送
import redis
import time
import multiprocessing
#订阅并监听消息
def listen_task():
rcon = redis.StrictRedis(host='127.0.0.1')
ps = rcon.pubsub()
ps.subscribe('redisChat2')
for i in ps.listen():
print(i)
if i['type'] == 'message':
print("Task get", i['data'].decode('utf-8'))
#发布消息
def redis_pub(cha, msg):
conn = redis.StrictRedis()
conn.publish(cha, msg)
#发布消息的内容
def sendto(app_actions):
for i in range(3):#先发送三个消息,但是PC2收不到,为后续发消息做准备
redis_pub('redisChat1',i)
try:
for app_action in app_actions:
print("*",app_action)
time.sleep(10)
if app_action == "send_image":
# 发送图片的代码函数
redis_pub('redisChat1', app_action)
elif app_action == "send_video":
redis_pub('redisChat1', app_action)
elif app_action == "send_file":
redis_pub('redisChat1', app_action)
elif app_action == "voice_call":
redis_pub('redisChat1', app_action)
elif app_action == "video_call":
redis_pub('redisChat1', app_action)
else:
print("Error action,Try again!")
except Exception as e:
print("发布订阅失败:",e)
else:
print("发布订阅成功!")
if __name__ == '__main__':
time.sleep(2)
#函数多进程
app_actions=["send_image","send_video"]
p2 = multiprocessing.Process(target=sendto,args=(app_actions,))
print("PC1 listening")
p = multiprocessing.Process(target=listen_task)
p2.start()
p.start()
运行结果为:
PC1 listening
{'type': 'subscribe', 'pattern': None, 'channel': b'redisChat2', 'data': 1}
* send_image
* send_video
{'type': 'message', 'pattern': None, 'channel': b'redisChat2', 'data': b'send_image_False'}
Task get send_image_False
发布订阅成功!
{'type': 'message', 'pattern': None, 'channel': b'redisChat2', 'data': b'send_video_False'}
Task get send_video_False
pc2.py
import redis
import multiprocessing
import time
#订阅并监听消息
def listen_task():
rcon = redis.StrictRedis(host='127.0.0.1')
ps = rcon.pubsub()
ps.subscribe('redisChat1')
for i in ps.listen():
print(i)
if i['type'] == 'message':
check_result = False
app_action=i['data'].decode('utf-8')
if app_action == "send_image":
# 图像匹配检验是否收到图片
time.sleep(2)
check_result=False
elif app_action == "send_video":
time.sleep(3)
check_result = False
elif app_action == "send_file":
time.sleep(5)
check_result = False
elif app_action == "voice_call":
time.sleep(2)
check_result = False
elif app_action == "video_call":
time.sleep(5)
check_result = False
else:
print("Error action,Try again!")
ss=app_action+"_"+str(check_result)
return ss
#发布消息
def redis_pub(cha, msg):
# print("publish2")
conn = redis.StrictRedis()
conn.publish(cha, msg)
#发布消息的内容
def sendto():
while 1:
res=listen_task()
print("res:",res)
redis_pub('redisChat2',res)
if __name__ == '__main__':
print("PC2 listening")
p = multiprocessing.Process(target=listen_task)
time.sleep(10)
p2 = multiprocessing.Process(target=sendto)
p.start()
p2.start()
运行结果为:
PC2 listening
{'type': 'subscribe', 'pattern': None, 'channel': b'redisChat1', 'data': 1}
{'type': 'subscribe', 'pattern': None, 'channel': b'redisChat1', 'data': 1}
{'type': 'message', 'pattern': None, 'channel': b'redisChat1', 'data': b'send_image'}
{'type': 'message', 'pattern': None, 'channel': b'redisChat1', 'data': b'send_image'}
res: send_image_False
{'type': 'subscribe', 'pattern': None, 'channel': b'redisChat1', 'data': 1}
{'type': 'message', 'pattern': None, 'channel': b'redisChat1', 'data': b'send_video'}
res: send_video_False
{'type': 'subscribe', 'pattern': None, 'channel': b'redisChat1', 'data': 1}
个人学习随笔,欢迎交流讨论!