1.使用select模拟socketserver伪并发处理客户端请求,代码如下:

import socket
import select

sk = socket.socket()
sk.bind(('127.0.0.1', 9999,))
sk.listen(5)

inputs = [sk,]
outputs = []
messages = {}
# del messages[白宇]
# messages = {
#    白宇:[消息1,消息2,]
#    吴文煜:[消息1,消息2,]
# }
while True:
    rlist,wlist,elist, = select.select(inputs, outputs,[sk,],1)
    print(len(inputs),len(rlist),len(wlist), len(outputs))
    # 监听sk(服务器端)对象,如果sk对象发生变化,表示有客户端来连接了,此时rlist值为【sk】
    # 监听conn对象,如果conn发生变化,表示客户端有新消息发送过来了,此时rlist的之为 【客户端】
    # rlist = 【吴文煜,】
    # rlist = 【张磊,白宇,】
    # rlist = [sk,]
    # wlist 发过消息的对象追加到添加到此列表中
    # elist socket出现异常情况,追加到此列表中
    for r in rlist:
        if r == sk:
            # 新客户来连接
            conn, address = r.accept()
            # conn是什么?其实socket对象
            inputs.append(conn)
            messages[conn] = []
            conn.sendall(bytes('hello', encoding='utf-8'))
        else:
            # 有人给我发消息了
            print('=======')
            try:
                ret = r.recv(1024)
                # r.sendall(ret)
                if not ret:
                    raise Exception('断开连接')
                else:
                    outputs.append(r)
                    messages[r].append(ret)
            except Exception as e:
                inputs.remove(r)
                del messages[r]

    # 所有给我发过消息的人
    for w in wlist:
        msg = messages[w].pop()
        resp = msg + bytes('response', encoding='utf-8')
        w.sendall(resp)
        outputs.remove(w)



# rlist = [sk,],rlist=[sk1,],rlist = [sk1,sk2]
# rlist = []
socket_select_server

相关文章:

  • 2022-01-16
  • 2021-06-05
  • 2021-10-10
  • 2021-11-08
  • 2021-10-07
  • 2021-08-29
  • 2022-12-23
  • 2021-06-10
猜你喜欢
  • 2021-05-20
  • 2022-12-23
  • 2022-12-23
  • 2021-09-08
  • 2021-10-03
  • 2021-04-22
  • 2022-02-09
相关资源
相似解决方案