python实现单线程多任务非阻塞TCP服务端

本文介绍了一个使用Python实现的非阻塞多客户端TCP服务器程序。该服务器能够同时处理多个客户端连接请求,并通过设置socket为非阻塞模式来提高响应效率。当有新的客户端连接时,服务器将其添加到客户端列表中并为其设置非阻塞模式。

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

代码

# coding:utf-8
from socket import *

# 1.创建服务器socket
sock = socket(AF_INET, SOCK_STREAM)

# 2.绑定主机和端口
addr = ('', 7788)  #
sock.bind(addr)

# 3. 设置最大监听数目,并发
sock.listen(10)

# 4. 设置成非阻塞
sock.setblocking(False)
# 保存客户端socket
clientAddrList = []
# print(sock.)

while 1:
    try:
        clientSocket, clientAddr = sock.accept()
    except:
        pass
    else:
        print("一个新客户端到来:%s" % str(clientAddr))
        clientSocket.setblocking(False)
        clientAddrList.append((clientSocket, clientAddr))

    for clientSocket, clientAddr in clientAddrList:
        try:
            recvData = clientSocket.recv(1024)
        except:
            pass
        else:
            if len(recvData) > 0:
                print("%s:%s" % (str(clientAddr), recvData))
            else:
                clientSocket.close()
                clientAddrList.remove((clientSocket, clientAddr))
                print("%s 已经下线" % str(clientAddr))

 

转载于:https://www.cnblogs.com/vathe/p/7001127.html

<think>好的,用户想了解PythonTCP服务端和客户端的多线程开发。首先,我需要回忆一下相关的知识,确保自己理解正确。TCP是面向连接的协议,服务端和客户端通过套接字通信。多线程在这里的作用应该是处理多个客户端的连接,避免阻塞主线程。 首先,服务端方面,通常的步骤是创建socket,绑定地址和端口,监听连接。但单线程的话,一次只能处理一个连接,所以需要多线程。每当有新的客户端连接时,就创建一个新线程来处理这个客户端的请求,这样主线程可以继续接受其他连接。这里需要注意线程的管理,比如线程的启动和资源释放。 然后,客户端方面,可能也需要多线程,比如同时处理用户输入和接收服务器消息。例如,一个线程等待用户输入并发送,另一个线程持续接收服务器的响应。这样可以避免阻塞,提高交互性。 接下来,我需要考虑具体的代码结构。服务端使用socket模块,创建主循环,在accept后生成线程。线程处理函数里负责接收和发送数据。客户端同样创建两个线程,一个用于发送,一个用于接收。 需要注意的问题包括线程同步、资源竞争、异常处理,比如客户端断开连接时如何正确关闭连接和线程。此外,端口和地址的设置,确保服务端和客户端能正确连接。 可能还需要提到一些注意事项,比如多线程的缺点,比如GIL的存在导致CPU密集型任务可能效率不高,但IO密集型任务还是可以受益。或者使用Threading模块的基本用法,如继承Thread类或者传递目标函数。 另外,代码示例要正确,符合Python3的语法,比如使用socket.socket(),bind((host, port)),listen(),accept(),以及线程的启动和join。还要注意编码解码,使用decode()和encode()处理字节流。 用户可能想知道如何实际运行这些代码,比如先启动服务端,再启动多个客户端。测试部分可能也需要简单提及,比如如何模拟多个客户端连接。 最后,总结多线程在TCP开发中的作用,以及可能的扩展,比如使用线程池限制线程数量,或者结合异步IO等其他方法。</think>好的,我将以结构化的方式为您介绍PythonTCP服务端与客户端的多线程开发,包含关键步骤和示例代码。 ### 一、TCP通信基础原理 1. 服务端核心流程: ```python socket() -> bind() -> listen() -> accept() -> recv()/send() -> close() ``` 2. 客户端核心流程: ```python socket() -> connect() -> recv()/send() -> close() ``` ### 二、多线程服务端开发 #### 1. 服务端代码示例 ```python import socket import threading def handle_client(client_socket): try: while True: data = client_socket.recv(1024) if not data: break print(f"收到数据: {data.decode('utf-8')}") client_socket.send("已接收".encode('utf-8')) finally: client_socket.close() def main(): server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(('0.0.0.0', 8888)) server.listen(5) print("服务端启动,等待连接...") while True: client, addr = server.accept() print(f"新连接: {addr}") client_handler = threading.Thread( target=handle_client, args=(client,) ) client_handler.start() if __name__ == "__main__": main() ``` #### 2. 关键点说明 - `socket.AF_INET`:使用IPv4地址族 - `socket.SOCK_STREAM`:使用TCP协议 - `listen(5)`:设置等待队列最大长度 - 每个客户端连接创建独立线程处理 ### 三、多线程客户端开发 #### 1. 客户端代码示例 ```python import socket import threading def receive_handler(sock): while True: try: data = sock.recv(1024) print(f"\n服务器响应: {data.decode('utf-8')}") except ConnectionResetError: print("连接已断开") break def main(): client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(('127.0.0.1', 8888)) # 启动接收线程 receiver = threading.Thread( target=receive_handler, args=(client,) ) receiver.daemon = True receiver.start() try: while True: message = input("输入消息(输入exit退出): ") if message.lower() == 'exit': break client.send(message.encode('utf-8')) finally: client.close() if __name__ == "__main__": main() ``` #### 2. 关键点说明 - 独立接收线程避免阻塞输入 - `daemon=True`设置守护线程 - 异常处理保证连接关闭 ### 四、运行测试步骤 1. 启动服务端程序 2. 启动多个客户端程序 3. 观察不同客户端的独立通信 ### 五、注意事项 1. 资源管理 - 使用线程池 (`concurrent.futures.ThreadPoolExecutor`) 限制最大线程数 - 及时释放关闭的socket连接 2. 线程安全 ```python # 使用Lock处理共享资源 from threading import Lock print_lock = Lock() def safe_print(msg): with print_lock: print(msg) ``` 3. 异常处理增强 ```python try: # 通信代码 except ConnectionResetError: print("客户端异常断开") except Exception as e: print(f"发生错误: {str(e)}") ``` ### 六、性能优化建议 1. 使用`selectors`模块实现IO多路复用 2. 设置socket超时参数 ```python client.settimeout(10.0) # 10秒超时 ``` 3. 缓冲区大小调优 ```python BUFFER_SIZE = 4096 # 根据实际需求调整 ``` ### 七、扩展应用场景 1. 实现多用户聊天室 2. 构建分布式计算节点 3. 开发物联网设备通信服务 4. 创建游戏服务器架构 实际开发中建议结合日志模块记录运行状态,使用`argparse`处理命令行参数,并通过配置文件管理IP/端口等参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值