Advertisement
Guest User

socketio.py

a guest
Mar 20th, 2012
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.79 KB | None | 0 0
  1. from threading import *
  2. import urllib2, urllib
  3. import simplejson as json
  4. import ssl, socket
  5. import time
  6. from websocket_client import create_connection
  7. import traceback
  8.  
  9. class SocketIO:
  10. def __init__(S, url, callback):
  11. S.url = url
  12. S.callback = callback
  13.  
  14. def connect(S):
  15. try:
  16. data = urllib.urlencode({})
  17. req = urllib2.Request('https://' + S.url + "/1", data)
  18. print 'https://' + S.url + "/1"
  19. response = urllib2.urlopen(req)
  20. r = response.read().split(':')
  21. S.heartbeat_interval = int(r[1])
  22. #print 'heartbeat: ', S.heartbeat_interval
  23. if 'websocket' in r[3].split(','):
  24. print "good: transport 'websocket' supported by socket.io server ", S.url
  25. S.id = r[0]
  26. print "id: ", S.id
  27. else:
  28. print "error: transport 'websocket' NOT supported by socket.io server ", S.url
  29.  
  30. S.thread = Thread(target = S.thread_func)
  31. S.thread.setDaemon(True)
  32. S.thread.start()
  33. except:
  34. traceback.print_exc()
  35. print "connection attempt aborted due to above exception, sleeping for a bit...";
  36. time.sleep(11)
  37.  
  38. def unsubscribe(S, channel_id):
  39. S.ws.send('4::/mtgox:{"op":"unsubscribe","channel":"%s"}' % channel_id)
  40.  
  41. def stop(S):
  42. S.run = False
  43. S.thread.join(timeout=1)
  44. S.keepalive_thread.join(timeout=1)
  45.  
  46.  
  47. def thread_func(S):
  48. print 'SocketIO: websocket thread started'
  49.  
  50. my_url = 'wss://' + S.url + "/1/websocket/" + S.id
  51.  
  52. S.ws = create_connection(my_url)
  53.  
  54. #S.ws = WebSocket(my_url, version=0)
  55. S.ws.send('1::/mtgox')
  56.  
  57. # start keepalive thread
  58. S.keepalive_thread = Thread(target = S.keepalive_func)
  59. S.keepalive_thread.setDaemon(True)
  60. S.run = True
  61. S.keepalive_thread.start()
  62.  
  63. try:
  64. msg = S.ws.recv()
  65. while msg is not None and S.run:
  66. #print 'SocketIO msg: ', msg
  67. if msg[:10] == "4::/mtgox:":
  68. S.callback(msg[10:])
  69. #elif msg[:3] == "2::":
  70. # True
  71. #else:
  72. # print "SocketIO: dont know how to handle msg: ", msg
  73. msg = S.ws.recv()
  74. except:
  75. raise SystemExit
  76.  
  77. S.ws.close()
  78.  
  79. def keepalive_func(S):
  80. while S.run:
  81. try:
  82. S.ws.send('2::');
  83. except:
  84. if S.run:
  85. print 'error sending keepalive socket.io, trying reconnect after sleep...'
  86. S.ws.close()
  87. print '\ttrying to reconnect...'
  88. S.connect()
  89. raise SystemExit
  90. else:
  91. print 'exiting socket.io keepalive thread'
  92. time.sleep(S.heartbeat_interval)
  93.  
  94. def test_callback(msg):
  95. print 'msg: ', msg
  96.  
  97. # testcase
  98. if False:
  99. sio = SocketIO('socketio.mtgox.com/socket.io', test_callback)
  100. sio.connect()
  101. time.sleep(100)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement