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 相关文章推荐
Python pickle模块用法实例分析
May 27 Python
回调函数的意义以及python实现实例
Jun 20 Python
关于Python数据结构中字典的心得
Dec 04 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
Apr 27 Python
将python图片转为二进制文本的实例
Jan 24 Python
详解Python并发编程之创建多线程的几种方法
Aug 23 Python
Python之——生成动态路由轨迹图的实例
Nov 22 Python
python plt可视化——打印特殊符号和制作图例代码
Apr 17 Python
Django Session和Cookie分别实现记住用户登录状态操作
Jul 02 Python
Python如何实现线程间通信
Jul 30 Python
详解Python yaml模块
Sep 23 Python
python 批量压缩图片的脚本
Jun 02 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
PHP生成便于打印的网页
2006/10/09 PHP
分享一个漂亮的php验证码类
2016/09/29 PHP
php使用array_chunk函数将一个数组分割成多个数组
2018/12/05 PHP
仿服务器端脚本方式的JS模板实现方法
2007/04/27 Javascript
在html页面中包含共享页面的方法
2008/10/24 Javascript
Javascript的构造函数和constructor属性
2010/01/09 Javascript
用Jquery选择器计算table中的某一列某一行的合计
2014/08/13 Javascript
JS+CSS实现的简单折叠展开多级菜单效果
2015/09/12 Javascript
JS获取CSS样式(style/getComputedStyle/currentStyle)
2016/01/19 Javascript
jquery实现拖动效果(代码分享)
2017/01/25 Javascript
BootStrap中jQuery插件Carousel实现轮播广告效果
2017/03/27 jQuery
Angularjs使用指令做表单校验的方法
2017/03/31 Javascript
使用jQuery ajaxupload插件实现无刷新上传文件
2017/04/23 jQuery
jQuery的ztree仿windows文件新建和拖拽功能的实现代码
2018/12/05 jQuery
JS+DIV实现拖动效果
2020/02/11 Javascript
JavaScript实现网页跨年倒计时
2020/12/02 Javascript
JavaScript点击按钮生成4位随机验证码
2021/01/28 Javascript
ptyhon实现sitemap生成示例
2014/03/30 Python
使用Pyrex来扩展和加速Python程序的教程
2015/04/13 Python
python numpy 反转 reverse示例
2019/12/04 Python
用Python制作mini翻译器的实现示例
2020/08/17 Python
Django实现文章详情页面跳转代码实例
2020/09/16 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
2020/12/16 Python
CSS3中的Transition过度与Animation动画属性使用要点
2016/05/20 HTML / CSS
AmazeUI 手机版页面的顶部导航条Header与侧边导航栏offCanvas的示例代码
2020/08/19 HTML / CSS
英国男士时尚购物网站:Stuarts London
2017/10/22 全球购物
巴西最大的运动品牌:Olympikus
2020/07/14 全球购物
2015年百日安全活动总结
2015/03/26 职场文书
2016高三毕业赠言寄语
2015/12/04 职场文书
党性教育心得体会(共6篇)
2016/01/21 职场文书
python爬取新闻门户网站的示例
2021/04/25 Python
python实现自动清理文件夹旧文件
2021/05/10 Python
Django集成富文本编辑器summernote的实现步骤
2021/05/31 Python
JavaScript实例 ODO List分析
2022/01/22 Javascript
2022年四月新番
2022/03/15 日漫
ubuntu开机后ROS程序自启动问题
2022/12/24 Servers