• select实现socket多并发


    __author__ = "Leo"
    import select
    import socket
    import queue

    server=socket.socket()
    server.bind(('localhost',8568))
    server.listen(1000)

    server.setblocking(0)
    inputs=[server, ]
    #inputs=[server, conn1,conn2]#连接对象(来自client)
    outputs=[] #返回数据
    #outputs=[r1,r2]#要返回给客户端的连接列表
    msg_dict={}
    while True:
    readale, writebale, excptional = select.select(inputs, outputs, inputs) # 如果没有任何fd就绪,程序就会一直阻塞在这里
    print(readale, writebale, excptional)
    for r in readale:#每个r就是一个socket
    if r is server:#代表来了一个新连接
    conn,add=server.accept()
    print(conn,add)
    inputs.append(conn)#新建立的连接还未发送数据,现在接受程序就报错
    #所以要想实现这个客户端要想实现这个客户端发送数据来时server端能知道,
    #就需要这个selece在监测 gvbd
    msg_dict[conn]=queue.Queue()#初始化一个队列,后面存要返回给客户端的数据。接收到客户端的数据后,不立刻返回而是暂存在队列中,以后再发送。
    else:#如果不是新连接,那就收数据
    data=r.recv(1024)
    if data:#如果收到的数据不为空
    print("recv data:",data.decode())
    msg_dict[r].put(data)#收到的数据先放到queue里,一会再返回数据给客户端
    if r not in outputs:
    outputs.append(r)#放入返回的连接队列里
    else: #如果收不到data,代表客户端断开连接了
    print("客户端断开了", s)

    if r in outputs:
    outputs.remove(s) # 清理已断开的连接

    inputs.remove(s) # 清理已断开的连接

    del msg_dict[r] ##清理已断开的连接

    # r.send(data.upper())
    # print("send done...")
    for w in writebale:#要返回给客户端的数据
    data_to_client=msg_dict[w].get()#获取队列中的数据
    w.send(data_to_client)#返回客户端数据源
    outputs.remove(w)#确保下次循环的时候不返回已经处理的连接

    for e in excptional:
    if e in outputs:
    outputs.remove(e)
    inputs.remove(e)
  • 相关阅读:
    IdentityServer4 突然登录就不香了?SameSite?
    11111
    搭建ASP.NET Core API框架(1) 从零开始
    搭建ASP.NET WEB API框架(3) 内核数据库
    搭建VUE项目框架(2) 创建项目
    搭建ASP.NET WEB API框架(2) 创建项目
    搭建ASP.NET WEB API框架(1) 从零开始
    搭建ASP.NET MVC5框架(2) 创建项目
    搭建VUE项目框架(1) 从零开始
    搭建ASP.NET MVC5框架(1) 从零开始
  • 原文地址:https://www.cnblogs.com/WhatTTEver/p/6834269.html
Copyright © 2020-2023  润新知