一.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方法
标签:None,调用,websocket,函数,python,close,websocketAPP,data From: https://www.cnblogs.com/qq771293871/p/17628285.html