summaryrefslogtreecommitdiff
path: root/game/python-extra/ws4py/client/geventclient.py
diff options
context:
space:
mode:
Diffstat (limited to 'game/python-extra/ws4py/client/geventclient.py')
-rw-r--r--game/python-extra/ws4py/client/geventclient.py96
1 files changed, 96 insertions, 0 deletions
diff --git a/game/python-extra/ws4py/client/geventclient.py b/game/python-extra/ws4py/client/geventclient.py
new file mode 100644
index 0000000..b64a17e
--- /dev/null
+++ b/game/python-extra/ws4py/client/geventclient.py
@@ -0,0 +1,96 @@
+# -*- coding: utf-8 -*-
+import copy
+
+import gevent
+from gevent import Greenlet
+from gevent.queue import Queue
+
+from ws4py.client import WebSocketBaseClient
+
+__all__ = ['WebSocketClient']
+
+class WebSocketClient(WebSocketBaseClient):
+ def __init__(self, url, protocols=None, extensions=None, heartbeat_freq=None, ssl_options=None, headers=None, exclude_headers=None):
+ """
+ WebSocket client that executes the
+ :meth:`run() <ws4py.websocket.WebSocket.run>` into a gevent greenlet.
+
+ .. code-block:: python
+
+ ws = WebSocketClient('ws://localhost:9000/echo', protocols=['http-only', 'chat'])
+ ws.connect()
+
+ ws.send("Hello world")
+
+ def incoming():
+ while True:
+ m = ws.receive()
+ if m is not None:
+ print str(m)
+ else:
+ break
+
+ def outgoing():
+ for i in range(0, 40, 5):
+ ws.send("*" * i)
+
+ greenlets = [
+ gevent.spawn(incoming),
+ gevent.spawn(outgoing),
+ ]
+ gevent.joinall(greenlets)
+ """
+ WebSocketBaseClient.__init__(self, url, protocols, extensions, heartbeat_freq,
+ ssl_options=ssl_options, headers=headers, exclude_headers=exclude_headers)
+ self._th = Greenlet(self.run)
+
+ self.messages = Queue()
+ """
+ Queue that will hold received messages.
+ """
+
+ def handshake_ok(self):
+ """
+ Called when the upgrade handshake has completed
+ successfully.
+
+ Starts the client's thread.
+ """
+ self._th.start()
+
+ def received_message(self, message):
+ """
+ Override the base class to store the incoming message
+ in the `messages` queue.
+ """
+ self.messages.put(copy.deepcopy(message))
+
+ def closed(self, code, reason=None):
+ """
+ Puts a :exc:`StopIteration` as a message into the
+ `messages` queue.
+ """
+ # When the connection is closed, put a StopIteration
+ # on the message queue to signal there's nothing left
+ # to wait for
+ self.messages.put(StopIteration)
+
+ def receive(self, block=True):
+ """
+ Returns messages that were stored into the
+ `messages` queue and returns `None` when the
+ websocket is terminated or closed.
+ `block` is passed though the gevent queue `.get()` method, which if
+ True will block until an item in the queue is available. Set this to
+ False if you just want to check the queue, which will raise an
+ Empty exception you need to handle if there is no message to return.
+ """
+ # If the websocket was terminated and there are no messages
+ # left in the queue, return None immediately otherwise the client
+ # will block forever
+ if self.terminated and self.messages.empty():
+ return None
+ message = self.messages.get(block=block)
+ if message is StopIteration:
+ return None
+ return message