zoukankan      html  css  js  c++  java
  • 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"))
  • 相关阅读:
    正则表达式练习
    Linux下文件删除的原理
    (转)linux grep 正则表达式
    linux 需要记忆的知识
    linux 常用命令
    TestNG测试方法
    TestNG配置注解
    jquery 获取和设置 select下拉框的值
    Kings(状压DP)
    Tirp(状压DP)
  • 原文地址:https://www.cnblogs.com/tingguoguoyo/p/10999888.html
Copyright © 2011-2022 走看看