python之TCP的网络应用程序开发
文章目录
- 版权声明
- python3编码转换
- socket类的使用
- 创建Socket对象
- Socket对象常用方法和参数
- 使用示例
- 服务器端代码
- 客户端代码
- TCP客户端程序开发流程
- TCP服务端程序开发流程
- TCP网络应用程序注意点
- socket之send和recv原理剖析
- send原理剖析
- recv原理剖析
- send和recv原理剖析图
- 多任务版TCP服务端程序开发
版权声明
- 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明,所有版权属于黑马程序员或相关权利人所有。本博客的目的仅为个人学习和交流之用,并非商业用途。
- 我在整理学习笔记的过程中尽力确保准确性,但无法保证内容的完整性和时效性。本博客的内容可能会随着时间的推移而过时或需要更新。
- 若您是黑马程序员或相关权利人,如有任何侵犯版权的地方,请您及时联系我,我将立即予以删除或进行必要的修改。
- 对于其他读者,请在阅读本博客内容时保持遵守相关法律法规和道德准则,谨慎参考,并自行承担因此产生的风险和责任。本博客中的部分观点和意见仅代表我个人,不代表黑马程序员的立场。
python3编码转换
- 在网络传输数据的时候,数据需要先编码转化为二进制(bytes)数据类型

| 函数名 | 说明 |
|---|---|
| encode | 编码 将字符串转化为字节码 |
| decode | 解码 将字节码转化为字符串 |
- encoed()和decode()函数可以接受参数,encoding是指在编解码过程中使用的编码方案。
bytes.decode(encoding=“utf-8”) str.encode(encoding=”utf-8”)
socket类的使用
- Python的
socket类是Python标准库的一部分,用于提供对低级网络接口的访问。支持IPv4、IPv6、TCP、UDP等协议,允许创建基于网络的应用程序,如服务器和客户端。
创建Socket对象
- 要使用
socket类,首先需要导入socket模块,然后创建一个socket对象。可以通过调用socket.socket()方法并传递相应的参数来创建一个socket。import socket # 创建一个socket对象,默认是IPv4和TCP协议 # socket.socket(AddressFamily, Type) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Socket对象常用方法和参数
| 方法/参数 | 类型/描述 | 示例/默认值 | 说明 |
|---|---|---|---|
socket() | 构造函数 | 用于创建socket对象 | |
family | 参数 | socket.AF_INET | 地址族,确定了socket的类型(IPv4或IPv6) |
type | 参数 | socket.SOCK_STREAM | 指定了socket的通信类型(TCP或UDP) |
proto | 参数 | 0 | 协议编号,默认为0,由系统选择合适的协议 |
fileno | 参数 | None | 可以指定一个文件描述符 |
bind(address) | 方法 | 绑定地址到socket | |
address | 参数 | ('localhost', 12345) | 一个包含主机名和端口号的元组 |
listen(backlog) | 方法 | 开始监听传入连接 | |
backlog | 参数 | 5 | 定义了等待队列的大小 |
accept() | 方法 | 接受一个连接,返回(conn, address) | |
connect(address) | 方法 | 用于客户端连接服务器 | |
send(bytes) | 方法 | 发送数据,参数为字节数据 | |
recv(bufsize) | 方法 | 接收数据,指定最大数据量 | |
bufsize | 参数 | 1024 | 接收数据的缓冲区大小 |
close() | 方法 | 关闭socket连接 |
使用示例
服务器端代码
import socket# 创建socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定地址(host,port)
server_socket.bind(('localhost', 12345))# 开始监听
server_socket.listen()print("服务器启动,等待连接...")# 接受连接
connection, address = server_socket.accept()
print(f"连接来自 {address}")# 接收数据
data = connection.recv(1024)
print(f"接收到的数据: {data.decode()}")# 发送数据
connection.send("Hello, client!".encode())# 关闭连接
connection.close()
客户端代码
import socket# 创建socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 连接服务器
client_socket.connect(('localhost', 12345))# 发送数据
client_socket.send("Hello, server!".encode())# 接收数据
data = client_socket.recv(1024)
print(f"接收到的数据: {data.decode()}")# 关闭连接
client_socket.close()
这仅仅是一个非常简单的例子,实际应用中还需要处理错误、多线程或多进程处理多个连接、非阻塞IO等复杂情况。
TCP客户端程序开发流程
-
TCP网络应用程序开发分为:
- TCP客户端程序开发,运行在服务器设备上的程序,专门为客户端提供数据服务。
- TCP服务端程序开发,运行在用户设备上的程序
-
TCP客户端程序开发流程
- 创建客户端套接字对象(买电话)
- 和服务端套接字建立连接(打电话)
- 发送数据(说话)
- 接收数据(接听)
- 关闭客户端套接字(挂电话)

-
TCP客户端开发程序流程
- 创建客户端套接字对象
- 和服务端套接字建立连接
- 发送数据
- 接收数据
- 关闭客户端套接字
import socketif __name__ == '__main__':# 1.创建客户端套接字对象tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 2.和服务端套接字建立连接tcp_client_socket.connect(("localhost", 8080))# 3.发送数据tcp_client_socket.send("hello".encode(encoding="utf-8"))# 4.接收数据 recv阻塞等待数据的到来recv_data = tcp_client_socket.recv(1024)print(recv_data.decode())# 5.关闭客户端套接字tcp_client_socket.close()
TCP服务端程序开发流程

- 创建服务端端套接字对象
- 绑定IP地址和端口号
- 设置监听
- 等待接受客户端的连接请求
- 接收数据
- 发送数据
- 关闭套接字
import socketif __name__ == '__main__':# 1.创建服务端套接字对象tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 2. 绑定IP地址和端口号# bind中的参数第一个ip地址元素设置为"",默认为本机ip地址tcp_server_socket.bind(("", 8080))# 3.设置监听 128:代表服务端等待排队连接的最大数量tcp_server_socket.listen(128)# 4.等待接受客户端的连接请求 accept阻塞等待 返回一个用以和客户端通socket,客户端的地址conn_socket, ip_port = tcp_server_socket.accept()print("客户端地址:", ip_port)# 5.接收数据recv_data = conn_socket.recv(1024)print("接收到的数据:", recv_data.decode())# 6.发送数据conn_socket.send("客户端你的数据我收到了".encode())# 7.关闭套接字conn_socket.close()tcp_server_socket.close()
TCP网络应用程序注意点
- 当TCP客户端程序想要和TCP服务端程序进行通信的时候必须要先建立连接
- TCP客户端程序一般不需要绑定端口号,因为客户端是主动发起建立连接的
- TCP服务端程序必须绑定端口号,否则客户端找不到这个TCP服务端程序。
- listen后的套接字是被动套接字,只负责接收新的客户端的连接请求,不能收发消息
- 当TCP客户端程序和TCP服务端程序连接成功后,TCP服务器端程序会产生一个新的套接字,收发客户端消息使用该套接字.
- 关闭accept返回的套接字意味着和客户端已经通信完毕 。 当客户端的套接字调用close后,服务器端的recv会解阻塞,返回的数据长度为0,服务端可以通过返回数据的长度来判断客户端是否已经下线,反之服务端关闭套接字,客户端的recv也会解阻塞,返回的数据长度也为0。
socket之send和recv原理剖析
- 当创建一个TCP socket对象的时候会有一个发送缓冲区和一个接收缓冲区,这个发送和接收缓冲区指的就是内存中的一片空间。
send原理剖析
- send发送数据给服务端:必须得通过网卡发送数据,应用程序是无法直接通过网卡发送数据的,它需要调用操作系统接口,也就是说,应用程序把发送的数据先写入到发送缓冲区(内存中的一片空间),再由操作系统控制网卡把发送缓冲区的数据发送给服务端网卡。
recv原理剖析
- recv从客户端接收数据:应用软件是无法直接通过网卡接收数据的,它需要调用操作系统接口,由操作系统通过网卡接收数据,把接收的数据写入到接收缓冲区(内存中的一片空间),应用程序再从接收缓存区获取客户端发送的数据。
send和recv原理剖析图

- 不管是recv还是send都不是直接接收到对方的数据和发送数据到对方,发送数据会写入到发送缓冲区,接收数据是从接收缓冲区来读取,发送数据和接收数据最终是由操作系统控制网卡来完成。
多任务版TCP服务端程序开发
- 实现步骤分析:

-
编写一个TCP服务端程序,循环等待接受客户端的连接请求
while True:service_client_socket, ip_port = tcp_server_socket.accept() -
当客户端和服务端建立连接成功,创建子线程,使用子线程专门处理客户端的请求,防止主线程阻塞
while True:service_client_socket, ip_port = tcp_server_socket.accept()sub_thread = threading.Thread(target=handle_client_request, args=(service_client_socket, ip_port))sub_thread.start()
- 完整代码:
import socket
import threading# 处理客户端函数
def handle_client(conn_socket):# 5.接收数据recv_data = conn_socket.recv(1024)print("接收到的数据:", recv_data.decode())# 6.发送数据conn_socket.send("收到客户端数据:".encode())# 7.关闭套接字conn_socket.close()# 1 使用循环接收客户端的连接请求
if __name__ == '__main__':# 1.创建服务端套接字对象tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 设置端口号复用,让程序退出端口号立即释放tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)# 2. 绑定IP地址和端口号# 如果bind中的参数第一个ip地址元素设置为"",默认为本机ip地址tcp_server_socket.bind(("", 8888))# 3.设置监听 128:代表服务端等待排队连接的最大数量tcp_server_socket.listen(128)while True:# 4.等待接受客户端的连接请求 accept阻塞等待 返回一个用以和客户端通socket,客户端的地址conn_socket, ip_port = tcp_server_socket.accept()print("客户端地址:", ip_port)# 使用多线程去接收多个客户端的请求 设置守护主线程sub_thread = threading.Thread(target=handle_client, args=(conn_socket,), daemon=True)sub_thread.start()tcp_server_socket.close()相关文章:
python之TCP的网络应用程序开发
文章目录 版权声明python3编码转换socket类的使用创建Socket对象Socket对象常用方法和参数使用示例服务器端代码客户端代码 TCP客户端程序开发流程TCP服务端程序开发流程TCP网络应用程序注意点socket之send和recv原理剖析send原理剖析recv原理剖析send和recv原理剖析图 多任务版…...
Axios 拦截器 请求拦截器 响应拦截器
请求拦截器 相当于一个关卡,如果满足条件就放行请求,不满足就拦截 响应拦截器 在处理结果之前,先对结果进行预处理,比如:对数据进行一下格式化的处理 全局请求拦截器 axios.interceptors.request.use(config > { /…...
Mysql Shell笔记
Mysql Shell部署 cd /usr/local/ tar -xvf /root/mysql-shell-8.0.35-linux-glibc2.17-x86-64bit.tar.gz chown -R mysql.mysql mysqlsh mysql-shell-8.0.35-linux-glibc2.17-x86-64bitmysqlsh登录退出 mysqlsh -uroot -S /data/3306/mysql.sock MySQL Shell 8.0.35 Copyrigh…...
Hive日志默认存储在什么位置?
在hive-log4j.properties配置文件中,有这么一段配置信息 hive.log.thresholdALL hive.root.loggerWARN,DRFA hive.log.dir${java.io.tmpdir}/${user.name} hive.log.filehive.log hive.log.dir就是日志存储在目录/tmp/${user.name}(当前用户名)/下 而hive.log就是h…...
Kafka 常用功能总结(不断更新中....)
kafka 用途 业务中我们经常用来两个方面 1.发送消息 2.发送日志记录 kafka 结构组成 broker:可以理解成一个单独的服务器,所有的东西都归属到broker中 partation:为了增加并发度而做的拆分,相当于把broker拆分成不同的小块&…...
单链表相关面试题--5.合并有序链表
5.合并有序链表 21. 合并两个有序链表 - 力扣(LeetCode) /* 解题思路: 此题可以先创建一个空链表,然后依次从两个有序链表中选取最小的进行尾插操作进行合并。 */ typedef struct ListNode Node; struct ListNode* mergeTwoList…...
SV-7042VP sip广播4G无线网络号角
SV-7042VP sip广播4G无线网络号角 1. 采用防水一体化设计,整合了音频解码、数字功放及音柱 2. 提供配置软件,支持SIP标准协议,通过SIP服务器能够接入现有综合通信调度平台系统,接受sip通信调度平台。融合第三方sip协议及sip服务器…...
基于OpenCV+MediaPipe的手势识别
【精选】【优秀课设】基于OpenCVMediaPipe的手势识别(数字、石头剪刀布等手势识别)_石头剪刀布opencv识别代码_网易独家音乐人Mike Zhou的博客-CSDN博客 import cv2 import mediapipe as mp import mathdef vector_2d_angle(v1, v2):求解二维向量的角度v…...
YOLO目标检测——无人机航拍行人检测数据集下载分享【含对应voc、coc和yolo三种格式标签】
实际项目应用:智能交通管理、城市安防监控、公共安全救援等领域数据集说明:无人机航拍行人检测数据集,真实场景的高质量图片数据,数据场景丰富标签说明:使用lableimg标注软件标注,标注框质量高,…...
数据提取PDF SDK的对比推荐
PDF 已迅速成为跨各种平台共享和分发文档的首选格式,它作为一种数据来源,常见于公司的各种报告和报表中。为了能更好地分析、处理这些数据信息,我们需要检测和提取 PDF 中的数据,并将其转换为可用且有意义的格式。而数据提取的 PD…...
【数据结构(C语言)】浅谈栈和队列
目录 文章目录 前言 一、栈 1.1 栈的概念及结构 1.2 栈的实现 1.2.1. 支持动态增长的栈的结构 1.2.2 初始化栈 1.2.3 入栈 1.2.4 出栈 1.2.5 获取栈顶元素 1.2.6 获取栈中有效元素个数 1.2.7 检查栈是否为空 1.2.8 销毁栈 二、队列 2.1 队列的概念及结构 2.2 队…...
【NGINX--5】身份验证
1、HTTP 基本身份验证 需要通过 HTTP 基本身份验证保护应用或内容。 生成以下格式的文件,其中的密码使用某个受支持的格式进行了加密或哈希处理: # comment name1:password1 name2:password2:comment name3:password3第一个字段是用户名࿰…...
【网络奇缘】- 计算机网络|分层结构|ISO模型
🌈个人主页: Aileen_0v0🔥系列专栏: 一见倾心,再见倾城 --- 计算机网络~💫个人格言:"没有罗马,那就自己创造罗马~" 目录 计算机网络分层结构 OSI参考模型 OSI模型起源 失败原因: OSI模型组成 协议的作用 📝全文…...
使用whisper实现语音转文本
项目地址:GitHub - openai/whisper: Robust Speech Recognition via Large-Scale Weak Supervision 1、需要py3.8环境 conda activate p38 2、安装 pip install -U openai-whisper 3、下载项目 pip install githttps://github.com/openai/whisper.git 4、安装…...
Django中间件与csrf
一. django中间件 1. 什么是django中间件 # django中间件是django的门户1. 请求来的时候需要先经过中间件才能到达真正的django后端2. 响应走的时候最后也需要经过中间件才能发送出去 2. django中间件的个数 django自带七个中间件, 分别是SecurityMiddleware, SessionMiddle…...
【搜维尔科技】产品推荐:Virtuose 6D RV,大型工作空间触觉设备
Virtuose 6D RV为一款具有大工作空间并在所有6自由度上提供力反馈的触觉设备,设计专用于虚拟现实环境,特别适合于大型虚拟物体的处理。 Virtuose 6D RV是当今市场上唯一将高工作效率与高工作量相结合在一起的产品。6D RV特别适合于缩放与操纵等应用&…...
<JavaEE> 什么是线程(Thread)?进程和线程有什么区别?
目录 一、线程(Thread)的概念 二、线程存在的意义 2.1 并发编程 2.2 比进程更“轻量” 三、使用线程时应该注意 四、进程和线程的区别 五、Java中的线程和操作系统中的线程是不同的概念 六、多线程编程 一、线程(Thread)的…...
【赠书第7期】从零基础到精通Flutter开发
文章目录 前言 1 安装Flutter和Dart 2 了解Flutter的基础概念 2.1 Widget 2.2 MaterialApp和Scaffold 2.3 Hot Reload 3 编写你的第一个Flutter应用 3.1 创建一个Flutter项目 3.2 修改默认页面 3.3 添加交互 4 深入学习Flutter高级特性 4.1 路由和导航 4.2 状态管…...
《golang设计模式》第三部分·行为型模式-07-观察者模式(Observer)/发布者—订阅者模式
文章目录 1. 概念1.1 角色1.2 类图 2. 代码示例2.1 代码2.2 类图 1. 概念 观察者(Observer)指当目标对象状态发生变化后,对状态变化事件进行响应或处理的对象。 1.1 角色 Subject(抽象主题): 它可以有多…...
Maven中常用命令以及idea中使用maven指南
文章目录 Maven 常用命令compiletestcleanpackageinstallMaven 指令的生命周期maven 的概念模型 idea 开发maven 项目idea 的maven 配置idea 中创建一个maven 的web 工程在pom.xml 文件添加坐标坐标的来源方式依赖范围编写servlet maven 工程运行调试 Maven 常用命令 compile …...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
