8.4 Python使用socket通信(创建TCP服务端和客户端)并加入多线程

该博客介绍使用Python进行socket通信,创建TCP服务端和客户端并加入多线程。服务端可同时连接多个客户端,接收数据后转发给所有连接的客户端;客户端获取用户输入并发送给服务端,打印返回数据。通过threading.Thread创建线程,保证各客户端互不干扰。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

4、使用socket通信(创建TCP服务端和客户端)并加入多线程

需求:

  • 服务端
    • 收到客户端连接后输出客户端地址信息
    • 可同时连接多个客户端
    • 收到客户端发送的数据后,将数据发送给所有连接的客户端
  • 客户端:
    • 获取用户输入后,将输入数据发送给服务端
    • 打印服务端返回的数据
    • 用户可多次输入

解决方案:

  • 使用socket通信
    • 发送数据:send() 方法用于 TCP 协议的通信;sendto() 方法用于 UDP 协议的通信
    • 接受数据:recv() 方法
  • 加入多线程
    • 通过 threading.Thread 创建线程
    • 服务端为每个客户端启动一条线程(保证各客户端互不干扰)
    • 客户端为网络 IO 启动一条线程,为用户交互启动一条线程

服务端

import socket, threading

client_list = []       # 客户端列表

def server_target(sever_socket):
    while True:
        content = sever_socket.recv(2048).decode('UTF-8')    # 接受客户端发送的数据
        if content is not None:
            print(content)            # 打印客户端发送的数据
            for cl in client_list:    # 将数据送回给每个客户端
                cl.send(content.encode('UTF-8'))

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
s.bind(('192.168.1.10', 30000))
s.listen()

while True:
    c, addr = s.accept()
    print(addr)
    client_list.append(c)                                       # 将所有客户端对应的socket保存在列表中
    threading.Thread(target=server_target, args=(c,)).start()   # 为客户端对应的socket启动对应的线程

客户端

import socket, threading

def read_server(client_socket):
    while True:
        content = client_socket.recv(2048).decode('UTF-8')
        if content is not None:
            print(content)

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('192.168.1.10', 30000))

# 将 read_socket 函数以多线程的方式启动,这样该函数(包含死循环)能与下面的死循环并发执行
threading.Thread(target=read_server, args=(client_socket,)).start()

while True:
    line = input('')                            # 获取用户输入
    if line is None or line == 'exit':
        break
    client_socket.send(line.encode('UTF-8'))    # 将用户输入的内容发送给服务端

步骤:

  1. 运行服务端

  2. 运行 3 个客户端后,服务端界面:

    在这里插入图片描述

  3. 客户端 1 输入:客户端1测试1

    在这里插入图片描述

    服务端界面客户端2界面客户端3界面
    在这里插入图片描述在这里插入图片描述在这里插入图片描述
  4. 客户端1输入:客户端1测试2

    在这里插入图片描述

    服务端界面客户端2界面客户端3界面
    在这里插入图片描述在这里插入图片描述在这里插入图片描述
  5. 其它客户端同理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值