Python-网络编程:一个简单的http server5(单进程单线程,非堵塞方式 并发 实现,短连接)

import socket, re

# 充当http server
def main():
    # 1. 创建监听套接字
    tcp_socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    #此处可以加一句,资源立即释放的语句(略)

    # 2.绑定信息
    local_ip = ""
    local_port = 5000
    local_addr = (local_ip, local_port)
    tcp_socket_server.bind(local_addr)

    # 3.设置为监听模式
    tcp_socket_server.listen(128)

    # 设置套接字是非堵塞的方式
    tcp_socket_server.setblocking(False)

    # 4.准备接客
    # 用单进程单线程,非堵塞实现并发
    client_socket_list = list()
    while True:
        print("等待连接...")
        # (1) accept等待连接,等待到连接后返回新创建的套接字和连接进来的客户端地址
        # accept默认为堵塞的,现在将监听socket设置为非堵塞的,故要用try except把下面句子包起来
        try:
            new_socket, client_addr = tcp_socket_server.accept()
        except Exception as ret:
            print("---no client--")
        else:
            print("--new coming--")
            new_socket.setblocking(False)  # 设置套接字为非堵塞方式
            client_socket_list.append(new_socket)
        
        for client_socket in client_socket_list:
            try: 
                recv_data = client_socket.recv(1024)
            except Exception as ret:
                print("----no data-----")
            else:
                # 当不产生异常时,有两种可能,
                # 第一种:收到了数据
                if recv_data:
                    print("-------对方发来了数据------")
                # 第二种,对方调用了close,导致了recv返回
                else:
                    client_socket.close()
                    client_socket_list.remove(client_socket)
                    print("客户端已经关闭")

    # 6.正常的程序流程要关闭套接字
    tcp_socket_server.close()


if __name__ == "__main__":
    main()

 

你可能感兴趣的:(Python3)