• PythonStudy——非阻塞IO模型


    服务端

    import socket
    import time
    import select
    
    
    server = socket.socket()
    server.bind(("127.0.0.1",1688))
    server.listen(5)
    # server.setblocking(False) # 默认为阻塞    设置为False 表示非阻塞
    
    """
    参数1   rlist   里面存储需要被检测是否可读(是否可以执行recv)的socket对象 
    参数2   wlist   里面存储需要被检测是否可写(是否可以执行send)的socket对象 
    参数3   xlist 存储你需要关注异常条件  忽略即可
    参数4   timeout  检测超时时间  一段时间后还是没有可以被处理的socket 那就返回空列表  
    返回值:  三个列表
    1    已经有数据到达的socket对象 
    2    可以发送数据的socket对象    怎么可以发 缓冲区没有满  
    3    忽略....
    """
    rlist = [server,]
    wlist = []
    
    # 要发送的数据和socket
    msgs = []
    while True:
        ras,was,_ = select.select(rlist,wlist,[])  # 阻塞直到socket可读或是可写
        # 处理可读的socket
        for s in ras:
            if s == server:
                client,addr = server.accept()
                rlist.append(client)
            else:
                try:
                    # 收数据
                    data = s.recv(2048)
                    if not data:
                        raise ConnectionResetError()
                    wlist.append(s)
                    # s.send(data.upper())
                    # 将要发送的数据和socket 保存起来
                    msgs.append((s,data))
                except ConnectionResetError:
                    s.close()
                    rlist.remove(s)
                    if s in wlist:wlist.remove(s)
    
        # 处理可写的socket
        for s in was:
            for msg in msgs[:]:
                if msg[0] == s:
                    s.send(msg[1].upper())
                    # 发送成功之后 删除已经无用的数据 并且需要将socket从wlist列表中删除
                    # 不删除会造成死循环 因为socket 一直处于可写状态
                    msgs.remove(msg)
                    wlist.remove(s)

    客户端

    import os
    import socket
    
    client = socket.socket()
    client.connect(("127.0.0.1",1688))
    while True:
        msg = input("msg:")
        if not msg:continue
        client.send(msg.encode("utf-8"))
        print(client.recv(2048).decode("utf-8"))
  • 相关阅读:
    RAID磁盘阵列介绍
    Nginx如何使用Nginx实现MySQL数据库的负载均衡
    挽救数据库性能的30条黄金法则
    mysql主从复制 (指定复制的数库或者表)
    Nginx系列之负载均衡策略
    Redis安装部署(一主二从三哨兵)
    让你的 Linux 命令骚起来
    MySQL/数据库 知识点总结
    Docker私有仓库搭建与界面化管理
    mysql sql语句修改字段名称,字段长度
  • 原文地址:https://www.cnblogs.com/tingguoguoyo/p/10999888.html
Copyright © 2020-2023  润新知