Python WebSocket长连接心跳与短连接的示例


Posted in Python onNovember 24, 2020

安装

pip install websocket-client

先来看一下,长连接调用方式:

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()

 长连接,参数介绍:

(1)url: websocket的地址。

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

(3)on_open:在建立Websocket握手时调用的可调用对象,这个方法只有一个参数,就是该类本身。

(4)on_message:这个对象在接收到服务器返回的消息时调用。有两个参数,一个是该类本身,一个是我们从服务器获取的字符串(utf-8格式)。

(5)on_error:这个对象在遇到错误时调用,有两个参数,第一个是该类本身,第二个是异常对象。

(6)on_close:在遇到连接关闭的情况时调用,参数只有一个,就是该类本身。

(7)on_cont_message:这个对象在接收到连续帧数据时被调用,有三个参数,分别是:类本身,从服务器接受的字符串(utf-8),连续标志。

(8)on_data:当从服务器接收到消息时被调用,有四个参数,分别是:该类本身,接收到的字符串(utf-8),数据类型,连续标志。

(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,则不会自动发送。

ping_timeout:如果没有收到pong消息,则为超时(秒)。

ws.run_forever(ping_interval=60,ping_timeout=5)#ping_interval心跳发送间隔时间#ping_timeout 设置,发送ping到收到pong的超时时间

我们看源代码,会发现这样一断代码:

ping的超时时间,要大于ping间隔时间

if not ping_timeout or ping_timeout <= 0:
      ping_timeout = None
    if ping_timeout and ping_interval and ping_interval <= ping_timeout:
      raise WebSocketException("Ensure ping_interval > ping_timeout")

长连接:

示例1:

import websocket
try:
  import thread
except ImportError:
  import _thread as thread
import time

def on_message(ws, message):
  print(message)

def on_error(ws, error):
  print(error)

def on_close(ws):
  print("### closed ###")


def on_open(ws):
  def run(*args):
    ws.send("hello1")
    time.sleep(1)
    ws.close()
  thread.start_new_thread(run,())

if __name__ == "__main__":
  websocket.enableTrace(True)
  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(ping_interval=60,ping_timeout=5)

示例2:

import websocket
from threading import Thread
import time
import sys


class MyApp(websocket.WebSocketApp):
  def on_message(self, message):
    print(message)

  def on_error(self, error):
    print(error)

  def on_close(self):
    print("### closed ###")

  def on_open(self):
    def run(*args):
      for i in range(3):
        # send the message, then wait
        # so thread doesn't exit and socket
        # isn't closed
        self.send("Hello %d" % i)
        time.sleep(1)

      time.sleep(1)
      self.close()
      print("Thread terminating...")

    Thread(target=run).start()


if __name__ == "__main__":
  websocket.enableTrace(True)
  if len(sys.argv) < 2:
    host = "ws://echo.websocket.org/"
  else:
    host = sys.argv[1]
  ws = MyApp(host)
  ws.run_forever()

短连接:

from websocket import create_connection
ws = create_connection("ws://echo.websocket.org/")
print("Sending 'Hello, World'...")
ws.send("Hello, World")
print("Sent")
print("Receiving...")
result = ws.recv()
print("Received '%s'" % result)
ws.close()

以上就是Python WebSocket长连接心跳与短连接的示例的详细内容,更多关于Python WebSocket连接的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
TensorFlow 滑动平均的示例代码
Jun 19 Python
详解Python3网络爬虫(二):利用urllib.urlopen向有道翻译发送数据获得翻译结果
May 07 Python
Python格式化字符串f-string概览(小结)
Jun 18 Python
python实现从本地摄像头和网络摄像头截取图片功能
Jul 11 Python
pytorch 加载(.pth)格式的模型实例
Aug 20 Python
Python3 pandas 操作列表实例详解
Sep 23 Python
利用PyCharm操作Github(仓库新建、更新,代码回滚)
Dec 18 Python
Django restframework 框架认证、权限、限流用法示例
Dec 21 Python
彻底搞懂 python 中文乱码问题(深入分析)
Feb 28 Python
Python如何实现邮件功能
May 27 Python
Python中zipfile压缩文件模块的基本使用教程
Jun 14 Python
pytorch 梯度NAN异常值的解决方案
Jun 05 Python
Python 利用Entrez库筛选下载PubMed文献摘要的示例
Nov 24 #Python
python实现企业微信定时发送文本消息的示例代码
Nov 24 #Python
python爬虫快速响应服务器的做法
Nov 24 #Python
PyCharm Community安装与配置的详细教程
Nov 24 #Python
python3爬虫GIL修改多线程实例讲解
Nov 24 #Python
Django URL参数Template反向解析
Nov 24 #Python
python3爬虫中引用Queue的实例讲解
Nov 24 #Python
You might like
来自phpguru得Php Cache类源码
2010/04/15 PHP
解析thinkphp中的导入文件标签
2013/06/20 PHP
php中单个数据库字段多列显示(单字段分页、横向输出)
2014/07/28 PHP
PHP实现基于文本的摩斯电码生成器
2016/01/11 PHP
PHP.vs.JAVA
2016/04/29 PHP
jQuery EasyUI API 中文文档 - Pagination分页
2011/09/29 Javascript
ASP.NET MVC中EasyUI的datagrid跨域调用实现代码
2012/03/14 Javascript
浅谈javascript回调函数
2014/12/07 Javascript
Javascript基础教程之数据类型 (字符串 String)
2015/01/18 Javascript
JS实现的生成随机数的4个函数分享
2015/02/11 Javascript
JavaScript实现动态删除列表框值的方法
2015/08/12 Javascript
javascript实现获取指定精度的上传文件的大小简单实例
2016/10/25 Javascript
bootstrap按钮插件(Button)使用方法解析
2017/01/13 Javascript
深入探究angular2 UI组件之primeNG用法
2017/07/26 Javascript
Vue源码学习之初始化模块init.js解析
2017/11/02 Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
2017/12/09 Javascript
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
2019/05/08 Javascript
ionic4+angular7+cordova上传图片功能的实例代码
2019/06/19 Javascript
从源码角度来回答keep-alive组件的缓存原理
2021/01/18 Javascript
详解Django中Request对象的相关用法
2015/07/17 Python
python用模块zlib压缩与解压字符串和文件的方法
2016/12/16 Python
关于Python数据结构中字典的心得
2017/12/04 Python
python flask安装和命令详解
2019/04/02 Python
解析python的局部变量和全局变量
2019/08/15 Python
详解Python yaml模块
2020/09/23 Python
英国天然有机美容护肤品:Neal’s Yard Remedies
2018/05/05 全球购物
5个HTML5的常用本地存储方式详解与介绍
2021/03/27 HTML / CSS
编辑求职信样本
2013/12/16 职场文书
化学教师教学反思
2014/01/17 职场文书
《台湾的蝴蝶谷》教学反思
2014/02/20 职场文书
环境保护与污染治理求职信
2014/07/16 职场文书
法定代表人授权委托书范文
2014/09/22 职场文书
财产分割协议书
2016/03/22 职场文书
vue项目多环境配置(.env)的实现
2021/07/21 Vue.js
Java死锁的排查
2022/05/11 Java/Android
JavaScript原型链中函数和对象的理解
2022/06/16 Javascript