文档章节

python websocket 聊天服务器

猿神出窍
 猿神出窍
发布于 2017/04/10 17:31
字数 394
阅读 69
收藏 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

© 著作权归作者所有

共有 人打赏支持
猿神出窍
粉丝 16
博文 174
码字总数 61315
作品 0
沙坪坝
项目经理
加载中

评论(3)

w
wahahachuang4

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

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

引用来自“jamesamy”的评论

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

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

我觉得这种东西自己开发太麻烦了,就别自己捣鼓了,找个第三方,方便,GoEasy就挺不错的,我昨天试了一下,代码简洁易懂,几分钟我就洗了一个自己的实时推送功能;官网: http://goeasy.io/
嗯 多谢建议 我看了一下 确实更简单 在浏览器的兼容问题上非常强大:thumbsup:
老农民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
websocket shell

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

逐浪人
2015/07/13
0
0
python 爬取fcoin比特币交易市场 下文

爬取环境 win10 python3 scrapy 上一篇先学习了WebSocket通信协议的一些知识,并初步了解了下如何在浏览器中中找到WebSocket通信协议的蛛丝马迹,这里是描述如何通过js文件找到WebSocket,并...

徐代龙
08/05
0
0
抓妹子图平台的实现,你们就是喜欢这种东西,对吧?(之五)websocket分析

福利,三俗,喜闻乐见 接下来给程序做个前端,借此体验下html5+websocket制作应用。由于当下html5的标准貌似还在发展中,python也没给出实现,所以自己手动实现个websocket服务器,其实是个不...

ueharaai
2013/08/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Android JNI 开发系列(九)JNI调用Java的静态方法&实例方法

JNI调用Java的静态方法&实例方法 import android.util.Log;/**- Created by peng on 2018/10/11. */ public class Person { /** - C/CPP 调用Java 静态方法 */ p......

蔡小鹏
3分钟前
0
0
Flink 原理与实现:Window 机制

Flink 认为 Batch 是 Streaming 的一个特例,所以 Flink 底层引擎是一个流式引擎,在上面实现了流处理和批处理。而窗口(window)就是从 Streaming 到 Batch 的一个桥梁。Flink 提供了非常完...

xtof
5分钟前
0
0
Fabric.js高级点的教程2--添加表格的方法

有时候我们先在画布上画一个表格类似一下设计软件那种。一方面作为参考线,一方面给人一直专业的赶脚。。。 先贴上一段网上(不是我写的)可以运行的代码 https://codepen.io/rodan8888/pen/e...

xmqywx
5分钟前
0
0
Java中Lambda表达式的使用

Java中Lambda表达式的使用 简介 (译者注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能。本人...

DemonsI
8分钟前
0
0
深入理解Java中停止线程

一.停止线程会带来什么? 对于单线程中,停止单线程就是直接使用关键字return或者break,但是在停止多线程时是让线程在完成任务前去开启另外一条线程,必须放弃当前任务,而这个过程是不可预...

Ala6
18分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部