1. 程式人生 > 其它 >python 實驗普通IO和多路複用IO

python 實驗普通IO和多路複用IO

普通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).

多路複用的文章參考:

(4條訊息) 你管這破玩意叫 IO 多路複用?_程式設計師小灰的部落格-CSDN部落格

Python實現socket的非阻塞式程式設計 - 簡書 (jianshu.com)