使用flask_socketio实现客户端间即时通信

Posted dark-fire-liehuo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用flask_socketio实现客户端间即时通信相关的知识,希望对你有一定的参考价值。

前期没有来得及好好总结,现在复习总结一下:

Socket.IO 背后主要的思想是你可以发送和接收想要的任何事件,携带你想要的任何数据。任何可以编码为 JSON 的对象都可以做到,并且也支持二进制数据。

1.Express 初始化 app 作为功能处理器,你可以将它传给 HTTP 服务器。

2.定义一个路由处理器 / ,当我们访问网站主页时就会调用这个处理器。

3.HTTP 服务器监听端口 3000。

通过传递 http(HTTP 服务器)对象初始化了一个 socket.io 的新实例。然后为到来的 socket 监听 connection 事件,并且输入日志到控制台。

这将加载 socket.io-client,创建全局变量 io,并且连接

 下一个目标是我们从服务器发送事件给其他用户。

为了发送事件给所有人,Socket.IO 给我们提供了 io.emit:

io.emit(‘some event‘, { for: ‘everyone‘ });

如果你想发送一个确定 socket 的消息给所有人,我们有 broadcast 标识:

io.on(‘connection‘, function(socket){
  socket.broadcast.emit(‘hi‘);
});

 下面是参考:http://www.cnblogs.com/luozx207/p/9719597.html

    关于flask_socketio的入门可以看我的上一篇博客《使用flask_socketio实现服务端向客户端定时推送》

  用socketio实现即时通信十分简单,只需要客户端发送用户输入的信息到后端,后端再将此信息广播到所有连接到此命名域的客户端就可以了。

from flask import Flask, render_template
from flask_socketio import SocketIO,emit

app = Flask(__name__)
app.config[SECRET_KEY] = secret!
socketio = SocketIO(app)

@app.route(/)
def index():
    return render_template(index.html)

@socketio.on(imessage, namespace=/test_conn)
def test_message(message):
    emit(message,//后端广播信息的事件名最好跟前端发送信息的事件名不一样
         {data: message[data]},
         broadcast=True)

if __name__ == __main__:
    socketio.run(app, debug=True)

  关键就是要在emit中加broadcast=True这一项,如果不加,只有发送信息的客户端能收到消息

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript" src="//code.jquery.com/jquery-1.4.2.min.js"></script>
    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.5/socket.io.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function() {
            namespace = ‘/test_conn‘;
            var socket = io.connect(location.protocol + ‘//‘ + document.domain + ‘:‘ + location.port + namespace);
       //连接后发送日志 socket.on(
‘connect‘, function(){ console.log(‘connected‘) });
       //点击发送时将text框的内容发送到后端 $(
‘form#emit‘).submit(function(event) { socket.emit(‘imessage‘, {data: $(‘#emit_data‘).val()}); return false; });
       //接收后端广播的信息 socket.on(
‘message‘, function(msg) { $(‘#log‘).append(‘<br>‘ + $(‘<div/>‘).text(msg.data).html()); }); }); </script> </head> <body> <form id="emit" method="POST" action=‘#‘> <input type="text" name="emit_data" id="emit_data" placeholder="Message"> <input type="submit" value="发送"> </form> <h2>Receive:</h2> <div id="log"></div> </body> </html>

  打开两个网页都连接到http://127.0.0.1:5000/,测试一下,一个网页发送的信息在另一个网页也可以及时收到。一个简陋的多人聊天系统完成了:)

以上是关于使用flask_socketio实现客户端间即时通信的主要内容,如果未能解决你的问题,请参考以下文章

Flask_socketIO 不与第二个客户端通信

LinkedIn的即时消息:在一台机器上支持几十万条长连接

flask_socketio踩到的坑

物流即时查询功能-申通快递

如何实现在安装新版软件的同时静默卸载掉电脑里指定的一款软件?谢谢!

IM即时通讯开发用Netty实现心跳机制断线重连机制