Python实现-两台PC利用多进程分别进行redis的接收和发送

使用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}

个人学习随笔,欢迎交流讨论!

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值