Loading

两种实现TCP并发的方式

【一】socketserver模块实现TCP并发服务

  • 服务端
import socketserver


class RequesterHandle(socketserver.BaseRequestHandler):
    def handle(self) -> None:
        print(self.request)
        print(self.client_address)  # self.request 相当于TCP协议的conn
        # 传输数据
        while True:
            try:
                data = self.request.recv(1024)
            except:
                break
            if not data:
                break
            data = data.decode('utf-8')
            print(f'客户端:>>>>{data}')
            self.request.send(data.upper().encode('utf-8'))


sk = socketserver.ThreadingTCPServer(('127.0.0.1', 8080), RequesterHandle)
sk.serve_forever()  # 循环获取连接对象,每起一个对象,都会起一个线程,然后把连接对象交给线程
  • 客户端(不变)
import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8080))
while True:
    to_data = input('请输入小写字母:>>>>').strip()
    client.send(to_data.encode('utf-8'))
    if to_data == 'q':
        break
    if not to_data:
        continue
    data = client.recv(1024).decode('utf-8')
    print(f'服务端:>>>>{data}')
client.close()

【二】multiprocessing模块实现TCP并发服务

  • 服务端
import socket
from multiprocessing import Process
from socket import SOL_SOCKET, SO_REUSEADDR
server = socket.socket()
server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
server.bind(('127.0.0.1', 8087))
server.listen(5)


def process(conn):
    while True:
        try:
            data = conn.recv(1024).decode('utf-8')
        except:
            break
        if not data:
            break
        to_data = data.upper()
        conn.send(to_data.encode('utf-8'))
        print(f'正在为{conn}服务')
    conn.close()


if __name__ == '__main__':
    while True:
        conn, addr = server.accept()
        p = Process(target=process, args=(conn,))
        p.start()

  • 客户端(不变)
import socket

client = socket.socket()
client.connect(('127.0.0.1', 8087))
while True:
    to_data = input('请输入消息:>>>>').strip()
    client.send(to_data.encode('utf-8'))
    if to_data == 'q':
        break
    if not to_data:
        continue
    print(client.recv(1024).decode('utf-8'))
client.close()
posted @ 2024-01-17 20:38  HuangQiaoqi  阅读(28)  评论(0编辑  收藏  举报