1. 程式人生 > 實用技巧 >TCP併發伺服器

TCP併發伺服器

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