Python-socketio其实是socket.io的一种python实现,其实在python中socketio还有一个叫[Githug]flask-socketio,看名字就能看得出来这个sockeio是和flask框架进行结合的,这篇文章对这个不做任何介绍了,因为在web框架上我们的首选是django,但是如果你自习去看flask-socketio的文档的话,你可以看出关于socketio的通信部分的语法都是一模一样的,区别大不。
一、socketio基本说明
Socket.io是一个WebSocket库,包括了客户端的js和服务器端的nodejs,它的目标是构建可以在不同浏览器和移动设备上使用的实时应用。它会自动根据浏览器从WebSocket、AJAX长轮询、Iframe流等等各种方式中选择最佳的方式来实现网络实时应用,非常方便和人性化,而且支持的浏览器最低达IE5.5,主要特点如下:
- 实时分析:将数据推送到客户端,这些客户端会被表示为实时计数器,图表或日志客户。
- 实时通信和聊天:只需几行代码便可写成一个Socket.IO的”Hello,World”聊天应用。
- 二进制流传输:从1.0版本开始,Socket.IO支持任何形式的二进制文件传输,例如:图片,视频,音频等。
- 文档合并:允许多个用户同时编辑一个文档,并且能够看到每个用户做出的修改。
socket.io是要求前后端必须配套使用的,如果你准备在前段使用socket.io来进行websocket通信,那么服务器端就必须使用socketio,否则websocket是建立不起来的。我们都知道在前段上是没得选择的,只能使用socket.io.js来进行实现,但是在后台的选择上我们可以采用多种方式,具体可以查看socket.io官网的说明。主要有下面的几种
而我们的选择就是python版本的实现,python-socketio。
二、Python-socketio概览
Python-socketio的文档写的相对比较详细,查看官方的文档内容,一定程度能够提前让自己有比较详尽的概念和了解,但是具体编码的时候建议还是看下github上的样例,感觉英文的官方文档虽然能看懂,但是理解上总感觉有偏差,还是直接看样例代码比较靠谱。
python-socketio因为只是一个实时通信的框架,在后台上还是要依托一个http server框架来进行运行,那么在官方的文档里面,提供了很多种的实现方式,比如tornado,uwsgi,gevent等等。也包括前面提到的flask,django这些web框架。
python-socketio的server端的服务器功能跟socket.io nodejs版本的功能没啥大的区别,都包含了连接,断开,消息发送,广播等等多种消息,但是在消息体上还是有一定的区别,这点需要注意,尤其是要将nodejs实现的socket.io替换为python-socketio的时候,尤其要注意。
nodejs上server端向前台发送消息可以直接这样写
sio.emit(“eventname”,arg1,arg2,arg3)
然后前端获取到的就是一个数组
[“eventname”,arg1,arg2,arg3]
但是在python-socketio中就不能这么写,这个可以看下源码的参数
def emit(self, event, data=None, to=None, room=None, skip_sid=None,
namespace=None, callback=None, **kwargs):那么在写的时候就必须把所有要发送给client前段的字段进行打包,比如使用下面的方式
sio.emit(“eventname”,json.dumps([arg1,arg2,arg3])),
然后前端获取到的就是另外一个结构[“eventname”,[arg1,arg2,arg3]]
这样就能确保前段无感了。
其他地方几乎没有变化,直接替换即可。