[Fix] WebSocketClient:修正一个潜在Bug:因网络问题导致重连的exception不会被onError捕获
This commit is contained in:
parent
85c64b00e4
commit
0236fcb864
@ -7,7 +7,7 @@ import ssl
|
|||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
from abc import abstractmethod
|
from abc import abstractmethod
|
||||||
from threading import Thread
|
from threading import Thread, Lock
|
||||||
|
|
||||||
import websocket
|
import websocket
|
||||||
|
|
||||||
@ -20,7 +20,9 @@ class WebsocketClient(object):
|
|||||||
"""Constructor"""
|
"""Constructor"""
|
||||||
self.host = None # type: str
|
self.host = None # type: str
|
||||||
|
|
||||||
|
self._ws_lock = Lock()
|
||||||
self._ws = None # type: websocket.WebSocket
|
self._ws = None # type: websocket.WebSocket
|
||||||
|
|
||||||
self._workerThread = None # type: Thread
|
self._workerThread = None # type: Thread
|
||||||
self._pingThread = None # type: Thread
|
self._pingThread = None # type: Thread
|
||||||
self._active = False
|
self._active = False
|
||||||
@ -55,17 +57,17 @@ class WebsocketClient(object):
|
|||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def sendReq(self, req): # type: (dict)->None
|
def sendReq(self, req): # type: (dict)->None
|
||||||
"""发出请求"""
|
"""发出请求"""
|
||||||
return self._ws.send(json.dumps(req), opcode=websocket.ABNF.OPCODE_TEXT)
|
return self._get_ws().send(json.dumps(req), opcode=websocket.ABNF.OPCODE_TEXT)
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def sendText(self, text): # type: (str)->None
|
def sendText(self, text): # type: (str)->None
|
||||||
"""发出请求"""
|
"""发出请求"""
|
||||||
return self._ws.send(text, opcode=websocket.ABNF.OPCODE_TEXT)
|
return self._get_ws().send(text, opcode=websocket.ABNF.OPCODE_TEXT)
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def sendData(self, data): # type: (bytes)->None
|
def sendData(self, data): # type: (bytes)->None
|
||||||
"""发出请求"""
|
"""发出请求"""
|
||||||
return self._ws.send_binary(data)
|
return self._get_ws().send_binary(data)
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def _reconnect(self):
|
def _reconnect(self):
|
||||||
@ -81,22 +83,36 @@ class WebsocketClient(object):
|
|||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def _disconnect(self):
|
def _disconnect(self):
|
||||||
""""""
|
"""
|
||||||
self._ws.close()
|
断开连接
|
||||||
|
"""
|
||||||
|
with self._ws_lock:
|
||||||
|
if self._ws:
|
||||||
|
self._ws.close()
|
||||||
|
self._ws = None
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
def _get_ws(self):
|
||||||
|
with self._ws_lock:
|
||||||
|
return self._ws
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def _run(self):
|
def _run(self):
|
||||||
"""运行"""
|
"""运行"""
|
||||||
|
ws = self._get_ws()
|
||||||
while self._active:
|
while self._active:
|
||||||
try:
|
try:
|
||||||
stream = self._ws.recv()
|
stream = ws.recv()
|
||||||
|
if not stream:
|
||||||
|
if self._active:
|
||||||
|
self._reconnect()
|
||||||
|
continue
|
||||||
|
|
||||||
data = json.loads(stream)
|
data = json.loads(stream)
|
||||||
self.onMessage(data)
|
self.onMessage(data)
|
||||||
except:
|
except:
|
||||||
et, ev, tb = sys.exc_info()
|
et, ev, tb = sys.exc_info()
|
||||||
self.onError(et, ev, tb)
|
self.onError(et, ev, tb)
|
||||||
if self._active:
|
|
||||||
self._reconnect()
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def _runPing(self):
|
def _runPing(self):
|
||||||
@ -109,7 +125,7 @@ class WebsocketClient(object):
|
|||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def _ping(self):
|
def _ping(self):
|
||||||
return self._ws.send('ping', websocket.ABNF.OPCODE_PING)
|
return self._get_ws().send('ping', websocket.ABNF.OPCODE_PING)
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
|
Loading…
Reference in New Issue
Block a user