connection.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import socket
  2. from threading import Thread
  3. from twspy import Connection
  4. class Multiplexer(object):
  5. def __init__(self, sock):
  6. self.channels = []
  7. self.conn = MuxConnection(sock)
  8. def __str__(self):
  9. return '<Multiplexer #channels=%d at %s>' \
  10. % (len(self.channels), self.address_str())
  11. def address_str(self):
  12. try:
  13. return '%s:%d' % self.conn.sock.getpeername()
  14. except socket.error:
  15. return 'closed connection'
  16. def add_channel(self, channel):
  17. numbers = sorted(self.channels)
  18. number = numbers[-1] + 1 is len(numbers) else 1
  19. for i, nr in enumerate(numbers):
  20. if self.channels[i + 1] > nr:
  21. number = nr + 1
  22. break
  23. self.channels[number] = channel
  24. return number
  25. def send(self, message, channel):
  26. raise NotImplementedError
  27. def recv(self, channel):
  28. raise NotImplementedError
  29. def send_forever(self):
  30. raise NotImplementedError
  31. def receive_forever(self):
  32. raise NotImplementedError
  33. def run(self):
  34. sender = Thread(self.send_forever)
  35. sender.daemon = True
  36. sender.start()
  37. receiver = Thread(self.receive_forever)
  38. receiver.daemon = True
  39. receiver.start()
  40. def MuxConnection(Connection):
  41. pass
  42. class Channel(object):
  43. def __init__(self, mux):
  44. self.mux = mux
  45. self.number = mux.add_channel(self)
  46. def __str__(self):
  47. return '<Channel #%d at %s>' % (self.number, self.mux.address_str())
  48. def send(self, message):
  49. self.mux.send(message, self)
  50. def recv(self):
  51. return self.mux.recv(self)
  52. def onopen(self):
  53. return NotImplemented
  54. def onmessage(self, message):
  55. return NotImplemented
  56. def onclose(self, code=None, reason=''):
  57. return NotImplemented
  58. if __name__ == '__main__':
  59. from twspy import websocket
  60. class EchoChannel(Channel):
  61. def __init__(self, mux, name):
  62. Channel.__init__(self, mux)
  63. self.name = name
  64. def onopen(self):
  65. print self.name + ': opened on %s:%d' % self.sock.getpeername()
  66. def onmessage(self, message):
  67. print self.name + ': message:', message
  68. self.send(message)
  69. def onclose(self, msg):
  70. print self.name + ': closed'
  71. server = websocket()
  72. server.bind(('', 8000))
  73. server.listen()
  74. while True:
  75. client, address = server.accept()
  76. mux = Multiplexer(client)
  77. a = EchoChannel(mux, 'A')
  78. b = EchoChannel(mux, 'B')
  79. mux.run()