python单线程、单进程、非堵塞的方式实现多任务(服务器端的socket)

    技术2022-07-11  122

    # 单线程、单进程、非堵塞的方式实现多任务(接收多个客户端请求) import socket # 建立服务器的socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定服务器的ip和port server_socket.bind(("", 8080)) # 开启监听 server_socket.listen(128) # 因为要实现socket的单线程、单进程、非堵塞的多任务 # 1、调用非堵塞方法 server_socket.setblocking(False) client_socket_list = list() while True: # 2、因为开启了非堵塞的方式,因此accept方式在没有用户来的时候就不会堵塞,因此会产生异常 try: client_socket, client_addr = server_socket.accept() except Exception as ret: # 只要有异常就表示没有新的客户端 print("没有新的客户端请求到来") else: # 没有异常的话,就表示有新的客户端到来 print("新的客户端到来") # 因为新的客户端会进行recv操作,而recv的操作是会堵塞的,因此一旦产生了一个新的client-socket就必须解堵塞 client_socket.setblocking(False) # 重点是用户虽然链接上了服务器,但不一定会立即发消息,因此需要对改用户继续判断 client_socket_list.append(client_socket) # 上面的步骤完成了以非堵塞的方式判断是否有客户端到来,接下来需要判断客户端是否发消息即recv # 因此需要对list中的每一个客户端都进行判断 for client in client_socket_list: # client的recv方式是堵塞的,而在上面判断中又解堵塞了,因此需要用try except捕获异常 try: recv_data = client.recv(1024) except Exception as ret_recv: print("该用户没有传数据") # 如果没有产生异常,那么就说明收到了消息,而受道消息又有两种情况,一是用户发送了消息,二是用户调用了close else: if recv_data: print(recv_data.decode("utf-8")) else: client_socket_list.remove(client) client.close()

    如果以上有任何写的不对的地方欢迎各位指出问题,欢迎各位交流学习!

    Processed: 0.012, SQL: 10