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

抟扶摇而上者九万里
原文地址:https://www.cnblogs.com/fengting0913/p/13390628.html