class ChatServer(): def __init__(self, bindhost, bindport): self.bindhost = bindhost self.bindport = bindport self.clients = [] def run(self): '''Starts the ChatServer, non-blocking call. Method returns control immediately to caller since the underlying TCPServer runs in a separate thread.''' _log.info('ChatServer now starting up') sockhandlers = (self.peer_connected, self.peer_msg_received, self.peer_disconnected) self.tcpserver = TCPServer(self.bindhost, self.bindport, sockhandlers, msgsize=MESSAGE_SIZE) self.tcpserver.run() def peer_connected(self, sockio): self.clients.append(sockio) msg = 'New user connected: {}'.format(sockio) _log.info(msg) self._server_msgall(msg, sockio) def peer_msg_received(self, sockio, msg): self._msgall(msg, sockio) def peer_disconnected(self, sockio): self.clients.remove(sockio) msg = 'User disconnected: {}'.format(sockio) _log.info(msg) self._server_msgall(msg, sockio) def shutdown(self): _log.info('ChatServer now shutting down') self.tcpserver.shutdown() def _server_msgall(self, msg, *exclude): msg = '>>> SERVER MSG: {}'.format(msg) self._msgall(msg, *exclude) def _msgall(self, msg, *exclude): '''Send a message to all connected clients, optionally specifying a list of clients to exclude from the message.''' targets = set(self.clients) - set(exclude) for sockio in targets: sockio.sendmsg(msg)
def run(self): '''Starts the ChatServer, non-blocking call. Method returns control immediately to caller since the underlying TCPServer runs in a separate thread.''' _log.info('ChatServer now starting up') sockhandlers = (self.peer_connected, self.peer_msg_received, self.peer_disconnected) self.tcpserver = TCPServer(self.bindhost, self.bindport, sockhandlers, msgsize=MESSAGE_SIZE) self.tcpserver.run()