listing24-5.py

来自「《Beginning Python--From Novice to Profes」· Python 代码 · 共 67 行

PY
67
字号
from asyncore import dispatcherfrom asynchat import async_chatimport socket, asyncorePORT = 5005NAME = 'TestChat'class ChatSession(async_chat):    """    A class that takes care of a connection between the server    and a single user.    """    def __init__(self, server, sock):        # Standard setup tasks:        async_chat.__init__(self, sock)        self.server = server        self.set_terminator("\r\n")        self.data = []        # Greet the user:        self.push('Welcome to %s\r\n' % self.server.name)    def collect_incoming_data(self, data):        self.data.append(data)    def found_terminator(self):        """        If a terminator is found, that means that a full        line has been read. Broadcast it to everyone.        """        line = ''.join(self.data)        self.data = []        self.server.broadcast(line)    def handle_close(self):        async_chat.handle_close(self)        self.server.disconnect(self)class ChatServer(dispatcher):    """    A class that receives connections and spawns individual    sessions. It also handles broadcasts to these sessions.    """    def __init__(self, port, name):        # Standard setup tasks        dispatcher.__init__(self)        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)        self.set_reuse_addr()        self.bind(('', port))        self.listen(5)        self.name = name        self.sessions = []    def disconnect(self, session):        self.sessions.remove(session)    def broadcast(self, line):        for session in self.sessions:            session.push(line + '\r\n')    def handle_accept(self):        conn, addr = self.accept()        self.sessions.append(ChatSession(self, conn))if __name__ == '__main__':    s = ChatServer(PORT, NAME)    try: asyncore.loop()    except KeyboardInterrupt: print

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?