非阻塞,单线程并发处理多个请求的模型

import socket
import time


tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

tcp_socket.bind(("", 9999))

tcp_socket.listen(128)

tcp_socket.setblocking(False)

new_socket_list = list()

while True:

    time.sleep(1)  # 用于调试

    try:
        new_socket, new_addr = tcp_socket.accept()
    except Exception as e:
        print("没有客户连接")
    else:
        print("新来了客户端连接%s:%s" % new_addr)
        new_socket.setblocking(False)
        new_socket_list.append(new_socket)

    for socket in new_socket_list:
        try:
            recv_data = socket.recv(1024)
        except Exception as e:
            print("%s:%s没有发送过来数据" % new_addr)
        else:
            if recv_data:
                print("接收%s:%s发送来的数据" % new_addr)
            else:  # recv_data为空,说明客户端调用了close,此时该socket全部数据接收完毕,应从列表移除
                socket.close()
                new_socket_list.remove(socket)
                print("%s:%s断开连接" % new_addr)

 

posted @ 2020-04-01 00:29  olivertian  阅读(338)  评论(0编辑  收藏  举报