|
...
|
...
|
@@ -6,6 +6,9 @@ |
|
|
|
# @Software: PyCharm
|
|
|
|
import functools
|
|
|
|
import json
|
|
|
|
import random
|
|
|
|
import time
|
|
|
|
from threading import Timer
|
|
|
|
|
|
|
|
from tornado import gen
|
|
|
|
from tornado import httpclient
|
|
...
|
...
|
@@ -111,20 +114,36 @@ class WebSocketClient(object): |
|
|
|
|
|
|
|
class MessageSocketClient(WebSocketClient):
|
|
|
|
|
|
|
|
def __init__(self, connect_timeout=DEFAULT_CONNECT_TIMEOUT,
|
|
|
|
def __init__(self, connect_success=None, message_receive=None, connect_timeout=DEFAULT_CONNECT_TIMEOUT,
|
|
|
|
request_timeout=DEFAULT_REQUEST_TIMEOUT):
|
|
|
|
self._connect_success = connect_success
|
|
|
|
self._message_receive = message_receive
|
|
|
|
|
|
|
|
self._later_handler = dict()
|
|
|
|
self.connect_timeout = connect_timeout
|
|
|
|
self.request_timeout = request_timeout
|
|
|
|
self._io_loop = ioloop.IOLoop.current()
|
|
|
|
self.ws_url = None
|
|
|
|
self.auto_reconnet = False
|
|
|
|
self._message_receive = self._connect_success = None
|
|
|
|
self.auto_net = False
|
|
|
|
self.heartbeat_interval_in_secs = 30
|
|
|
|
|
|
|
|
super(MessageSocketClient, self).__init__(self._io_loop,
|
|
|
|
self.connect_timeout,
|
|
|
|
self.request_timeout)
|
|
|
|
|
|
|
|
self.heartbeat_interval_in_secs = 30
|
|
|
|
self._later_handler['move_server'] = self._io_loop.call_later(random.randint(30, 60), self.auto_move_server)
|
|
|
|
|
|
|
|
def new_server_func(self):
|
|
|
|
return self.ws_url, False
|
|
|
|
|
|
|
|
def server_replace(self, ws_url):
|
|
|
|
print("需要连接新服务器", ws_url)
|
|
|
|
|
|
|
|
def auto_move_server(self):
|
|
|
|
ws_url, move = self.new_server_func()
|
|
|
|
if move:
|
|
|
|
self.server_replace(ws_url)
|
|
|
|
self._later_handler['move_server'] = self._io_loop.call_later(random.randint(30, 30), self.auto_move_server)
|
|
|
|
|
|
|
|
def connect(self, url, reconnect=True, reconnect_interval=3):
|
|
|
|
self.ws_url = url
|
|
...
|
...
|
@@ -134,8 +153,9 @@ class MessageSocketClient(WebSocketClient): |
|
|
|
|
|
|
|
def on_connection_success(self):
|
|
|
|
if self._connect_success:
|
|
|
|
self._connect_success()
|
|
|
|
self._io_loop.call_later(self.heartbeat_interval_in_secs, functools.partial(self.sendheartbeat))
|
|
|
|
self._connect_success(self)
|
|
|
|
self._later_handler['heartbeat'] = self._io_loop.call_later(self.heartbeat_interval_in_secs,
|
|
|
|
functools.partial(self.sendheartbeat))
|
|
|
|
|
|
|
|
def on_connection_close(self, reason):
|
|
|
|
print('%s Connection closed reason=%s' % (self.ws_url, reason,))
|
|
...
|
...
|
@@ -143,8 +163,9 @@ class MessageSocketClient(WebSocketClient): |
|
|
|
|
|
|
|
def reconnect(self):
|
|
|
|
if not self.is_connected() and self.auto_reconnet:
|
|
|
|
self._io_loop.call_later(self.reconnect_interval,
|
|
|
|
super(MessageSocketClient, self).connect, self.ws_url)
|
|
|
|
self._later_handler['reconnect'] = self._io_loop.call_later(self.reconnect_interval,
|
|
|
|
super(MessageSocketClient, self).connect,
|
|
|
|
self.ws_url)
|
|
|
|
|
|
|
|
def payload_data(self):
|
|
|
|
return {"type": "ping"}
|
|
...
|
...
|
@@ -154,19 +175,42 @@ class MessageSocketClient(WebSocketClient): |
|
|
|
bool = self.send(msg) if msg else False
|
|
|
|
|
|
|
|
if msg is None or bool:
|
|
|
|
self._io_loop.call_later(self.heartbeat_interval_in_secs,
|
|
|
|
functools.partial(self.sendheartbeat))
|
|
|
|
|
|
|
|
def receive(self, message_receive):
|
|
|
|
self._message_receive = message_receive
|
|
|
|
return self
|
|
|
|
|
|
|
|
def success(self, connect_success):
|
|
|
|
self._connect_success = connect_success
|
|
|
|
return self
|
|
|
|
self._later_handler['heartbeat'] = self._io_loop.call_later(self.heartbeat_interval_in_secs,
|
|
|
|
functools.partial(self.sendheartbeat))
|
|
|
|
|
|
|
|
def on_message(self, msg):
|
|
|
|
if not self._message_receive:
|
|
|
|
raise BaseException("未设置接收消息函数->", self.receive)
|
|
|
|
else:
|
|
|
|
self._message_receive(msg)
|
|
|
|
|
|
|
|
def quit(self):
|
|
|
|
self.auto_reconnet = False
|
|
|
|
self.close("quit")
|
|
|
|
for k, handler in self._later_handler.items():
|
|
|
|
self._io_loop.remove_timeout(handler)
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
|
|
|
def success(sock):
|
|
|
|
global sockccc
|
|
|
|
sockccc = sock
|
|
|
|
|
|
|
|
|
|
|
|
def rec(msg):
|
|
|
|
if msg == 'quit':
|
|
|
|
sockccc.quit()
|
|
|
|
|
|
|
|
|
|
|
|
def interval():
|
|
|
|
if sockccc:
|
|
|
|
sockccc.send({'test': time.time()})
|
|
|
|
Timer(3, interval).start()
|
|
|
|
|
|
|
|
|
|
|
|
s1 = MessageSocketClient()
|
|
|
|
s1.connect('ws://localhost:10000', reconnect=False)
|
|
|
|
|
|
|
|
Timer(2, interval).start()
|
|
|
|
ioloop.IOLoop.current().start() |
...
|
...
|
|