IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Django练习:redis订阅发布基于Pythonsocket -> 正文阅读

[大数据]Django练习:redis订阅发布基于Pythonsocket

在这里插入图片描述
消息发布订阅图

在app中新建一个文件夹,然后新建base、server、client三个py文件。
base文件中:

# coding:utf-8

import redis


class RedisSubPub(object):
    # redis中 0~15 一个有16个数据库

    def __init__(self, host='localhost', port=6379, db=13, password='',
                 pub='cong', sub='cong'):
        # 创建一个redis连接池,连接池就是连接上之后可以一直保持连接
        pool = redis.ConnectionPool(host=host, port=port, db=db, password=password)
        self.__conn = redis.StrictRedis(connection_pool=pool)  # 连接起来
        self.sub = sub
        self.pub = pub
        self.__sub = None

    # 定义发布方法
    def public(self, msg):

        if self.pub:
            self.__conn.publish(self.pub, msg)  # 将msg传到pub中,开始发布消息
            return True
        else:
            return False

        
    def subscribe(self):
        # 定义订阅方法

        if self.sub:  # 确认sub存在,没有频道的话无法订阅
            self._sub = self.__conn.pubsub()  # 开始订阅
            self._sub.subscribe(self.sub)  # 订阅频道
            self._sub.parse_response()  # 准备接收

            return self._sub

接下来client:

# coding:utf-8

'''
客户端只接收,不发布
客户端与服务端建立一个长链接,服务端订阅到消息之后,会发给客户端,由客户端显示出来
'''

import socket


def work():
    client = socket.socket()

    client.connect(('localhost', 8888))

    while 1:
        msg = client.recv(1024)
        print(msg)

    client.close()


if __name__ == '__main__':
    work()

server:

# coding:utf-8
# 这里要订阅

import socketserver
from .base import RedisSubPub


obj = RedisSubPub()  # 这里不用传参,因为定义时已经加了默认值


class Server(socketserver.BaseRequestHandler):

    def handle(self):
        try:
            __msg = obj.subscribe()

            while 1:
                msg = __msg.parse_response()  # 重新准备接收

                if msg:
                    self.request.sendall(msg[2])  # msg中有很多值,第二个是我们要的
        except Exception as e:
            print(self.client_address, 'close')

    def setup(self):
        print('before handle, connection {}'.format(self.client_address))

    def finish(self):
        print('finish run after handle')


if __name__ == '__main__':
    host, port = 'localhost', 8888
    server = socketserver.TCPServer((host, port), Server)
    server.serve_forever()  # 启动服务

然后进入到app/pubsub
启动一下:python server.py
我这里出现了一个错误:ImportError: attempted relative import with no known parent package
就是因为在导入RedisSubPub的时候,用的相对路径,把base前面的 . 去掉好了。
在这里插入图片描述
输入完没有报错就OK。

然后再打开一个cmd,进入pubsub目录,启动一下client:python client.py
在这里插入图片描述
client连接上后,server端出现了消息

然后,再打开一个cmd,进入pubsub目录,然后进入ipython。

from base import RedisSubPub

In [2]: obj = RedisSubPub()

In [3]: obj.public('这是一条消息订阅')
Out[3]: True

In [4]:

理论上,订阅消息发布,然后传给server,server再给client。
在这里插入图片描述
可以看到client已经接收到了,是比特类型的。
在这里插入图片描述
已经decode了依旧不行。

当server收到了我们发布的信息之后,就会长链接给我们的客户端。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-11-15 15:56:05  更:2021-11-15 15:57:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:51:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码