zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    MySQL 50条必练查询语句
    Spring MVC
    macaron 根目录默认为templates文件夹,所以如果启动目录同目录下有templates目录,要给它指定另一个文件夹
    table 表格配色
    应用连接数瓶颈解决方案
    idea修改文件的打开方式
    golang template使用
    childnode的after()方法失效问题
    vue双循环或者多循环作用于同一元素时,在外套template标签
    vue遇到组件数据变更了,但是不渲染的问题
  • 原文地址:https://www.cnblogs.com/WhatTTEver/p/6834269.html
Copyright © 2011-2022 走看看