python的websocketAPP

好好学习,天天向上。 / 2023-08-15 / 原文

一.websocket简介及安装

使用pip命令安装websocket库:pip3 install websocket

websocket.WebSocketApp 是对 websocket.WebSocket 的封装,支持自动定时发送 PING 帧,支持事件驱动方式的数据帧接收,可用于长期的 WebSocket 连接。

websocket中就有建立连接connect、发送消息send等函数可供使用,但是websocket.WebSocketApp将这些都封装好了,只用在实例化的时候传入自定义函数即可,更方便。因此这里选择使用websocket.WebSocketApp来模拟客户行为。

WebSocketApp也是websocket中的一个类。要使用WebSocketApp中的回调函数需要传入一系列的可调用对象。在实例化该类时传入构造函数中的on_open、on_message、on_error就需要传入一系列的可调用对象,例如自定义的函数。
二.方法

  运行WebSocketApp的事件循环,先创建webSocket对象,然后connect连接服务器,之后一直循环运行接收数据帧,回调对应函数处理数据帧;当websocket客户端被关闭后,将调用on_close()方法然后结束循环返回;当循环中发生异常时被捕捉,然后依次调用on_error(),on_close()方法,然后结束循环返回。

2.1 WebSocketApp 构造方法
class websocket.WebSocketApp(
  url,
  header=None,
  cookie=None,
  on_open=None,
  on_data=None,
  on_message=None,
  on_cont_message=None,
  on_ping=None,
  on_pong=None,
  on_error=None,
  on_close=None,
  get_mask_key=None,
  subprotocols=None)

参数说明:

on_:开头的参数均为事件回调函数

url:websocket服务端的URL

header:连接握手时自定义的HTTP请求头

cookie:连接握手时自定义的HTTP请求头的Cookie的值

on_open:websocket连接成功后调用的函数,只调用一次,函数格式 on_open(wsapp)

on_data:接收TEXT,BINARY或CONT数据帧时调用,on_data被调用后on_message或on_cont_message也会被调用。函数格式为:                                 on_data(wsapp,frame_data,frame_opcode,frame_fin)

on_message:接收到TEXT或BINARY数据帧时调用,函数格式为:on_message(wsapp,data)

on_cont_message:接收到CONT数据帧时调用,函数格式为:on_cont_message(wsapp,frame_data,frame_fin)

on_ping:接收到PING数据帧时调用,不会自动回复PONG,需要手动发送PONG回复服务端,函数格式为:on_ping(wsapp,frame_data)

on_pong:接收到PONG数据帧时调用,函数格式为on_pong(wsapp,frame_data)

on_error:当事件循环中有任何异常抛出,将调用此函数,然后调用on_close()关闭WebSocket连接,然后返回run_forever()。on_xxx回调方法中抛出                的异常将被吧捕获,不会抛给run_forever(),函数格式为:on_error(wsapp,exception)

on_close:websocket被关闭时调用的函数。事件循环中抛出异常或收到服务端推送的close数据帧关闭客户端时被调用,主动调用wsapp.close()不会                 调用on_close(),函数格式为:on_close(wsapp,close_status_code,close_reason)

get_mask_key:自定义mask key的生成函数

subprotocols:可用的子协议数组

2.2run_forever()方法

run_forever(sockopt=None,       #socket.setsocket的可选参数值,为tuple类型

  sslopt=None,     #SSL socket的可选参数,为dict对象,例如禁用 SSL 证书校验: sslopt={"cert_reqs": ssl.CERT_NONE} 禁用域名校验: sslopt={"check_hostname": False}

  ping_interval=0,   #自动发送ping数据帧的间隔秒数,默认为0,表示不自动发送ping

  ping_timeout=None,  #ping发送后接收pong的超时秒数,如果超时未收到pong则抛出异常并调用on_error(),on_close(),然后结束循环;None表示不检测超时
  ping_payload="",    #发送PING数据帧时携带的数据,默认为空字符串
  proxy_type=None,  #代理的类型,默认http,其他还有socket4,socket5和socks5h
  http_proxy_host=None,    #代理的host
  http_proxy_port=None,    #代理的端口,默认80
  http_no_proxy=None,,     #不适用代理的host names,为list类型,如["host1","host2",.....]
  http_proxy_auth=None    #HTTP代理认证为tuple类型,如("username","password")
  skip_utf8_validation=False,    #是否跳过utf8校验
  host=None,       #自定义http请求头host的值
  origin=None,      #自定义http请求头origin的值(URL)
  dispatcher=None,    #自定义从socket读取数据的函数
  suppress_origin=False)     #抑制输出origin header
2.3发送数据send()方法

send(data, opcode=ABNF.OPCODE_TEXT)

data:发送的数据,为str/bytes类型

opcode: 操作码, 可选值:
  ABNF.OPCODE_CONT
  ABNF.OPCODE_TEXT
  ABNF.OPCODE_BINARY
  ABNF.OPCODE_CLOSE
  ABNF.OPCODE_PING
  ABNF.OPCODE_PONG
 默认为发送 TEXT 数据帧

2.4关闭websocket方法close()close(status=STATUS_NORMAL, reason=bytes('', encoding='utf-8'), timeout=3.0)

关闭 WebSocket, 先发送关闭帧再关闭底层 socket。

status: 发送关闭数据帧时的数据(告诉服务端关闭的状态码), 默认为正常关闭。

reason: 发送关闭数据帧时的数据(告诉服务端关闭的原因)。
timeout: 直到超时还没有收到一个关闭帧, 则不再等待, 直接关闭底层 socket。
正常为收到关闭帧后再关闭底层 socket。int/float 秒数, None 表示一直等待直到收到一个关闭帧。
实例:

 

 

 

 

 

三.webSocketApp方法