python 實驗普通IO和多路複用IO
阿新 • • 發佈:2021-06-19
普通IO方式
服務端:
# -*- coding: utf-8 -*- """ @Time : 2021/6/19 10:12 @Author : xiaochao """ import socket # 建立一個socket # socket.AF_INET 型別指明為網路連線; # socket.SOCK_STREAM 表示當前連線為TCP連線 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 繫結服務端,監聽的埠 server_socket.bind(("localhost", 6999)) # 表示服務端,最多可接受5個等待的客戶端連線;再多的連線請求會被拒絕server_socket.listen(5) print("Start server") while True: # 等待某個客戶端的連線,如果有多個客戶端連線,後到的會排隊 conn, addr = server_socket.accept() print("Success connect with:%s." % str(addr)) print(conn, addr) # 處理對當前客戶端的連線請求 # 當前和客戶端建立連線後,會一直在此處理或等待;直到對方關閉連線 while True: try: data= conn.recv(1024) print("receive:", data.decode()) msg = "hi client:%s, I am server, and I get you message." % str(addr) conn.send(msg.encode("utf8")) except (ConnectionResetError, ConnectionAbortedError) as e: print("當前連線已關閉,client:%s." % str(addr))print(str(e)) break conn.close()
客戶端:
# -*- coding: utf-8 -*- """ @Time : 2021/6/19 10:12 @Author : xiaochao """ import socket import time # 建立客戶端socket client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 與服務端建立連線 client_socket.connect(("localhost", 7999)) print("Success connect with server") # 模擬傳送10次訊息 for i in range(10): time.sleep(5) msg = "hi server, I am client 1, message:%s." % i client_socket.send(msg.encode("utf8")) data = client_socket.recv(1024) print("Get server response:%s." % data.decode()) client_socket.close()
服務端多路複用:
# -*- coding: utf-8 -*- """ @Time : 2021/6/19 10:12 @Author : xiaochao """ import select import socket # 建立一個socket # socket.AF_INET 型別指明為網路連線; # socket.SOCK_STREAM 表示當前連線為TCP連線 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 繫結服務端,監聽的埠 server_socket.bind(("localhost", 7999)) # 設定非阻塞方式 server_socket.setblocking(False) server_socket.listen(5) print("Start server") inputs = [server_socket, ] while True: r_list, w_list, e_list = select.select(inputs, [], [], 3) for event in r_list: if event == server_socket: new_sock, addr = event.accept() print("Get new client:%s." % str(addr)) inputs.append(new_sock) else: client_name = event.getpeername() data = event.recv(1024) if data: print("Receive client:%s msg:%s." % (client_name, data.decode())) msg = "hi client:%s, i am server." % str(client_name) event.send(msg.encode("utf8")) else: print("Connect close with client:%s." % str(client_name)) inputs.remove(event)
建立兩個客戶端,連線多路複用的服務端,輸出如下:
Start server Get new client:('127.0.0.1', 51550). Receive client:('127.0.0.1', 51550) msg:hi server, I am client 1, message:0.. Receive client:('127.0.0.1', 51550) msg:hi server, I am client 1, message:1.. Receive client:('127.0.0.1', 51550) msg:hi server, I am client 1, message:2.. Receive client:('127.0.0.1', 51550) msg:hi server, I am client 1, message:3.. Get new client:('127.0.0.1', 51555). Receive client:('127.0.0.1', 51550) msg:hi server, I am client 1, message:4.. Receive client:('127.0.0.1', 51555) msg:hi server, I am client 2, message:0.. Receive client:('127.0.0.1', 51550) msg:hi server, I am client 1, message:5.. Receive client:('127.0.0.1', 51555) msg:hi server, I am client 2, message:1.. Receive client:('127.0.0.1', 51550) msg:hi server, I am client 1, message:6.. Receive client:('127.0.0.1', 51555) msg:hi server, I am client 2, message:2.. Receive client:('127.0.0.1', 51550) msg:hi server, I am client 1, message:7.. Receive client:('127.0.0.1', 51555) msg:hi server, I am client 2, message:3.. Receive client:('127.0.0.1', 51550) msg:hi server, I am client 1, message:8.. Receive client:('127.0.0.1', 51555) msg:hi server, I am client 2, message:4.. Receive client:('127.0.0.1', 51550) msg:hi server, I am client 1, message:9.. Connect close with client:('127.0.0.1', 51550). Receive client:('127.0.0.1', 51555) msg:hi server, I am client 2, message:5.. Receive client:('127.0.0.1', 51555) msg:hi server, I am client 2, message:6.. Receive client:('127.0.0.1', 51555) msg:hi server, I am client 2, message:7.. Receive client:('127.0.0.1', 51555) msg:hi server, I am client 2, message:8.. Receive client:('127.0.0.1', 51555) msg:hi server, I am client 2, message:9.. Connect close with client:('127.0.0.1', 51555).
多路複用的文章參考: