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()