|
@@ -6,6 +6,9 @@ |
|
@@ -6,6 +6,9 @@ |
|
6
|
# @Software: PyCharm
|
6
|
# @Software: PyCharm
|
|
7
|
import functools
|
7
|
import functools
|
|
8
|
import json
|
8
|
import json
|
|
|
|
9
|
+import random
|
|
|
|
10
|
+import time
|
|
|
|
11
|
+from threading import Timer
|
|
9
|
|
12
|
|
|
10
|
from tornado import gen
|
13
|
from tornado import gen
|
|
11
|
from tornado import httpclient
|
14
|
from tornado import httpclient
|
|
@@ -111,20 +114,36 @@ class WebSocketClient(object): |
|
@@ -111,20 +114,36 @@ class WebSocketClient(object): |
|
111
|
|
114
|
|
|
112
|
class MessageSocketClient(WebSocketClient):
|
115
|
class MessageSocketClient(WebSocketClient):
|
|
113
|
|
116
|
|
|
114
|
- def __init__(self, connect_timeout=DEFAULT_CONNECT_TIMEOUT,
|
117
|
+ def __init__(self, connect_success=None, message_receive=None, connect_timeout=DEFAULT_CONNECT_TIMEOUT,
|
|
115
|
request_timeout=DEFAULT_REQUEST_TIMEOUT):
|
118
|
request_timeout=DEFAULT_REQUEST_TIMEOUT):
|
|
|
|
119
|
+ self._connect_success = connect_success
|
|
|
|
120
|
+ self._message_receive = message_receive
|
|
|
|
121
|
+
|
|
|
|
122
|
+ self._later_handler = dict()
|
|
116
|
self.connect_timeout = connect_timeout
|
123
|
self.connect_timeout = connect_timeout
|
|
117
|
self.request_timeout = request_timeout
|
124
|
self.request_timeout = request_timeout
|
|
118
|
self._io_loop = ioloop.IOLoop.current()
|
125
|
self._io_loop = ioloop.IOLoop.current()
|
|
119
|
self.ws_url = None
|
126
|
self.ws_url = None
|
|
120
|
- self.auto_reconnet = False
|
|
|
|
121
|
- self._message_receive = self._connect_success = None
|
127
|
+ self.auto_net = False
|
|
|
|
128
|
+ self.heartbeat_interval_in_secs = 30
|
|
122
|
|
129
|
|
|
123
|
super(MessageSocketClient, self).__init__(self._io_loop,
|
130
|
super(MessageSocketClient, self).__init__(self._io_loop,
|
|
124
|
self.connect_timeout,
|
131
|
self.connect_timeout,
|
|
125
|
self.request_timeout)
|
132
|
self.request_timeout)
|
|
126
|
|
133
|
|
|
127
|
- self.heartbeat_interval_in_secs = 30
|
134
|
+ self._later_handler['move_server'] = self._io_loop.call_later(random.randint(30, 60), self.auto_move_server)
|
|
|
|
135
|
+
|
|
|
|
136
|
+ def new_server_func(self):
|
|
|
|
137
|
+ return self.ws_url, False
|
|
|
|
138
|
+
|
|
|
|
139
|
+ def server_replace(self, ws_url):
|
|
|
|
140
|
+ print("需要连接新服务器", ws_url)
|
|
|
|
141
|
+
|
|
|
|
142
|
+ def auto_move_server(self):
|
|
|
|
143
|
+ ws_url, move = self.new_server_func()
|
|
|
|
144
|
+ if move:
|
|
|
|
145
|
+ self.server_replace(ws_url)
|
|
|
|
146
|
+ self._later_handler['move_server'] = self._io_loop.call_later(random.randint(30, 30), self.auto_move_server)
|
|
128
|
|
147
|
|
|
129
|
def connect(self, url, reconnect=True, reconnect_interval=3):
|
148
|
def connect(self, url, reconnect=True, reconnect_interval=3):
|
|
130
|
self.ws_url = url
|
149
|
self.ws_url = url
|
|
@@ -134,8 +153,9 @@ class MessageSocketClient(WebSocketClient): |
|
@@ -134,8 +153,9 @@ class MessageSocketClient(WebSocketClient): |
|
134
|
|
153
|
|
|
135
|
def on_connection_success(self):
|
154
|
def on_connection_success(self):
|
|
136
|
if self._connect_success:
|
155
|
if self._connect_success:
|
|
137
|
- self._connect_success()
|
|
|
|
138
|
- self._io_loop.call_later(self.heartbeat_interval_in_secs, functools.partial(self.sendheartbeat))
|
156
|
+ self._connect_success(self)
|
|
|
|
157
|
+ self._later_handler['heartbeat'] = self._io_loop.call_later(self.heartbeat_interval_in_secs,
|
|
|
|
158
|
+ functools.partial(self.sendheartbeat))
|
|
139
|
|
159
|
|
|
140
|
def on_connection_close(self, reason):
|
160
|
def on_connection_close(self, reason):
|
|
141
|
print('%s Connection closed reason=%s' % (self.ws_url, reason,))
|
161
|
print('%s Connection closed reason=%s' % (self.ws_url, reason,))
|
|
@@ -143,8 +163,9 @@ class MessageSocketClient(WebSocketClient): |
|
@@ -143,8 +163,9 @@ class MessageSocketClient(WebSocketClient): |
|
143
|
|
163
|
|
|
144
|
def reconnect(self):
|
164
|
def reconnect(self):
|
|
145
|
if not self.is_connected() and self.auto_reconnet:
|
165
|
if not self.is_connected() and self.auto_reconnet:
|
|
146
|
- self._io_loop.call_later(self.reconnect_interval,
|
|
|
|
147
|
- super(MessageSocketClient, self).connect, self.ws_url)
|
166
|
+ self._later_handler['reconnect'] = self._io_loop.call_later(self.reconnect_interval,
|
|
|
|
167
|
+ super(MessageSocketClient, self).connect,
|
|
|
|
168
|
+ self.ws_url)
|
|
148
|
|
169
|
|
|
149
|
def payload_data(self):
|
170
|
def payload_data(self):
|
|
150
|
return {"type": "ping"}
|
171
|
return {"type": "ping"}
|
|
@@ -154,19 +175,42 @@ class MessageSocketClient(WebSocketClient): |
|
@@ -154,19 +175,42 @@ class MessageSocketClient(WebSocketClient): |
|
154
|
bool = self.send(msg) if msg else False
|
175
|
bool = self.send(msg) if msg else False
|
|
155
|
|
176
|
|
|
156
|
if msg is None or bool:
|
177
|
if msg is None or bool:
|
|
157
|
- self._io_loop.call_later(self.heartbeat_interval_in_secs,
|
178
|
+ self._later_handler['heartbeat'] = self._io_loop.call_later(self.heartbeat_interval_in_secs,
|
|
158
|
functools.partial(self.sendheartbeat))
|
179
|
functools.partial(self.sendheartbeat))
|
|
159
|
|
180
|
|
|
160
|
- def receive(self, message_receive):
|
|
|
|
161
|
- self._message_receive = message_receive
|
|
|
|
162
|
- return self
|
|
|
|
163
|
-
|
|
|
|
164
|
- def success(self, connect_success):
|
|
|
|
165
|
- self._connect_success = connect_success
|
|
|
|
166
|
- return self
|
|
|
|
167
|
-
|
|
|
|
168
|
def on_message(self, msg):
|
181
|
def on_message(self, msg):
|
|
169
|
if not self._message_receive:
|
182
|
if not self._message_receive:
|
|
170
|
raise BaseException("未设置接收消息函数->", self.receive)
|
183
|
raise BaseException("未设置接收消息函数->", self.receive)
|
|
171
|
else:
|
184
|
else:
|
|
172
|
self._message_receive(msg)
|
185
|
self._message_receive(msg)
|
|
|
|
186
|
+
|
|
|
|
187
|
+ def quit(self):
|
|
|
|
188
|
+ self.auto_reconnet = False
|
|
|
|
189
|
+ self.close("quit")
|
|
|
|
190
|
+ for k, handler in self._later_handler.items():
|
|
|
|
191
|
+ self._io_loop.remove_timeout(handler)
|
|
|
|
192
|
+
|
|
|
|
193
|
+
|
|
|
|
194
|
+if __name__ == '__main__':
|
|
|
|
195
|
+
|
|
|
|
196
|
+ def success(sock):
|
|
|
|
197
|
+ global sockccc
|
|
|
|
198
|
+ sockccc = sock
|
|
|
|
199
|
+
|
|
|
|
200
|
+
|
|
|
|
201
|
+ def rec(msg):
|
|
|
|
202
|
+ if msg == 'quit':
|
|
|
|
203
|
+ sockccc.quit()
|
|
|
|
204
|
+
|
|
|
|
205
|
+
|
|
|
|
206
|
+ def interval():
|
|
|
|
207
|
+ if sockccc:
|
|
|
|
208
|
+ sockccc.send({'test': time.time()})
|
|
|
|
209
|
+ Timer(3, interval).start()
|
|
|
|
210
|
+
|
|
|
|
211
|
+
|
|
|
|
212
|
+ s1 = MessageSocketClient()
|
|
|
|
213
|
+ s1.connect('ws://localhost:10000', reconnect=False)
|
|
|
|
214
|
+
|
|
|
|
215
|
+ Timer(2, interval).start()
|
|
|
|
216
|
+ ioloop.IOLoop.current().start() |