listing24-5.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. from asyncore import dispatcher
  2. from asynchat import async_chat
  3. import socket, asyncore
  4. PORT = 5005
  5. NAME = 'TestChat'
  6. class ChatSession(async_chat):
  7. """
  8. A class that takes care of a connection between the server and a single user.
  9. """
  10. def __init__(self, server, sock):
  11. # Standard setup tasks:
  12. async_chat. init (self, sock)
  13. self.server = server
  14. self.set_terminator("\r\n")
  15. self.data = []
  16. # Greet the user:
  17. self.push('Welcome to %s\r\n' % self.server.name)
  18. def collect_incoming_data(self, data):
  19. self.data.append(data)
  20. def found_terminator(self):
  21. """
  22. If a terminator is found, that means that a full
  23. line has been read. Broadcast it to everyone.
  24. """
  25. line = ''.join(self.data)
  26. self.data = []
  27. self.server.broadcast(line)
  28. def handle_close(self):
  29. async_chat.handle_close(self)
  30. self.server.disconnect(self)
  31. class ChatServer(dispatcher):
  32. """
  33. A class that receives connections and spawns individual
  34. sessions. It also handles broadcasts to these sessions.
  35. """
  36. def __init__(self, port, name):
  37. # Standard setup tasks dispatcher. init (self)
  38. self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
  39. self.set_reuse_addr()
  40. self.bind(('', port))
  41. self.listen(5)
  42. self.name = name
  43. self.sessions = []
  44. def disconnect(self, session):
  45. self.sessions.remove(session)
  46. def broadcast(self, line):
  47. for session in self.sessions:
  48. session.push(line + '\r\n')
  49. def handle_accept(self):
  50. conn, addr = self.accept()
  51. self.sessions.append(ChatSession(self, conn))
  52. if __name__ == '__main__':
  53. s = ChatServer(PORT, NAME)
  54. try: asyncore.loop()
  55. except KeyboardInterrupt: print()