文档章节

python websocket 聊天服务器

猿神出窍
 猿神出窍
发布于 2017/04/10 17:31
字数 394
阅读 72
收藏 0

 前提:

安装

pip install -U channels

add channels to your INSTALLED_APPS setting

服务端:consumers.py


# -*- coding: utf-8 -*-
from __future__ import unicode_literals

import datetime
import json

from channels import Group
from channels.auth import channel_session_user_from_http, channel_session_user


@channel_session_user_from_http
def ws_connect(message, game, room_id):
    # Add to the chat group
    Group(game).add(message.reply_channel)
    # Accept the connection
    message.reply_channel.send({"accept": True})


@channel_session_user
def ws_message(message, game, room_id):
    user = message.user
    if not user.id:
        data = {'stream': 'unauthorized', 'payload': {}}
        Group(game).send({"text": json.dumps(data)}, immediately=True)
        return

    data = {
        'stream': 'test',
        'payload': {
            'id': user.id,
            'username': user.username,
        }
    }
    Group(game).send({"text": json.dumps(data)}, immediately=True)


@channel_session_user
def ws_disconnect(message, game, room_id):
    Group(game).discard(message.reply_channel)

路由文件:routing.py

fromchannels.routing import route
from myapp.consumers import ws_add, ws_message, ws_disconnect
channel_routing= [
    route("websocket.connect",ws_add,path=r"^/(?P<game>[a-zA-Z]+)/(?P<room_id>[0-9]+)/$"),
    route("websocket.receive",ws_message,path=r"^/(?P<game>[a-zA-Z]+)/(?P<room_id>[0-9]+)/$"),
   route("websocket.disconnect", ws_disconnect,path=r"^/(?P<game>[a-zA-Z]+)/(?P<room_id>[0-9]+)/$"),
]

配置文件:setting.py

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "asgiref.inmemory.ChannelLayer",
        "ROUTING": "common.routing.channel_routing",
    },
}

它将channel数据存储在内存中的一个字典里,所以不能跨进程。当部署时还是要换成Redis后端asgi_redis等。

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "asgi_redis.RedisChannelLayer",
        "CONFIG": {
            "hosts": [("localhost", 6379)],
        },
        "ROUTING": "myproject.routing.channel_routing",
    },
}

因为Channles是分布式系统,默认它按workers从队列中获得的顺序处理消息。很可能interface server发出非常近的connect和receive消息,connect还未被处理完,receive就被另一个worker处理。

        Channels的解决方法是enforce_ordering装饰器。所有websocket消息都包含一个order键,这个装饰器用这个键确保message按顺序处理。有两个模式:

        Slightordering:connect先处理,其他无序。

        Strictordering:所有都按序。

 

参考:http://blog.csdn.net/linshiyx/article/details/51680418

         http://blog.csdn.net/zhu_free/article/details/48137375

        http://www.toutiao.com/i6396086415800664577/

 

      https://github.com/jacobian/channels-example

© 著作权归作者所有

共有 人打赏支持
上一篇: django 模板标签
下一篇: pip 仓库镜像地址
猿神出窍
粉丝 17
博文 181
码字总数 66634
作品 0
沙坪坝
项目经理
私信 提问
加载中

评论(3)

w
wahahachuang4

引用来自“老农民28”的评论

我觉得这种东西自己开发太麻烦了,就别自己捣鼓了,找个第三方,方便,GoEasy就挺不错的,我昨天试了一下,代码简洁易懂,几分钟我就洗了一个自己的实时推送功能;官网: http://goeasy.io/

引用来自“jamesamy”的评论

嗯 多谢建议 我看了一下 确实更简单 在浏览器的兼容问题上非常强大👍
😆😊😊
猿神出窍
猿神出窍

引用来自“老农民28”的评论

我觉得这种东西自己开发太麻烦了,就别自己捣鼓了,找个第三方,方便,GoEasy就挺不错的,我昨天试了一下,代码简洁易懂,几分钟我就洗了一个自己的实时推送功能;官网: http://goeasy.io/
嗯 多谢建议 我看了一下 确实更简单 在浏览器的兼容问题上非常强大👍
老农民28
我觉得这种东西自己开发太麻烦了,就别自己捣鼓了,找个第三方,方便,GoEasy就挺不错的,我昨天试了一下,代码简洁易懂,几分钟我就洗了一个自己的实时推送功能;官网: http://goeasy.io/
45.Tornado 搭建基于 WebSocket 的聊天服务

这年头 Python web 框架是有点泛滥了. 下面要介绍的是 facebook 的开源框架 tornado. 这东西比较简单, 而且自带 WebSocket 支持, 可以用它做个简单的聊天室. 读者最好已具备 Javascript 与 ...

quanpower
2013/08/08
0
0
python 爬取fcoin比特币交易市场 上文

爬取环境 win10 python3 scrapy 爬取思路 首先你得先了解以下 http(https)请求(百科) websocket通信协议 python 模拟websoket客户端 (一)websocket简要介绍 WebSocket是一种在单个TCP...

徐代龙
08/05
0
0
如何使用Django WebSocket Redis 快速搭建在线聊天室?

     一言不合就上效果图演示         项目:http://112.74.164.107:9990/   1、安装组建   redis: yum install redis/apt install redis   2、创建虚拟化环境并进入   p...

java进阶架构师
12/10
0
0
websocket shell

Websocket Shell ======================= web目录可以部署在任意的http服务器上,打开页面的浏览器需要跟server.py运行服务器在一个内网,因为他们需要建立socket链接 客户端的JavaScript通...

逐浪人
2015/07/13
0
0
使用 HTML5 WebSocket 构建实时 Web 应用

作为下一代的 Web 标准,HTML5 拥有许多引人注目的新特性,如 Canvas、本地存储、多媒体编程接口、WebSocket 等等。这其中有“Web 的 TCP ”之称的 WebSocket 格外吸引开发人员的注意。WebSo...

lyg945
2014/08/27
1K
3

没有更多内容

加载失败,请刷新页面

加载更多

day179-2018-12-16-英语流利阅读-待学习

《海王》:上映 7 天,票房突破 9 亿,DC 要翻身? Daniel 2018-12-16 1.今日导读 这部电影堪称“有《阿凡达》般的视觉奇观,《指环王》般的史诗质感,《夺宝奇兵》般的寻宝历险,《狮子王》...

飞鱼说编程
5分钟前
1
0
window下安装maven

1.下载软件包: 2.解压到当前的安装路径: D:\Maven3.5.3 3.添加环境变量: 新建一个名为:MAVEN_HOME 填写解压路径:D:\Maven3.5.3 打开path,添加:%MAVEN_HOME%\bin 确定即可。 4.验证环境...

狼王黄师傅
19分钟前
5
0
聊聊flink的FsCheckpointStorage

序 本文主要研究一下flink的FsCheckpointStorage CheckpointStorage flink-runtime_2.11-1.7.0-sources.jar!/org/apache/flink/runtime/state/CheckpointStorage.java /** * CheckpointStor......

go4it
41分钟前
3
0
makefile 常用函数

Linux 环境下的程序员如果不会使用GNU make来构建和管理自己的工程,应该不能算是一个合格的专业程序员,至少不能称得上是 Unix程序员。今天我们来学习下makefile的常用函数。 《GNU make》h...

科陆李明
今天
18
0
Android 报错 Could not find com.android.tools.build:aapt2:3.2.1-4818971.

报错信息: Could not find com.android.tools.build:aapt2:3.2.1-4818971.Searched in the following locations: file:/C:/Users/96110/AppData/Local/Android/Sdk/extras/m2reposito......

lanyu96
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部