Python 協程實現socket並發


socket多並發
  socket可以實現單個客戶端進行請求訪問,它可以通過 socketserver來實現並發功能呢,socketserver是通過 啟用多線程實現並發,在這里我們也可以通過gevent協程 來實現單個線程下的多並發。
 
socket server:
import gevent
from gevent import socket,monkey
monkey.patch_all()


def server(port):
    s = socket.socket()
    s.bind(('0.0.0.0', port))
    s.listen(500)
    while True:
        cli, addr = s.accept()

        # socket會創建一個線程鏈接,這里會交給協程處理
        # 鏈接后通過gevent啟動一個協程
        # 接收一個函數,與鏈接實例參數
        gevent.spawn(handle_request, cli)


# 所有交互都由handle處理
def handle_request(conn):
    try:
        while True:
            data = conn.recv(1024)
            print("recv:", data)
            conn.send(data)
            if not data:
                # 如果沒有數據就關閉Client端
                conn.shutdown(socket.SHUT_WR)
    # 如果出現異常就打印異常
    except Exception as  ex:
        print(ex)
    # 最后中斷實例的conn
    finally:
        conn.close()
if __name__ == '__main__':
    server(8001)

 

socket client(多次開啟,測試訪問):
import socket

# 鏈接服務端
HOST = 'localhost'    # The remote host
PORT = 8001           # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))

# 數據請求
while True:
    msg = bytes(input(">>:"),encoding="utf8")
    s.sendall(msg)
    data = s.recv(1024)
    #print(data)

    # repr格式化輸出
    print('Received', repr(data))
s.close()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM