connection.py 2.4 KB

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