【TCP 网络通信(发送端 + 接收端)实例 —— Python】
TCP 网络通信(发送端 + 接收端)实例 —— Python
- 1. 引言
- 2. 创建 TCP 服务器(接收端)
- 2.1 代码示例:TCP 服务器
- 2.2 代码解释:
- 3. 创建 TCP 客户端(发送端)
- 3.1 代码示例:TCP 客户端
- 3.2 代码解释:
- 4. 运行示例
- 5. 异步 TCP 通信
- 5.1 异步 TCP 服务器
- 5.2异步 TCP 客户端
- 5.3 代码解释:
- 6. 总结
- 7. 常见问题解答
- 8. 参考资料
1. 引言

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它广泛应用于互联网和局域网中,确保数据能够安全、有序地从一个设备传输到另一个设备。本文将通过具体的 Python 实例,详细介绍如何实现 TCP 网络通信中的发送端和接收端。
- NetAssist网络调试助手
- Python环境配置
准备工作
在开始编写代码之前,确保您已经安装了 Python 环境。Python 内置的
socket
模块提供了对低级网络接口的访问,因此不需要额外安装任何库。
2. 创建 TCP 服务器(接收端)
服务器端的主要任务是监听来自客户端的连接请求,并与每个连接的客户端进行双向通信。我们将使用多线程来处理多个客户端的并发连接。
2.1 代码示例:TCP 服务器
import socket
import threading
import queue
import time# 定义服务器地址和端口
HOST = '192.168.1.111' # 本地回环地址
PORT = 8080 # 非特权端口# 全局消息队列,用于存储服务器要发送的消息
message_queue = queue.Queue()# 线程安全的客户端列表,存储所有已连接的客户端套接字
clients = set()# 锁对象,确保对 clients 集合的操作是线程安全的
lock = threading.Lock()def handle_client(client_socket, client_address):print(f"Connected by {client_address}")try:while True:# 接收来自客户端的数据data = client_socket.recv(1024)if not data:break # 如果没有收到数据,退出循环print(f"Received from {client_address}: {data.decode()}")# 发送响应给客户端response = f"Server received: {data.decode()}"client_socket.sendall(response.encode())# 模拟服务器主动发送数据time.sleep(5) # 每隔5秒检查是否有新消息with lock:if not message_queue.empty():msg = message_queue.get()print(f"Sending to {client_address}: {msg}")client_socket.sendall(msg.encode())except Exception as e:print(f"Error handling client {client_address}: {e}")finally:# 关闭客户端连接with lock:clients.discard(client_socket)client_socket.close()print(f"Connection with {client_address} closed.")def broadcast_message(message):"""将消息发送给所有已连接的客户端"""with lock:for client in clients:try:client.sendall(message.encode())except Exception as e:print(f"Failed to send message to client: {e}")def start_server():with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket:server_socket.bind((HOST, PORT))server_socket.listen()print(f"Server listening on {HOST}:{PORT}")# 启动一个后台线程,定期检查消息队列并广播消息threading.Thread(target=check_and_broadcast_messages, daemon=True).start()while True:client_socket, client_address = server_socket.accept()with lock:clients.add(client_socket)# 为每个新连接启动一个新的线程来处理client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address))client_thread.start()def check_and_broadcast_messages():"""定期检查消息队列并广播消息"""while True:if not message_queue.empty():msg = message_queue.get()print(f"Broadcasting message: {msg}")broadcast_message(msg)time.sleep(1) # 每隔1秒检查一次if __name__ == "__main__":# 启动服务器threading.Thread(target=start_server, daemon=True).start()# 模拟服务器主动发送消息while True:msg = input("Enter message to broadcast (or type 'exit' to quit): ")if msg.lower() == 'exit':breakmessage_queue.put(msg)
2.2 代码解释:
server_socket.bind():绑定服务器到指定的 IP 地址和端口。server_socket.listen():使服务器进入监听状态,等待客户端连接。server_socket.accept():接受一个客户端连接,返回一个新的套接字对象和客户端地址。handle_client():处理客户端的通信,接收数据并回显给客户端。threading.Thread():为每个新连接启动一个新的线程,以便服务器可以同时处理多个客户端。
运行服务端

客户端响应,发送body1,正常回传。🤞🤞🤞

3. 创建 TCP 客户端(发送端)
客户端的主要任务是连接到服务器,并与服务器进行双向通信。客户端可以发送消息给服务器,并接收服务器的响应。
3.1 代码示例:TCP 客户端
import socket
import threading# 定义服务器地址和端口
HOST = '192.168.1.101' # 本地回环地址
PORT = 8080 # 非特权端口client_socket = Nonedef receive_messages():global client_socketwhile True:try:# 接收服务器的响应response = client_socket.recv(1024).decode()if not response:breakprint(f"Received from server: {response}")except Exception as e:print(f"Error receiving message: {e}")breakdef start_client():global client_socketclient_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client_socket.connect((HOST, PORT))print(f"Connected to server at {HOST}:{PORT}")# 启动一个线程来接收消息receive_thread = threading.Thread(target=receive_messages)receive_thread.daemon = True # 设置为守护线程,主程序退出时自动结束receive_thread.start()while True:# 输入要发送的消息message = input("Enter message to send (or type 'exit' to quit): ")if message.lower() == 'exit':break# 发送消息给服务器client_socket.sendall(message.encode())client_socket.close()if __name__ == "__main__":start_client()
3.2 代码解释:
client_socket.connect():连接到指定的服务器地址和端口。client_socket.sendall():发送数据到服务器。client_socket.recv():接收来自服务器的数据。input():从用户输入获取要发送的消息,用户可以输入exit来终止程序。
4. 运行示例
-
启动服务器:
- 打开一个终端或命令提示符窗口,导航到包含服务器代码的文件夹,然后运行以下命令:
python tcp_server.py - 服务器将开始监听指定的端口,并等待客户端连接。
- 打开一个终端或命令提示符窗口,导航到包含服务器代码的文件夹,然后运行以下命令:
-
启动客户端:
- 打开另一个终端或命令提示符窗口,导航到包含客户端代码的文件夹,然后运行以下命令:
python tcp_client.py - 客户端将连接到服务器,并允许用户输入消息发送给服务器。
- 打开另一个终端或命令提示符窗口,导航到包含客户端代码的文件夹,然后运行以下命令:
-
测试通信:
- 在客户端窗口中输入消息,按回车键发送给服务器。
- 服务器将接收消息并回显给客户端,客户端会显示服务器的响应。
- 用户可以继续发送消息,或者输入
exit来终止程序。

服务端接收:

这个只能一发一收,不能连续发或连续收,接下来采用异步就可以实现这个缺陷,而且响应更好
5. 异步 TCP 通信
为了提高性能和响应速度,您可以使用 Python 的 asyncio 库来实现异步 TCP 通信。异步编程模型允许程序在等待 I/O 操作时执行其他任务,从而提高效率。
5.1 异步 TCP 服务器
我们将创建一个异步 UDP 服务器,它不仅可以接收来自客户端的数据包并回显,还可以主动向客户端发送消息。服务器将维护一个客户端列表,并定期检查是否有新消息需要发送给所有已连接的客户端。
import asyncio# 定义服务器地址和端口
HOST = '192.168.1.111' # 本地回环地址
PORT = 8080 # 非特权端口client_address = Noneasync def handle_client(reader, writer):global client_addressdata = await reader.read(1024)addr = writer.get_extra_info('peername')client_address = addr # 更新全局的 client_addressprint(f"Received from {addr}: {data.decode()}")# 发送响应给客户端response = f"Server received: {data.decode()}"writer.write(response.encode())await writer.drain()print(f"Sent to {addr}: {response}")async def start_server():server = await asyncio.start_server(handle_client, HOST, PORT)addr = server.sockets[0].getsockname()print(f"Server listening on {addr[0]}:{addr[1]}")async with server:await server.serve_forever()async def broadcast_message():while True:msg = await asyncio.to_thread(input, "Enter message to broadcast (or type 'exit' to quit): ")if msg.lower() == 'exit':breakif client_address is not None: # 确保 client_address 已经被设置try:_, writer = await asyncio.open_connection(*client_address)writer.write(msg.encode())await writer.drain()writer.close()await writer.wait_closed()except ConnectionRefusedError:print("Client is not available.")else:print("No client connected yet.")async def main():# 启动服务器server_task = asyncio.create_task(start_server())# 启动广播消息任务broadcast_task = asyncio.create_task(broadcast_message())await asyncio.gather(server_task, broadcast_task)if __name__ == "__main__":asyncio.run(main())
5.2异步 TCP 客户端
import asyncio# 定义服务器地址和端口
HOST = '192.168.1.101' # 本地回环地址
PORT = 8080 # 非特权端口async def receive_messages(reader):while True:try:# 接收服务器的响应response = await reader.read(1024)if not response:breakprint(f"Received from server: {response.decode()}")except Exception as e:print(f"Error receiving message: {e}")breakasync def send_messages(writer):while True:# 输入要发送的消息message = await asyncio.get_event_loop().run_in_executor(None, input, "Enter message to send (or type 'exit' to quit): ")if message.lower() == 'exit':break# 发送消息给服务器writer.write(message.encode())await writer.drain()async def start_client():reader, writer = await asyncio.open_connection(HOST, PORT)print(f"Connected to server at {HOST}:{PORT}")# 启动两个任务:一个用于接收消息,一个用于发送消息receive_task = asyncio.create_task(receive_messages(reader))send_task = asyncio.create_task(send_messages(writer))# 等待任一任务完成(即用户输入 'exit' 或连接断开)done, pending = await asyncio.wait([receive_task, send_task], return_when=asyncio.FIRST_COMPLETED)# 取消所有未完成的任务for task in pending:task.cancel()try:await taskexcept asyncio.CancelledError:passwriter.close()await writer.wait_closed()if __name__ == "__main__":asyncio.run(start_client())
5.3 代码解释:
asyncio.Protocol:定义了一个异步协议类,用于处理客户端连接。asyncio.open_connection():异步打开与服务器的连接。asyncio.run():启动异步事件循环并运行主函数。- 只能输入英文,暂不支持中文
6. 总结
通过上述示例,我们展示了如何使用 Python 实现 TCP 网络通信中的发送端和接收端。同步版本的代码简单易懂,适合初学者;而异步版本则提供了更高的性能和更好的并发处理能力,适用于更复杂的应用场景。🛹🛹🛹
7. 常见问题解答
-
Q: 如何处理多个客户端的并发连接?
- A: 使用多线程或多进程可以处理多个客户端的并发连接。对于更高效的方式,建议使用
asyncio库来实现异步编程。
- A: 使用多线程或多进程可以处理多个客户端的并发连接。对于更高效的方式,建议使用
-
Q: 如何确保数据传输的可靠性?
- A: TCP 协议本身就是一个面向连接的可靠协议,它会自动处理数据包的丢失、重复和乱序问题。此外,您可以在应用层添加更多的错误检测机制,如校验和或消息确认。
-
Q: 如何处理大文件传输?
- A: 对于大文件传输,建议将文件分块发送,并在每次发送后等待服务器的确认。这样可以确保每一块数据都成功传输,并且可以在出现问题时重新发送。
8. 参考资料
- Python 官方文档 - socket 模块
- Python 官方文档 - asyncio 模块
- TCP/IP 协议详解
从而实现对外部世界进行感知,充分认识这个有机与无机的环境,科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。🤣🤣🤣
- 我会持续更新对应专栏博客,非常期待你的三连!!!🎉🎉🎉
- 如果鹏鹏有哪里说的不妥,还请大佬多多评论指教!!!👍👍👍
- 下面有我的🐧🐧🐧群推广,欢迎志同道合的朋友们加入,期待与你的思维碰撞😘😘😘
相关文章:
【TCP 网络通信(发送端 + 接收端)实例 —— Python】
TCP 网络通信(发送端 接收端)实例 —— Python 1. 引言2. 创建 TCP 服务器(接收端)2.1 代码示例:TCP 服务器2.2 代码解释: 3. 创建 TCP 客户端(发送端)3.1 代码示例:TCP…...
LSTM+改进的itransformer时间序列预测模型代码
代码在最后 本次设计了一个LSTM基于差分多头注意力机制的改进的iTransformer时间序列预测模型结合了LSTM(长短期记忆网络)和改进版的iTransformer(差分多头注意力机制),具备以下优势: 时序特征建模能力&am…...
Apache-HertzBeat 开源监控默认口令登录
0x01 产品描述: HertzBeat(赫兹跳动) 是一个开源实时监控系统,无需Agent,性能集群,兼容Prometheus,自定义监控和状态页构建能力。HertzBeat 的强大自定义,多类型支持,高性能,易扩展,希望能帮助用户快速构建自有监控系统。0x02 漏洞描述: HertzBeat(赫兹跳动) 开源实时…...
Delete Number
翻译: 主要思路解释 整体思路概述: 本题的目标是给定整数(要删除的数字个数)和整数(以字符串形式表示的数字),通过合理删除个数字,使得最终得到的新数字最小。程序采用了一种贪心算…...
Linux常用快捷键
目录 编辑 剪切/复制/粘贴/删除等快捷键 终端及标签页快捷键 历史命令快捷键 移动光标快捷键 控制命令 剪切/复制/粘贴/删除等快捷键 快捷键 功能 ShiftCtrlC 复制 ShiftCtrlV 粘贴 CtrlInsert 复制命令行内容 ShiftInsert 粘贴命令行内容 Ctrlk 剪切&#…...
针对xpath局限的解决方案
上篇《网页数据提取利器 -- Xpath》我们对xpath的介绍中提到了xpath的几点局限性: 结构依赖性强性能动态网页支持不足 本篇是针对这些局限提出的解决方案和补充方法,以提升 XPath 的实用性和适应性。 1. 动态网页的处理 局限: XPath 无法…...
深入解析 HTML Input 元素:构建交互性表单的核心
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
ffmpeg转码与加水印
文章目录 转码 与加水印引入jar包代码ffmpeg安装错误解决方法 转码 与加水印 引入jar包 <dependency><groupId>net.bramp.ffmpeg</groupId><artifactId>ffmpeg</artifactId><version>0.6.2</version></dependency>代码 impo…...
Leetcode 104. 二叉树的最大深度(Java-深度遍历)
题目描述: 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例: 输入:root [3,9,20,null,null,15,7] 输出:3示例 2: 输入:…...
阳明心学-传习录学习总结
资料 王阳明介绍:明代杰出的思想家、军事家、教育家;自刑部主事历任贵州龙场驿丞、庐陵知县、右佥都御史、南赣巡抚、两广总督等职,接连平定南赣、两广盗乱及宸濠之乱,因功获封“新建伯”,成为明代因军功封爵的三位文…...
macOS sequoia 15.1中应用程序“程序坞”没有权限打开
在macOS sequoia 15.1版本中新安装的应用程序在访达中打开报错显示应用程序“程序坞”没有权限打开“(null)”。 解决办法 在启动台中找到终端,点击打开,切换到应用目录下,输入 cd /Applications/ 找到需要打开的应用程序目录࿰…...
使用 MinIO 和 KKFileView 实现在线文件预览功能
在项目开发中,文件的在线预览是常见的需求,尤其是对 PDF、Word、Excel 等格式的文件进行无客户端依赖的直接查看。本文将介绍如何通过 MinIO 和 KKFileView 搭建在线文件预览服务,并通过 docker-compose 一键部署。 一、环境准备 1. Docker …...
Conda-Pack打包:高效管理Python环境
在Python开发中,环境管理是一个不可忽视的重要环节。Conda是一个流行的包管理器和环境管理器,它允许用户创建隔离的环境,以避免不同项目之间的依赖冲突。Conda-pack是一个工具,可以帮助我们将一个conda环境打包成一个可移植文件&a…...
云服务器上搭建 WordPress 全流程指南
WordPress 是全球最受欢迎的开源内容管理系统(CMS),通过 WordPress,你可以轻松搭建博客、企业网站或电子商务平台。而通过云服务器搭建 WordPress,可以使网站获得更好的性能和灵活性。本文将为你提供详细的步骤&#x…...
图像超分辨率技术新进展:混合注意力聚合变换器HAAT
目录 1. 引言: 2. 混合注意力聚合变换器(HAAT): 2.1 Swin-Dense-Residual-Connected Block(SDRCB): 2.2 Hybrid Grid Attention Block(HGAB): 3. 实验结…...
文件IO——01
1. 认识文件 1)文件概念 “文件”是一个广义的概念,可以代表很多东西 操作系统里,会把很多的硬件设备和软件资源抽象成“文件”,统一管理 但是大部分情况下的文件,都是指硬盘的文件(文件相当于是对“硬…...
【opencv入门教程】5. Mat 类用法
文章选自: 一、BackGround Mat对象是一种图像数据结构,它是一个容器,存储任何通道任何数的图片数据以及对应的矩阵,使用完成后,内存自动释放。二、Code void Samples::MatFunc() {1. 图像处理// 方法1:…...
SSM虾米音乐项目2--分页查询
1.分页查询的底层逻辑 首先根据用户输入的流派,进行模糊查询根据查询的数据进行分页需要前端用户提供pageNo(当前页数)和pageSize(每页的数据量)并且要从后端计算count(总数据量)和totalPage(总页数),以及startNum(每页开始的记录)从而将对应的页面数据…...
nodejs 获取本地局域网 ip 扫描本地端口
因为傻逼老板的垃圾需求,不得不成长 示例代码: 获取本地局域网 ip 地址: 需要注意的是:如果存在虚拟机网络,则返回的是虚拟机网络的 ipv4 地址 import os from os; export const getLocalIp () > {const in…...
区块链签名种类
1. eth_sign 简介:最早实现的签名方法,用于对任意数据进行签名。签名内容:直接对原始消息的哈希值进行签名。特点: 安全性较低,因为签名的消息没有明确的上下文或结构。很容易被滥用,攻击者可以伪造签名内…...
Redis增强工具包:封装分布式锁、缓存模板与监控的最佳实践
1. 项目概述:一个Redis开发者的“瑞士军刀”在分布式系统和高并发场景下,Redis几乎成了标配。但用久了你会发现,官方客户端虽然稳定,但在日常开发、调试、运维中,总有些“不够顺手”的地方。比如,想批量按模…...
JetBrains IDE 30天试用重置:一键解决方案的完整实践指南
JetBrains IDE 30天试用重置:一键解决方案的完整实践指南 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 当您正专注于代码调试时,IDE突然弹出"评估期已结束"的红色警告…...
Mantic.sh:Bash脚本实现的终端命令自动化与效率提升工具
1. 项目概述:一个为开发者打造的终端效率工具如果你和我一样,每天有超过一半的工作时间是在终端(Terminal)里度过的,那你肯定对效率工具有着近乎偏执的追求。从cd到ls,从grep到awk,我们依赖这些…...
Bifrost:轻量高效的实时数据同步平台架构与实战
1. 项目概述:Bifrost,一个被低估的现代数据同步利器如果你正在处理跨数据库、跨数据源的数据同步任务,并且对传统ETL工具的笨重、配置复杂感到头疼,那么maximhq/bifrost这个项目绝对值得你花时间深入了解。我第一次接触Bifrost是在…...
基于MCP与Apify构建AI驱动的投资另类数据研究工具
1. 项目概述:当投资研究遇上AI代理如果你是一名量化研究员、对冲基金分析师,或者只是一个对金融市场充满好奇、希望用数据驱动决策的独立投资者,那么你肯定对“另类数据”这个词不陌生。传统的财报、股价、宏观经济指标,这些“传统…...
【2026年阿里巴巴集团暑期实习- 5月16日-算法岗-第一题- 分组计数】(题目+思路+JavaC++Python解析+在线测试)
题目内容 给定 nnn 个人的权值序列 a1,a2,…,ana_1,a_2,\dots,a_na...
EmoLLM:大语言模型的情感增强训练与部署实践
1. 项目概述:当大语言模型学会“察言观色”最近在折腾一个挺有意思的开源项目,叫SmartFlowAI/EmoLLM。光看名字你大概能猜到,这玩意儿跟“情绪”和“大语言模型”有关。没错,它的核心目标就是让冷冰冰的LLM(Large Lang…...
Python邮件自动化实战:基于mymailclaw的监控报警与Slack集成
1. 项目概述与核心价值最近在折腾邮件自动化处理的时候,发现了一个挺有意思的开源项目,叫psandis/mymailclaw。乍一看这个名字,你可能会联想到“邮件抓取”或者“邮件爬虫”。没错,它的核心定位就是一个用 Python 写的邮件客户端自…...
VTube Studio API完全指南:5个核心场景教你打造个性化虚拟主播互动
VTube Studio API完全指南:5个核心场景教你打造个性化虚拟主播互动 【免费下载链接】VTubeStudio VTube Studio API Development Page 项目地址: https://gitcode.com/gh_mirrors/vt/VTubeStudio 想要为你的虚拟主播形象添加更多互动功能,却不知道…...
智能跨平台文件同步革命:OpenMTP让Mac与Android无缝连接
智能跨平台文件同步革命:OpenMTP让Mac与Android无缝连接 【免费下载链接】openmtp OpenMTP - Advanced Android File Transfer Application for macOS 项目地址: https://gitcode.com/gh_mirrors/op/openmtp 你是否曾经为Mac和Android设备之间的文件传输而烦…...
