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中的zipfile模块使用详解
Jun 25 Python
解决pycharm界面不能显示中文的问题
May 23 Python
Python Flask前后端Ajax交互的方法示例
Jul 31 Python
详解python解压压缩包的五种方法
Jul 05 Python
Python 微信爬虫完整实例【单线程与多线程】
Jul 06 Python
python 实现创建文件夹和创建日志文件的方法
Jul 07 Python
python 定时器每天就执行一次的实现代码
Aug 14 Python
python django中8000端口被占用的解决
Dec 17 Python
Python正则表达式如何匹配中文
May 27 Python
pytorch简介
Nov 11 Python
python unichr函数知识点总结
Dec 16 Python
从np.random.normal()到正态分布的拟合操作
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
DC动画很好看?新作烂得令人发指,名叫《红色之子》
2020/04/09 欧美动漫
phpStudy中升级MySQL版本到5.7.17的方法步骤
2017/08/03 PHP
详解laravel安装使用Passport(Api认证)
2018/07/27 PHP
php中字符串和整数比较的操作方法
2019/06/06 PHP
20行代码实现的一个CSS覆盖率测试脚本
2013/07/07 Javascript
解决jquery插件冲突的问题
2014/01/23 Javascript
jQuery实现瀑布流布局
2014/12/12 Javascript
轻松创建nodejs服务器(10):处理上传图片
2014/12/18 NodeJs
javascript实现控制div颜色
2015/07/07 Javascript
js采用concat和sort将N个数组拼接起来的方法
2016/01/21 Javascript
jQuery UI库中dialog对话框功能使用全解析
2016/04/23 Javascript
BootStrap 实现各种样式的进度条效果
2016/12/07 Javascript
Vue2.0 axios前后端登陆拦截器(实例讲解)
2017/10/27 Javascript
vue项目实现表单登录页保存账号和密码到cookie功能
2018/08/31 Javascript
vue实现双向绑定和依赖收集遇到的坑
2018/11/29 Javascript
vue+SSM实现验证码功能
2018/12/07 Javascript
微信小程序基于picker实现级联菜单
2019/02/15 Javascript
layUI实现三级导航菜单效果
2019/07/26 Javascript
Webpack中loader打包各种文件的方法实例
2019/09/03 Javascript
详解简单易懂的 ES6 Iterators 指南和示例
2019/09/24 Javascript
用Python进行基础的函数式编程的教程
2015/03/31 Python
提升Python程序运行效率的6个方法
2015/03/31 Python
Python操作mongodb数据库进行模糊查询操作示例
2018/06/09 Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
2018/06/14 Python
python实现人像动漫化的示例代码
2020/05/17 Python
Spartoo葡萄牙鞋类网站:线上销售鞋履与时尚配饰
2017/01/11 全球购物
俄罗斯购买自行车网站:Vamvelosiped
2021/01/29 全球购物
物流业务员岗位职责
2014/02/08 职场文书
捐款倡议书怎么写
2014/05/13 职场文书
团队队名口号大全
2014/06/06 职场文书
2014年医院工作总结
2014/11/20 职场文书
2016感恩母亲节校园广播稿
2015/12/17 职场文书
幼儿园六一儿童节开幕词
2016/03/04 职场文书
golang日志包logger的用法详解
2021/05/05 Golang
vue基于Teleport实现Modal组件
2021/05/31 Vue.js
MySQL8.0.18配置多主一从
2021/06/21 MySQL