Socket IO

Flask socket IO 是Flask应用程序能够访问客户端和服务器之间的低延迟双向通信。Socket IO可以保持backend和frontend之间实时双向通讯。Socket IO 主要使用了WebSocket协议。只要是支持socket.io 的语言都可以使用。scoket.io GitHub socket io的GitHub源码所在。

安装和依赖

直接使用pip3安装就行:

1
pip3 install flask-socketio

依赖

Flask socketio 这个扩展完全兼容了python2.7和python3.3+版本。对于flask Socket io的异步服务的推荐选择:

eventlet 推荐使用,这个效率比较高,支持长轮询和 WebSocket 传输。也可以直接用pip3 来安装

1
pip3 install eventlet

初始化

在Flask的程序中使用flask socket io:

1
2
3
4
5
6
7
8
9
from flask import Flask, render_template
from flask_socketio import SocketIO

app = Flask(__name__)
app.config['SECRET_KEY'] = 'vnkdjnfjknfl1232#'
socketio = SocketIO(app)

if __name__ == '__main__':
socketio.run(app)

app.config['SECRET_KEY'] 必须要配置,是为了保证加密传输的安全性。socketio.run 封装并替换了app.run的启动方式。在此环境下优先使用eventlet

以及在HTML里面怎么使用socket io:

1
2
3
4
5
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.7.3/socket.io.min.js"></script>
<script type="text/javascript">
var socket = io.connect('http://' + document.domain + ':' + location.port);
</script>

这里的document.domainlocation.port是web相对的IP和端口。可以自动适配,也可以手动修改成所需要的IP和端口。

接受和发送消息

接受消息在flask里面可以这样使用,这是msg可以是不同的数据类型,可以是json,str,也可以是多个参数的组合:

1
2
3
@socketio.on('receive')
def handle_receive(msg):
print ('You receive message: ', msg)

发送消息:

1
2
3
@socketio.on('send')
def handle_send(msg):
socketio.emit('receive', msg)

也可以只用send的方式发送。具体的可以查一下,一般只用定向发送。

在HTML里面接受数据的使用方法和在flask里面类似:

1
2
3
socket.on('receive', function( msg ) {
console.log(len, wid);
});

这样就可以接收到从后端传输的数据。

发送消息:

1
2
3
socket.emit('receive', {
msg: 'hello world'
});

这样后端就能接收到来自前端的消息。

之前写了一个用socket io实现的live chat给大家分享一下:

live chat

重点提示一下,socketio存在跨域问题,试过网上的好几种方法都不可以。找到了唯一能用的方法:

1
socketio = SocketIO(app, cors_allowed_origins='*')

最后:这两天事情有点多,等有时间重新详细写一下。。。

----- End Thanks for reading-----