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:

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

  • 相关阅读:
    【tips】Clion添加Qt gui绘制快捷方式
    conda配置安装pytorch tensorflow-gpu
    用当前最新版vs2019编译opencv最新版4.3.0遇到的问题---
    cuda报错: nvcc fatal : Host compiler targets unsupported OS
    C++中结构体与类的区别(struct与class的区别)
    cmake
    Windows 下配置Boost MPI
    VC----MFC对象的创建总结
    VC++、MFC最好的开源项目
    机械设计人员怎么学习电控?
  • 原文地址:https://www.cnblogs.com/eniac1946/p/7277858.html
Copyright © 2011-2022 走看看