文档章节

基于Server-Sent Event的简单在线聊天室

实验楼
 实验楼
发布于 2014/12/16 17:10
字数 284
阅读 201
收藏 1
#!/usr/bin/env python    
import datetime    
import flask    
import redis 
   
app = flask.Flask(__name__)    
app.secret_key = 'asdf'    
red = redis.StrictRedis(host='localhost', port=6379, db=6)    

def event_stream():    
pubsub = red.pubsub()    
pubsub.subscribe('chat')    
# TODO: handle client disconnection.    
for message in pubsub.listen():    
print message    
yield 'data: %s\n\n' % message['data']    

@app.route('/login', methods=['GET', 'POST'])    
def login():    
if flask.request.method == 'POST':    
flask.session['user'] = flask.request.form['user']    
return flask.redirect('/')    
return '<form action="" method="post">user: <input name="user">'    

@app.route('/post', methods=['POST'])    
def post():    
message = flask.request.form['message']    
user = flask.session.get('user', 'anonymous')    
now = datetime.datetime.now().replace(microsecond=0).time()    
red.publish('chat', u'[%s] %s: %s' % (now.isoformat(), user, message))    
return flask.Response(status=204)    

@app.route('/stream')    
def stream():    
return flask.Response(event_stream(),    
mimetype="text/event-stream")    

@app.route('/')    
def home():    
if 'user' not in flask.session:    
return flask.redirect('/login')    
return u"""    
        <!doctype html>    
        <title>chat</title>    
        <script src="http://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>    

        <style>body { max-width: 500px; margin: auto; padding: 
1em; background: black; color: #fff; font: 16px/1.6 menlo, monospace; 
}</style>    
        <p><b>hi, %s!</b></p>    
        <p>Message: <input id="in" /></p>    
        <pre id="out"></pre>    
        <script>    
            function sse() {    
                var source = new EventSource('/stream');    
                var out = document.getElementById('out');    
                source.onmessage = function(e) {    
                    // XSS in chat is fun    
                    out.innerHTML =  e.data + '\\n' + out.innerHTML;    
                };    
            }    
            $('#in').keyup(function(e){    
                if (e.keyCode == 13) {    
                    $.post('/post', {'message': $(this).val()});    
                    $(this).val('');    
                }    
            });    
            sse();    
        </script>    
   
 """ % flask.session['user']    

if __name__ == '__main__':    
app.debug = True    
app.run(host='0.0.0.0', port=8989, threaded=True)    
Status
API
Training
Shop
Blog
About

      
    

    
© 2014 GitHub, Inc.
Terms
Privacy
Security
Contact

安装运行后,以下为效果图:

详细内容和讲解请登录实验楼官方网站:http://www.shiyanlou.com/courses/81

© 著作权归作者所有

实验楼
粉丝 31
博文 31
码字总数 60531
作品 0
成都
私信 提问
webpack热更新原理WebSocket与EventSource

开发环境页面热更新早已是主流,常见的需求如赛事网页推送比赛结果、网页实时展示投票或点赞数据、在线评论或弹幕、在线聊天室等,都需要借助热更新功能,才能达到实时的端对端的极致体验。 ...

筱飞
2018/04/16
1K
0
[Qt] 基于Tcp协议的聊天室实现

时间:2017年6月21日 一、写在前面: 平时做图形学的东西多一些,虽然一直对网络编程很感兴趣,但是没有什么机会去尝试一下。最近正好赶上期末的课程实习,然后就参考Qt官方的 Network Prog...

Mahabharata_
2017/06/22
0
0
PUSHER -跨平台消息推送

消息推送平台官方网站: https://pusher.com/docs/javascriptquickstart 特性功能: Flexible Pub/Sub Messaging 灵活的订阅/发布消息机制 Instantly update browsers, mobiles and IoT devic......

swingcoder
2016/03/25
277
0
小试 Red5 流媒体服务器

1. 什么是Red5. Red5是一个开源项目,用于实现flash与服务器端之间通过rtmp(real time messaging protocal)协议通信,可以实现视频、音频的传输,remote shared object等等。相对于FMS, Red5...

红薯
2010/04/15
13.3K
6
聊天室应用开发实践(二):实现基于 Web 的聊天室

在上一篇内容中,作者 monkeyHi 已经分享了声网Agora 信令 SDk 的基本使用,可实现的场景,并分析了服务器端 Demo 的接口原理。这一篇,作者将带大家进行简单的实践,实现一个基于 Web 的简单...

声网Agora
04/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

编程作业20190210900169

1编写一个程序,提示用户输入名和姓,然后以“名,姓”的格式打印出来。 #include <stdio.h>#include <stdlib.h> int main(){ char firstName[20]; char lastName[20]; print......

1李嘉焘1
34分钟前
6
0
补码的优点及原理分析

只讨论整数 1.计算机内部为什么没有减法器? 减法运算本身其实就是加法,如x - y即x +(-y),所以只需要将负数成功表示出来并可以参加加法运算,那加法器就可同时实现“+”和“-”的运算。这...

清自以敬
50分钟前
70
0
Docker 可视化管理 portainer

官网安装指南: https://portainer.readthedocs.io/en/latest/deployment.html docker-compose.yml 位置,下载地址:https://downloads.portainer.io/docker-compose.yml...

Moks角木
今天
7
0
Spring Security 实战干货:必须掌握的一些内置 Filter

1. 前言 上一文我们使用 Spring Security 实现了各种登录聚合的场面。其中我们是通过在 UsernamePasswordAuthenticationFilter 之前一个自定义的过滤器实现的。我怎么知道自定义过滤器要加在...

码农小胖哥
今天
9
0
常见分布式事务解决方案

1 微服务的发展 微服务倡导将复杂的单体应用拆分为若干个功能简单、松耦合的服务,这样可以降低开发难度、增强扩展性、便于敏捷开发。当前被越来越多的开发者推崇,很多互联网行业巨头、开源...

asdf08442a
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部