zoukankan      html  css  js  c++  java
  • python网络编程(一)

    一、Server

    带“会话”类的服务器程序

    asyncore    异步套接字处理程序

    asynchat     asyncore的增强版,chat-style或者命令响应协议

    from asyncore import dispatcher
    from asynchat import async_chat
    import socket, asyncore
    
    PORT = 5005
    
    class ChatSession(async_chat):
    
        def __init__(self, sock):
            async_chat. init (self, sock)
            self.set_terminator("
    ")
            self.data = []
    
        def collect_incoming_data(self, data):
            self.data.append(data)
    
        def found_terminator(self):
            line = ''.join(self.data)
            self.data = []
            # Do something with the line...
            print(line)
    
    class ChatServer(dispatcher):
    
        def __init__(self, port): dispatcher. init (self)
            self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
            self.set_reuse_addr()
            self.bind(('', port))
            self.listen(5)
            self.sessions = []
    
        def handle_accept(self):
            conn, addr = self.accept()
            self.sessions.append(ChatSession(conn))
    
    if __name__ == '__main__':
        s = ChatServer(PORT)
        try: asyncore.loop()
        except KeyboardInterrupt: print()

    1.用到的类:

    dispathcher类基本上是一个套接字类型;

    async_chat类隐藏了大多数套接字读写操作;

    2.作用

    1)ChatServer的  

    self.sessions = []

    用来保存回话列表 ;

    handle_accpet方法创建了新的ChatSession对象,并且将其追加到会话列表中;

    2)conn, addr = self.accept()

    conn是一个sock

    3)asyncore.loop()

    启动服务器,开始监听端口;

    二、聊天服务器

    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 + '
    ')
    
        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()

    作用:

    1)disconnect(self, session)用来处理客户端断开连接;

    2)push方法:

    session对象是ChatSession(async_chat)类型的,写入数据使用push方法;

    3)self.sessions.append(ChatSession(self, conn))

    self, conn 分别对应ChatSession构造函数server, sock

    4)

    def broadcast(self, line):
    for session in self.sessions:

    “广播”即是遍历会话列表;

  • 相关阅读:
    HDU 2116 Has the sum exceeded
    HDU 1233 还是畅通工程
    HDU 1234 开门人和关门人
    HDU 1283 最简单的计算机
    HDU 2552 三足鼎立
    HDU 1202 The calculation of GPA
    HDU 1248 寒冰王座
    HDU 1863 畅通工程
    HDU 1879 继续畅通工程
    颜色对话框CColorDialog,字体对话框CFontDialog使用实例
  • 原文地址:https://www.cnblogs.com/eniac1946/p/7277858.html
Copyright © 2011-2022 走看看