TCP併發伺服器
阿新 • • 發佈:2020-07-28
基於TCP協議編寫併發伺服器
基於多程序編寫 tcp 併發伺服器
import socket import multiprocessing def set_server(): """ 伺服器相關設定 :return: """ # 1、建立'TCP'協議下的套接字物件 sk = socket.socket() # 2、一般來說,一個埠釋放後會等待兩分鐘之後才能再被使用, # 'SO_REUSEADDR'是讓埠釋放後立即就可以被再次使用 # 'value'設定為 1,表示將'SO_REUSEADDR'標記為'TRUE' sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 3、服務端繫結(ip + port)註冊網路 sk.bind(("127.0.0.1", 6688)) # 4、開啟監聽 sk.listen(5) try: while True: conn, client_addr = sk.accept() p1 = multiprocessing.Process(target=deal_client_request, args=(conn, client_addr)) p1.start() conn.close() finally: sk.close() def deal_client_request(conn, client_addr): """ 處理客戶端的請求,為其服務,進行資料收發 :param conn: :param client_addr: :return: """ while True: recv_msg = conn.recv(1024) if len(recv_msg) > 0: print(recv_msg.decode()) else: print(f"{client_addr} 客戶端已主動關閉!") break conn.close() if __name__ == "__main__": set_server()
基於多執行緒編寫 tcp 併發伺服器
# 多執行緒 tcp 併發伺服器 import socket import threading def server_set(): """ 伺服器相關設定 :return: """ sk = socket.socket() sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sk.bind(("127.0.0.1", 6688)) sk.listen(5) try: while True: conn, client_addr = sk.accept() t1 = threading.Thread(target=deal_client_request, args=(conn, client_addr)) t1.start() finally: sk.close() def deal_client_request(conn, client_addr): """ 處理客戶端請求,進行資料收發 :param conn: :param client_addr: :return: """ while True: recv_msg = conn.recv(1024) if len(recv_msg) > 0: print(recv_msg.decode()) else: print(f"{client_addr} 客戶端已主動關閉連線!") break conn.close() if __name__ == "__main__": server_set()
基於 SocketServer 實現簡化併發伺服器
import socketserver class MyServer(socketserver.BaseRequestHandler): def handle(self): while True: # 接收資料 recv_msg = self.request.recv(1024) print(recv_msg.decode()) # 響應資料 self.request.send(recv_msg) if __name__ == "__main__": # 允許埠重用 socketserver.TCPServer.allow_reuse_address = True # 例項化伺服器物件 server = socketserver.ThreadingTCPServer(("127.0.0.1", 6688), MyServer) # 伺服器永久執行 server.serve_forever()