Пример #1
0
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)
Пример #2
0
 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()