澳门新蒲京娱乐

图片 17
PPT如何分享到朋友圈,目前市面上各种H5页面制作工具

【新蒲京官方下载】Python重要知识点总结,编写装饰器实现python请求错误重试功能

原理探究,WebSocket长连接心跳与短连接

python
websocket

在档次中用到socket.io抓实时推送,遂花了点时间看了socket.io完成,做个差不离解析,如有错漏,欢迎指正。

安装

1 概述

新蒲京官方下载 ,socket.io是一个基于WebSocket的CS的实时通信库,它底层基于engine.io。engine.io使用WebSocket和xhr-polling(或jsonp)封装了一套本身的说道,在不扶助WebSocket的低版本浏览器中(帮衬websocket的浏览器版本见这里)使用了长轮询(long
polling)来代替。socket.io在engine.io的根底上加码了namespace,room,自动重连等特点。

本文接下去会先简单介绍websocket协议,然后在此基础上教学下engine.io和socket.io协议以及源码分析,后续再经过例子表达socket.io的办事流程。

pip install websocket-client

2 WebSocket协议

大家精通,在HTTP 协议开发的时候,并不是为着双向通信程序准备的,早先的
web 应用程序只供给 “请求-响应”
就够了。由于历史原因,在创建拥有双向通讯机制的 web
应用程序时,就只可以动用 HTTP 轮询的办法,由此发出了 “短轮询” 和
“长轮询”(注意区分短连接和长连接)。

短轮询通过客户端定期轮询来打听服务端是不是有新的音讯发出,缺点也是醒目,轮询间隔大了则音讯不够实时,轮询间隔过小又会损耗过多的流量,扩张服务器的负担。长轮询是对短轮询的优化,供给服务端做相应的改动来支撑。客户端向服务端发送请求时,要是此时服务端没有新的音信产生,并比不上时回到,而是Hang住一段时间等有新的音讯可能逾期再重回,客户端收到服务器的答应后继续轮询。能够看看长轮询比短轮询可以减小大气没用的伸手,并且客户端接收取新音信也会实时不少。

就算如此长轮询比短轮询优化了不可胜言,但是每一趟请求照旧都要带上HTTP请求底部,而且在长轮询的连天实现之后,服务器端积累的新音信要等到下次客户端连接时才能传递。更好的点子是只用三个TCP连接来落实客户端和服务端的双向通讯,WebSocket商业事务便是为此而生。WebSocket是依据TCP的3个独自的协议,它与HTTP协议的唯一涉嫌就是它的握手请求能够看成二个Upgrade request路过HTTP服务器解析,且与HTTP使用相同的端口。WebSocket私下认可对平常请求使用80端口,协议为ws://,对TLS加密请求使用443端口,协议为wss://

拉手是由此3个HTTP Upgrade request早先的,3个请求和响应尾部示例如下(去掉了非亲非故的底部)。WebSocket握手请求底部与HTTP请求底部是拾叁分的(见OdysseyFC2616)。

## Request Headers ##
Connection: Upgrade
Host: socket.io.demo.com
Origin: http://socket.io.demo.com
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Key: mupA9l2rXciZKoMNQ9LphA==
Sec-WebSocket-Version: 13
Upgrade: websocket

## Response Headers ##
101 Web Socket Protocol Handshake
Connection: upgrade
Sec-WebSocket-Accept: s4VAqh7eedG0a11ziQlwTzJUY3s=
Sec-WebSocket-Origin: http://socket.io.demo.com
Server: nginx/1.6.2
Upgrade: WebSocket
  • Upgrade
    是HTTP/1.第11中学规定的用来转移当前接连的应用层协议的尾部,表示客户端希望用现有的连日转换来新的应用层协议WebSocket协议。

  • Origin
    用于幸免跨站攻击,浏览器一般会选拔那几个来标识原始域,对于非浏览器的客户端应用可以根据需求接纳。

  • 请求头中的 Sec-WebSocket-Version
    是WebSocket版本号,Sec-WebSocket-Key
    是用来握手的密钥。Sec-WebSocket-Extensions 和 Sec-WebSocket-Protocol
    是可挑选,暂不研商。

  • 一呼百应头中的 Sec-WebSocket-Accept 是将请求头中的 Sec-WebSocket-Key
    的值加上三个固定魔数258EAFA5-E914-47DA-95CA-C5AB0DC85B11经SHA1+base64编码后获取。总结进程的python代码示例(uwsgi中的落成见
    core/websockets.c的 uwsgi_websocket_handshake函数):

    magic_number = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
    key = 'mupA9l2rXciZKoMNQ9LphA=='
    accept = base64.b64encode(hashlib.sha1(key + magic_number).digest())
    assert(accept == 's4VAqh7eedG0a11ziQlwTzJUY3s=')
    
  • 客户端会检查响应头中的status code 和 Sec-WebSocket-Accept
    值是不是是期待的值,若是发现Accept的值不得法恐怕状态码不是101,则不会建立WebSocket连接,也不会发送WebSocket数据帧。

WebSocket琢磨使用帧(Frame)收发数据,帧格式如下。基于康宁考虑衡量,客户端发送给服务端的帧必须透过4字节的掩码(Masking-key)加密,服务端收到新闻后,用掩码对数据帧的Payload
Data实行异或运算解码获得数码(详见uwsgi的 core/websockets.c
中的uwsgi_websockets_parse函数),若是服务端收到未经掩码加密的数据帧,则应该及时关闭该WebSocket。而服务端发给客户端的多寡则不需求掩码加密,客户端假诺收到了服务端的掩码加密的多少,则也无法不关闭它。

 0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-------+-+-------------+-------------------------------+
     |F|R|R|R| opcode|M| Payload len |    Extended payload length    |
     |I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
     |N|V|V|V|       |S|             |   (if payload len==126/127)   |
     | |1|2|3|       |K|             |                               |
     +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
     |     Extended payload length continued, if payload len == 127  |
     + - - - - - - - - - - - - - - - +-------------------------------+
     |                               |Masking-key, if MASK set to 1  |
     +-------------------------------+-------------------------------+
     | Masking-key (continued)       |          Payload Data         |
     +-------------------------------- - - - - - - - - - - - - - - - +
     :                     Payload Data continued ...                :
     +---------------------------------------------------------------+

帧分为控制帧和数据帧,控制帧不能够分片,数据帧可以分片。首要字段表达如下:

  • FIN:
    没有分片的帧的FIN为1,分片帧的第三个分片的FIN为0,最终三个分片FIN为1。
  • opcode: 帧类型编号,在那之中央控制制帧:0x8 (Close), 0x9 (Ping), and 0xA
    (Pong),数据帧首要有:0x1 (Text), 0x2 (Binary)。
  • MASK:客户端发给服务端的帧MASK为1,Masking-key为加密掩码。服务端发往客户端的MASK为0,Masking-key为空。
  • Payload len和Payload Data分别是帧的数据长度和数目内容。

 

3 engine.io和socket.io

前方提到socket.io是基于engine.io的包裹,engine.io(协议版本3)有一套自身的说道,任何engine.io服务器都必须协助polling(包括jsonp和xhr)和websocket三种传输形式。engine.io使用websocket时有一套自个儿的ping/pong机制,使用的是opcode为0x1(Text)类型的数据帧,不是websocket商业事务规定的ping/pong类型的帧,标准的
ping/pong 帧被uwsgi使用

engine.io的数据编码分为Packet和Payload,当中 Packet是数据包,有6种档次:

  • 0 open:从服务端发出,标识1个新的传输格局已经开辟。
  • 1 close:请求关闭那条传输连接,可是它本人并不关门那么些接二连三。
  • 2
    ping:客户端周期性发送ping,服务端响应pong。注意那几个与uwsgi自带的ping/pong不平等,uwsgi里面发送ping,而浏览器再次来到pong。
  • 3 pong:服务端发送。
  • 4 message:实际发送的音信。
  • 5
    upgrade:在更换transport前,engine.io会发送探测包测试新的transport(如websocket)是不是可用,假如OK,则客户端会发送1个upgrade音信给服务端,服务端关闭老的transport然后切换成新的transport。
  • 6
    noop:空操作数据包,客户端收到noop音信会将事先等待暂停的轮询暂停,用于在接到到一个新的websocket强制一个新的轮询周期。

而Payload是指一层层绑定到手拉手的编码后的Packet,它只用在poll中,websocket里面使用websocket帧里面包车型的士Payload字段来传输数据。假若客户端不援助XH大切诺基2,则payload格式如下,在那之中length是数量包Packet的长短,而packet则是编码后的多寡包内容。

<length1>:<packet1>[<length2>:<packet2>[...]]

若辅助XHKuga2,则payload中内容总体以二进制编码,在那之中第一位0表示字符串,1象征二进制数据,而背后跟着的数字则是代表packet长度,然后以\xff结尾。假诺贰个尺寸为109的字符类型的数据包,则前边长度编码是
\x00\x01\x00\x09\xff,然后前边接packet内容。

<0 for string data, 1 for binary data><Any number of numbers between 0 and 9><The number 255><packet1 (first type,
then data)>[...]

engine.io服务器维护了2个socket的字典结构用于管理总是到该机的客户端,而客户端的标识正是sid。借使有多个worker,则需求确定保障同三个客户端的总是落在同样台worker上(能够配备nginx依照sid分发)。因为每一种worker只保险了一部分客户端连接,假使要援救广播,room等天性,则后端必要采纳redis 也许 RabbitMQ
音讯队列,使用redis的话则是通过redis的订阅发布机制落到实处多机多worker之间的信息推送。

socket.io是engine.io的包裹,在其基础上增加了活动重连,多路复用,namespace,room等特征。socket.io本人也有一套协议,它Packet类型分为(CONNECT 0, DISCONNECT 1, EVENT 2, ACK 3, ERROR 4, BINARY_EVENT 5, BINARY_ACK 6)。注意与engine.io的Packet类型有所不一样,可是socket.io的packet实际是依赖的engine.io的Message类型发送的,在后头实例中能够看来Packet的编码情势。当连接出错的时候,socket.io会通过自行重连机制再一次连接。

 

4 源码分析

在确立连接后,各种socket会被电动进入到八个暗中认可的命名空间/。在各样命名空间中,socket会被暗中同意出席多少个名为Nonesid的房间。None的屋子用于广播,而sid是当前客户端的session
id,用于单播。除暗中认可的房间外,大家得以根据要求将对应socket参预自定义房间,roomid唯一即可。socket.io基于engine.io,辅助websocket和long
polling。假设是long polling,会定时发送GET,
POST请求,当没有数据时,GET请求在拉取队列音信时会hang住(超时时间为pingTimeout),假若hang住中间服务器向来没有多少产生,则必要等到客户端发送下四个POST请求时,此时服务器会往队列中存款和储蓄POST请求中的音讯,那样上三个GET请求才会重临。借使upgrade到了websocket连接,则会定期ping/pong来保活连接。

为方便描述,下边提到的engine.io服务器对应源文件是engineio/server.py,engine.io套接字对应源文件engineio/socket.py,而socket.io服务器则对应socketio/server.py。下边分析下socket.io连接建立、音讯接收和发送、连接关闭进度。socket.io版本为1.9.0,engine.io版本为2.0.4。

先来看一下,长连接调用格局:

再三再四建立

率先,客户端会发送1个polling请求来确立连接。此时的伸手参数没有sid,表示要建立连接。
engine.io服务器通过handle_get_request()handle_post_request()措施来分别处理开始化连接以及长轮询中的
GET 和 POST 请求。

socket.io在初叶化时便登记了三个事件到engine.io的handlers中,分别是connect(处理函数_handle_eio_connect),message(_handle_eio_message),disconnect(_handle_eio_disconnect),在engine.io套接字接收到了上述四个品类的新闻后,在自身做了对应处理后都会触发socket.io中的对应的处理函数做进一步处理。

当接到到GET请求且没有sid参数时,则engine.io服务器会调用
_handle_connect()措施来建立连接。这一个点子首要工作是为近来客户端生成sid,成立Socket对象并保留到engine.io服务器的sockets集合中。做了那个开始化学工业作后,engine.io服务器会发送叁个OPEN类型的多少包给客户端,接着会触发socket.io服务器的connect事件。

客户端第贰次一连的时候,socket.io也要做一些起初化的做事,那是在socket.io服务器的_handle_eio_connect()处理的。那里做的政工要害有几点:

  • 开端化manager,比如用的是redis做后端队列的话,则必要开始化redis_manager,包涵安装redis连接配置,订阅频道,私下认可频道是”socket.io”,借使采用flask_socketio则频道是”flask_socketio”,若是用到gevent,则还要对redis模块的socket库打monkey-patch等。

  • 将该客户端出席到默许房间None,sid中。

  • 调用代码中对connect事件注册的函数。如上面那些,注意下,socket.io中也有个用于事件处理的handlers,它保存的是在后端代码中对socket.io事件注册的函数(开发者定义的),而engine.io的handlers中保留的函数是socket.io注册的那多少个针对connect,message和disconnect事件的一直的处理函数。

    socketio.on("connect")
    def test_connect():
        print "client connected"
    
  • 发送一个sockeio的connect数据包给客户端。

末段在响应中engine.io会为客户端设置3个名为io值为sid的cookie,响应内容payload蕴含七个数据包,2个是engine.io的OPEN数据包,内容为sid,ping提姆eout等配备和参数;另二个是socket.io的connect数据包,内容为40。个中4象征的是engine.io的message音信,0则代表socket.io的connect新闻,以字节流回到。这里的pingTimeout客户端和服务端共享那些布局,用于检查和测试对端是或不是过期。

跟着会发送一个轮询请求和websocket握手请求,假如websocket握手成功后客户端会发送2 probe探测帧,服务端回应3 probe,然后客户端会发送内容为5的Upgrade帧,服务端回应内容为6的noop帧。探测帧检查通过后,客户端截止轮询请求,将传输通道转到websocket连接,转到websocket后,接下去就从头为期(私下认可是25秒)的
ping/pong(那是socket.io自定义的ping/pong,除了这么些之外,uwsgi也会定期(暗中认可30秒)对客户端ping,客户端回应pong,这一个在chrome的Frames里面是看不到的,须求重视wireshark或然用任何浏览器插件来考察)。

    ws = websocket.WebSocketApp("ws://echo.websocket.org/",
                              on_message = on_message,
                              on_error = on_error,
                              on_close = on_close)
    ws.on_open = on_open
    ws.run_forever()

服务端音讯接收流程

对接收新闻的则统一通过engine.io套接字的receive()函数处理:

  • 对于轮询,一旦接到了polling的POST请求,则会调用receive往该socket的新闻队列之中发送音信,从而释放从前hang住的GET请求。
  • 对于websocket:
    • 收下了ping,则会即时响应3个pong。
    • 接过到了upgrade音讯,则立即发送多个noop音信。
    • 收受到了message,则调用socket.io注册到engine.io的_handle_eio_message措施来拍卖socket.io自身定义的各类新闻。

 

服务端音讯发送流程

而服务端要给客户端发送音信,则必要通过socket.io服务器的emit方法,注意emit方法是本着room来发送新闻的,如若是context-aware的,则emit暗中认可是对namespace为/且room名为sid的屋子发送,借使是context-free的,则暗中同意是广播即对富有连接的客户端发送音讯(当然在context-free的场景上面,你也能够内定room来只给钦点room推送新闻)。

socket.io要兑现多进度以及广播,房间等效果,势必必要衔接三个redis之类的新闻队列,进而socket.io的emit会调用对应队列管理器pubsub_manager的emit方法,比如用redis做消息队列则最后调用
redis_manager中的_publish()
方法通过redis的订阅公布作用将消息推送到flask_socketio频道。另一方面,全数的socket在连年时都订阅了
flask_socketio频道,而且都有3个协程(或线程)在监听频道中是或不是有消息,一旦有音信,就会调用pubsub_manager._handle_emit()方法对本机对应的socket发送对应的音信,最后是经过socket.io服务器的_emit_internal()艺术达成对本机中room为sid的富有socket发送音讯的,假若room为None,则就是广播,即对全体连接到本机的持有客户端推送信息。

socket.io服务器发送音讯要基于engine.io音信包装,所以归咎到底依然调用的engine.io套接字中的send()措施。engine.io为各种客户端都会维护叁个音信队列,发送数据都以先存到行列之中待拉取,websocket除了探测帧之外的任何数据帧也都是透过该音讯队列发送。

 长连接,参数介绍:

关门连接(只分析websocket)

websocket大概那么些关闭的情状多多。比如客户端发了ping后等候pong超时关闭,服务端接收到ping跟上2个ping之间超过了ping提姆eout;用的uwsgi的话,uwsgi发送ping,如若在websockets-pong-tolerance(暗许3秒)内收纳不到pong回应,也会倒闭连接;还有倘若nginx的proxy_read_timeout配置的比pingInterval小等。

若果不是客户端主动关闭连接,socket.io就会在连接出错后不停重试以树立连接。重试间隔和重试次数由reconnectionDelayMax(默认5秒)reconnectionAttempts(私下认可一贯重连)设定。下边商量客户端符合规律关闭的景色,各个卓殊关闭状态请具体意况具体分析。

客户端主动关闭

假若客户端调用socket.close()主动关闭websocket连接,则会首发送二个音信41(4:engine.io的message,1:socket.io的disconnect)再关闭连接。如前方提到,engine.io套接字接收到音讯后会交给socket.io服务器注册的
_handle_eio_message()处理。最终是调用的socket.io的_handle_disconnect(),该函数工作包含调用socketio.on("disconnect")挂号的函数,将该客户端从进入的屋子中移除,清理环境变量等。

uwsgi而接受到客户端关闭websocket连接音讯后会关闭服务端到客户端的一而再。engine.io服务器的websocket数据接受例程ws.wait()因为三番五次关闭报IOError,触发服务端循环收发数据经过截止,并从保卫安全的sockets集合中移除这些闭馆的sid。然后调用engine.io套接字的close(wait=True, abort=True)措施,由于是客户端主动关闭,那里就不会再给客户端发送三个CLOSE音讯。而
engine.io服务器的close方法同样会触发socket.io以前注册的disconnect事件处理函数,由于前面早已调用_handle_disconnect()处理了倒闭连接事件,所以那里_handle_eio_disconnect()不必要再做别的操作(那几个操作不是多余的,其功效见后一节)。

浏览器关闭

直接关闭浏览器发送的是websocket的标准CLOSE音讯,opcode为8。socket.io服务端处理情势基本一致,由于那种处境下并从未发送socket.io的关门音信41,socket.io的关闭操作供给等到engine.io触发的_handle_eio_disconnect()中拍卖,那正是前一节中缘何engine.io服务器前边还要多调用二次
_handle_eio_disconnect()的原故所在。

(1)url:
websocket的地址。

5 实例

斟酌表明不难令人有点头晕,websocket,engine.io,socket.io,各自行车运动组织议是如何做事的,看看实例可能会比较清楚,为了方便测试,作者写了个Dockerfile,安装了docker的童鞋能够拉取代码执行
bin/start.sh 即可运营拥有完全的
nginx+uwsgi+gevent+flask_socketio测试环境的容器起初测试,浏览器打开http://127.0.0.1即可测试。async_mode用的是gevent_uwsgi,完整代码见
这里。

对于不协助websocket的低版本浏览器,socket.io会退化为长轮询的办法,通过为期的出殡和埋葬GET,
POST请求来拉取数据。没有多少时,会将呼吁数据的GET请求hang住,直到服务端有数量发生也许客户端的POST请求将GET请求释放,释放之后会随着再一次发送叁个GET请求,除此而外,协议分析和拍卖流程与websocket形式基本一致。实例只针对使用websocket的拓展解析

为了考察socket.io客户端的调用流程,能够设置localStorage.debug = '*';,测试的前段代码片段如下(完整代码见仓库):

 <script type="text/javascript" charset="utf-8">
    var socket = io.connect('/', {
        "reconnectionDelayMax": 10000,
        "reconnectionAttempts": 10
    });
    socket.on('connect', function() {
        $('#log').append('<br>' + $('<div/>').text('connected').html());
    })

    $(document).ready(function() {

        socket.on('server_response', function(msg) {
            $('#log').append('<br>' + $('<div/>').text('Received from server: ' + ': ' + msg.data).html());
        });

        $('form#emit').submit(function(event) {
            socket.emit('client_event', {data: $('#emit_data').val()});
            return false;
        });
    });

 </script>

测试代码相比较不难,引入socket.io的js库文件,然后在连年成功后在页面展现“connected”,在输入框输入文字,能够透过连接发送至服务器,然后服务器将浏览器发送的字符串加上server标识回显回来。

(2)header:
客户发送websocket握手请求的乞请头,{‘head1:value1′,’head2:value2’}。

创立连接

在chrome中开拓页面能够阅览发了1个请求,分别是:

1 http://127.0.0.1/socket.io/?EIO=3&transport=polling&t=MAkXxBR
2 http://127.0.0.1/socket.io/? EIO=3&transport=polling&t=MAkXxEz&sid=9c54f9c1759c4dbab8f3ce20c1fe43a4
3 ws://127.0.0.1/socket.io/?EIO=3&transport=websocket&sid=9c54f9c1759c4dbab8f3ce20c1fe43a4

呼吁暗中认可路径是/socket.io,注意命名空间并不会在路子中,而是在参数中传送。第三个请求是polling,EIO是engine.io协议的版本号,t是二个随便字符串,第6个请求时还还未曾生成sid。服务端接收到新闻后会调用engine.io/server.py_handle_connect()建立连接。

重回的结果是

## Response Headers: Content-Type: application/octet-stream ##
�ÿ0{"pingInterval":25000,"pingTimeout":60000,"upgrades":["websocket"],"sid":"9c54f9c1759c4dbab8f3ce20c1fe43a4"}�ÿ40

能够看看,那里再次来到的是字节流的payload,content-type为”application/octet-stream”。这一个payload其实包蕴八个packet,第③个packet是engine.io的OPEN消息,类型为0,它的始末为pingInterval,pingTimeout,sid等;首个packet类型是4(message),而它的数码内容是0,表示socket.io的CONNECT。而在这之中的看起来乱码的有个别其实是眼下提到的payload编码中的长度的编码\x00\x01\x00\x09\xff\x00\x02\xff

  • 第1个请求是轮询请求,固然websocket建立并测试成功(使用内容为probe的ping/pong帧)后,会暂停轮询请求。可以看看轮询请求平素hang住到websocket建立并测试成功后才回到,响应结果是�ÿ6,前边乱码部分是payload长度编码\x00\x01\xff,前面包车型大巴数字6是engine.io的noop音信。

  • 第②个请求是websocket握手请求,握手成功后,能够在chrome的Frames里面来看websocket的多少帧交互流程,能够看看如前方分析,确实是头阵的探测帧,然后是Upgrade帧,接着正是定期的ping/pong帧了。

    2probe
    3probe
    5
    2
    3
    ...
    

(3)on_open:在成立Websocket握手时调用的可调用对象,这几个主意唯有一个参数,正是此类自个儿。

客户端发送消息给服务端

要是要发送新闻给服务器,在浏览器输入框输入test,点击echo按钮,能够见见websocket发送的帧的内容如下,当中4是engine.io的message类型标识,2是socket.io的EVENT类型标识,而前边则是事件名称和数目,数据足以是字符串,字典,列表等品类。

42["client_event",{"data":"test"}]

(4)on_message:这些目的在收到到服务器重回的音讯时调用。有七个参数,3个是此类本人,3个是大家从服务器获取的字符串(utf-8格式)。

服务端接收新闻流程

而服务端接收新闻并重临一个新的event为”server_response”,数据为”TEST”,代码如下,当中socketio是flask_socketio模块的SocketIO对象,它提供了装饰器方法
on将自定义的client_event和拍卖函数test_client_event注册到sockerio服务器的handlers中。

当收到到 client_event 消息时,会通过sockerio/server.py中的
_handle_eio_message()方式处理音信,对于socket.io的EVENT类型的消息最后会通过_trigger_event()主意处理,该方式也正是从handlers中得到client_event对应的处理函数并调用之。

from flask_socketio import SocketIO, emit
socketio = SocketIO(...)

@socketio.on("client_event")
def test_client_event(msg):
    emit("server_response", {"data": msg["data"].upper()})

(5)on_error:那么些指标在遇见错误时调用,有八个参数,第一个是此类自身,第二个是不行对象。

服务端发送音信到客户端

服务端发送新闻通过
flask_socketio提供的emit方法落成,如前一节分析的,最后依然通过的engine.io包装成engine.io的新闻格式后发生。

42["server_response",{"data":"TEST"}]

(6)on_close:在遭受一连关闭的情形时调用,参数只有三个,便是此类自己。

关闭连接

客户端要高歌猛进关闭连接,在JS中调用 socket.close()
即可,此时发送的数码包为
41,在那之中4意味的是engine.io的音信类型message,而数据1则是指的socket.io的音信类型disconnect,关闭流程见上一章的认证。

(7)on_cont_message:这么些目标在收受到连年帧数据时被调用,有七个参数,分别是:类本身,从服务器接受的字符串(utf-8),一而再标志。

6 总结

本文示例中,为了方便分析,只用了暗中认可的namespace和room,而在骨子里项目中能够依据作业供给采用namespace,room等高档本性。

nginx+uwsgi动用socket.io时,当用到websocket时,注意nginx的晚点配置proxy_read_timeout和uwsgi的websocket超时配置websocket-ping-freq和websockets-pong-tolerance,配置不当会造成socke.io因为websocket的ping/pong超时而持续重连。

(8)on_data:当从服务器收到到音信时被调用,有多个参数,分别是:该类本人,接收到的字符串(utf-8),数据类型,再三再四标志。

参考资料

  • https://tools.ietf.org/html/rfc6455
  • https://www.nginx.com/blog/websocket-nginx/
  • https://security.stackexchange.com/questions/36930/how-does-websocket-frame-masking-protect-against-cache-poisoning
  • https://github.com/suexcxine/blog/blob/master/source/\_posts/websocket.md
  • https://github.com/abbshr/abbshr.github.io/issues/47
  • https://socket.io/docs/logging-and-debugging/
  • http://uwsgi-docs.readthedocs.io/en/latest/WebSockets.html
  • https://flask-socketio.readthedocs.io/en/latest/

(9)keep_running:贰个二进制的标志位,假设为True,那么些app的主循环将持续运营,默许值为True。

(10)get_mask_key:用于发生三个掩码。

(11)subprotocols:一组可用的子协议,私下认可为空。

 

长连接首要办法:ws.run_forever(ping_interval=60,ping_timeout=5)

 倘若持续开关闭websocket连接,会直接不通下去。其它那个函数带五个参数,假若传的话,运维心跳包发送。

 

ping_interval:自动发送“ping”命令,种种钦命的时间(秒),要是设置为0,则不会活动发送。

相关文章

No Comments, Be The First!
近期评论
    功能
    网站地图xml地图