当前位置: 首页 > news >正文

网络通信与并发编程(三)粘包现象解决方案、socketserver实现并发

粘包现象解决方案、socketserver实现并发

文章目录

  • 粘包现象解决方案、socketserver实现并发
  • 一、粘包现象解决方案
    • 1.发送数据大小
    • 2.发送数据信息
  • 二、socketserver实现并发
    • 1.tcp版的socketserver并发
    • 2.udp版的socketserver并发

一、粘包现象解决方案

1.发送数据大小

有了上一篇文章的分析,我们知道tcp协议之所以会出现粘包现象,是因为无法得知每次传输的字节数。如果我们人为的给传输的数据添加一个报头用来表示接收内容的字节数就可以解决这个问题了。

#服务端
from socket import *
import subprocess
import structserver=socket(AF_INET,SOCK_STREAM)
server.bind(('127.0.0.1',8080))
server.listen(5)while True:conn,client_addr=server.accept()while True:try:cmd=conn.recv(1024)if len(cmd) == 0:breakobj=subprocess.Popen(cmd.decode('utf-8'),shell=True,stderr=subprocess.PIPE,stdout=subprocess.PIPE)stdout=obj.stdout.read()stderr=obj.stderr.read()#1、制作报头(固定长度)total_size=len(stdout) + len(stderr)#struct模块可以将一个数据类型转为固定长度的bytesheader=struct.pack('i',total_size)#2、发送固定长度的报头conn.send(header)#3、发送真实的数据conn.send(stdout)conn.send(stderr)except ConnectionResetError:breakconn.close()
#客户端
from socket import *
import structclient=socket(AF_INET,SOCK_STREAM)
client.connect(('127.0.0.1',8080))while True:cmd=input('>>: ').strip()if len(cmd) == 0:continueclient.send(cmd.encode('utf-8'))#1、接收固定长度的报头(bytes)header=client.recv(4)#从报头中解析接收内容的字节数total_size=struct.unpack('i',header)[0]#2、接收真实的数据#recv_size表示已接收字节数,total_size表示总的字节数recv_size=0res=b''while recv_size < total_size :data=client.recv(1024)res+=datarecv_size+=len(data)print(res.decode('gbk'))

接收结果:
映像名称 PID 会话名 会话# 内存使用
========================= ======== ================ =========== ============
System Idle Process 0 Services 0 8 K
System 4 Services 0 152 K
(接收内容过长,中间部分略去)
tasklist.exe 16076 Console 1 9,520 K
WmiPrvSE.exe 15416 Services 0 10,212 K

2.发送数据信息

在一般的文件传输中,我们除了可以看到文件的大小,还可以看见文件名称,创建日期当信息,为了将这些信息加入到报头中,我们可以将上面的代码进一步优化为如下形式:

#服务端
from socket import *
import subprocess
import struct
import json,timeserver=socket(AF_INET,SOCK_STREAM)
server.bind(('127.0.0.1',8080))
server.listen(5)while True:conn,client_addr=server.accept()while True:try:cmd=conn.recv(1024)if len(cmd) == 0:break# 运行系统命令obj=subprocess.Popen(cmd.decode('utf-8'),shell=True,stderr=subprocess.PIPE,stdout=subprocess.PIPE)stdout=obj.stdout.read()stderr=obj.stderr.read()#将报头信息制作成字典header_dic={'filename':'tasklist','total_size':len(stdout) + len(stderr),'create_time':time.strftime('%Y-%m-%d %H')}#通过json格式将报头字典转为bytesheader_json=json.dumps(header_dic)header_bytes=header_json.encode('utf-8')#由于报头字典大小超出struct的限制,所以此处先发送4个字节标识报头字典的大小#1、发送报头字典大小conn.send(struct.pack('i',len(header_bytes)))#2、发送报头字典conn.send(header_bytes)#3、发送真实的数据conn.send(stdout)conn.send(stderr)except ConnectionResetError:breakconn.close()
#客户端
from socket import *
import struct
import jsonclient=socket(AF_INET,SOCK_STREAM)
client.connect(('127.0.0.1',8080))while True:cmd=input('>>: ').strip()if len(cmd) == 0:continueclient.send(cmd.encode('utf-8'))#1、收4个字节,这4个字节表示报头长度header_len=struct.unpack('i',client.recv(4))[0]#2、再接收报头header_bytes=client.recv(header_len)#通过json解析出报头字典header_json=header_bytes.decode('utf-8')header_dic=json.loads(header_json)print(header_dic)total_size=header_dic['total_size']#3、接收真实的数据recv_size=0res=b''while recv_size < total_size :data=client.recv(1024)res+=datarecv_size+=len(data)print(res.decode('gbk'))

可以看到结果中接收到了报头信息:
{‘filename’: ‘tasklist’, ‘total_size’: 17942, ‘create_time’: ‘2024-10-18 18’}
映像名称 PID 会话名 会话# 内存使用
========================= ======== ================ =========== ============
System Idle Process 0 Services 0 8 K
System 4 Services 0 152 K
(接收内容过长,中间部分略去)
tasklist.exe 16076 Console 1 9,520 K
WmiPrvSE.exe 15416 Services 0 10,212 K

二、socketserver实现并发

1.tcp版的socketserver并发

#客户端
import socket
#表示当前开启的客户端序号
#并发通信时,可以开启斗个客户端与服务端通信
num=33
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(('127.0.0.1',8080)) while True:msg = 'client%s'%numif len(msg) == 0:continuephone.send(msg.encode('utf-8'))data=phone.recv(1024)print(data)phone.close()
#服务端
import socketserver
#MyHandler为自定义的通信函数
class MyHandler(socketserver.BaseRequestHandler):#MyHandler继承了abc类,必须复写handle函数def handle(self):#通信循环while True:try:#self.request中存放这通信连接#self.client_address中存放着客户端的ip和端口号#self.server中存放着套接字对象data=self.request.recv(1024)if len(data) == 0:breakself.request.send(data.upper())except ConnectionResetError:breakif __name__ == '__main__':#创建socketserver对象s=socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyHandler,bind_and_activate=True)#serve_forever函数在有客户端发送请求时创建一个线程#这个线程会根据建立的通信链接与客户端通信(创建MyHandler对象并调用handle方法)s.serve_forever()

2.udp版的socketserver并发

#客户端
import socket
num=33
client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:msg='client%s'%numclient.sendto(msg.encode('utf-8'),('127.0.0.1',8080))data,server_addr=client.recvfrom(1024)print(data)client.close()
#服务端
import socketserver
class MyHandler(socketserver.BaseRequestHandler):def handle(self):# 通信循环#self.request[1]存放着套接字对象#self.client_address存放着客户端的信息#self.request[0]存放着客户端发送的信息data = self.request[0]self.request[1].sendto(data.upper(), self.client_address)if __name__ == '__main__':s = socketserver.ThreadingUDPServer(('127.0.0.1', 8080), MyHandler)#当客户端发送信息以后,serve_forever函数会创建一个线程与客户端进行通信s.serve_forever()

相关文章:

网络通信与并发编程(三)粘包现象解决方案、socketserver实现并发

粘包现象解决方案、socketserver实现并发 文章目录 粘包现象解决方案、socketserver实现并发一、粘包现象解决方案1.发送数据大小2.发送数据信息 二、socketserver实现并发1.tcp版的socketserver并发2.udp版的socketserver并发 一、粘包现象解决方案 1.发送数据大小 有了上一…...

使用Uniapp开发微信小程序实现一个自定义的首页顶部轮播图效果?

在Uniapp中开发微信小程序&#xff0c;并实现自定义首页顶部轮播图的效果&#xff0c;可以通过使用Uniapp的组件如swiper和swiper-item来完成。这是一个常见的需求&#xff0c;下面是一个完整的示例代码&#xff0c;展示如何实现一个简单的自定义轮播图效果。 创建页面结构 首…...

软硬连接及动静态库

目录 一、理解文件系统在磁盘中的存储 &#xff08;1&#xff09;inode是什么 &#xff08;2&#xff09;硬链接 &#xff08;3&#xff09;软链接 二、动静态库 &#xff08;1&#xff09;静态库 二、动态库 三、在链接动静态库的时候如何不用指定路径 一、理解文件系统…...

vue3.0 + vite:中使用 sass

1、安装依赖 npm i sass sass-loader --save-dev 在项目的src/assets文件夹下新建style/index.scss 文件 2、在 vite.config.ts 中加&#xff1a; resolve: {alias: {: fileURLToPath(new URL(./src, import.meta.url))} }, css: {// 配置 SCSS 支持preprocessorOptions: {s…...

搭建`mongodb`副本集-开启权限认证 mongo:7.0.5

搭建mongodb副本集-开启权限认证 mongo:7.0.5 1.5.1、创建文件 创建配置文件保存目录和数据保存目录 mkdir -p /data/mongodb/{/conf,/data,/logs}生成和设置权限 这个文件一定要在一个服务里面生成然后复制到其它服务器&#xff0c;所有服务器的这个key一定是相同的。 op…...

智能工厂的软件设计 由“原力“篇引发的思考: 回顾、展望和本位 之2 修订稿之2

Q15、《“工厂”篇》其前的《“公共逻辑”》篇 提出的三个专门工厂&#xff08;抽象/项目/产品&#xff09;以及 再之前 讨论的各自的“专项运作逻辑”&#xff08;辩证/数理/形式&#xff09;之间协作的“整体概念运作”“概念模式”给出一个标准的“公共逻辑”的“语言模板”…...

2025选题推荐|基于SpringBoot的幼儿园智能管理与监控系统的设计与实现

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…...

mqtt客户端订阅一直重复连接?

文章 前言错误场景问题分析解决方案后言 前言 ✨✨ 他们是天生勇敢的开发者&#xff0c;我们创造bug&#xff0c;传播bug&#xff0c;毫不留情地消灭bug&#xff0c;在这个过程中我们创造了很多bug以供娱乐。 前端bug这里是博主总结的一些前端的bug以及解决方案&#xff0c;感兴…...

SegFormer: 一个基于Transformer的高效视觉图像分割算法

今天我分享一篇关于 Transformer 架构在图像视觉分割中的应用的文章&#xff0c;主题是 SegFormer。SegFormer 是一种新颖的语义分割方法&#xff0c;它结合了无位置编码的层次化 Transformer 编码器和轻量级 All-MLP 解码器&#xff0c;避免了传统方法中的复杂设计&#xff0c…...

SoC芯片中Clock Gen和Reset Gen的时钟树综合

社区目前已经开设了下面列举的前四大数字后端实战课程&#xff0c;均为直播课&#xff0c;且均是小编本人亲自授课&#xff01;遇到项目问题&#xff0c;都可以远程一对一指导解决具体问题。小编本人是一线12年后端经验的数字后端工程师。想找一线IC后端技术专家亲自带你做后端…...

学习资料:电子标签拣货技术

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载。 这份文件主要介绍了电子标签拣货技术&#xff0c…...

Git 提交规范参考

Git 提交规范参考 feat 增加新的业务功能fix 修复业务问题/BUGperf 优化性能style 更改代码风格, 不影响运行结果refactor 重构代码revert 撤销更改test 测试相关, 不涉及业务代码的更改docs 文档和注释相关chore 更新依赖/修改脚手架配置等琐事workflow 工作流改进ci 持续集成…...

【前端】Matter:物体的高级控制

在 Matter.js 中&#xff0c;除了简单的物体创建和碰撞检测外&#xff0c;还可以通过高级控制实现更复杂的物理交互与模拟效果。本教程将介绍如何使用 约束 (Constraint)、复合物体 (Composite) 以及如何进行 运动与旋转控制&#xff0c;来实现链条、摆钟等效果&#xff0c;以及…...

ASP.NET Core 路由规则 MapControllerRoute、MapDefaultControllerRoute、MapController

MapControllers 来映射属性路由控制器。 资料...

linux命令之less用法

less 分屏上下翻页浏览文件内容 补充说明 less命令 的作用与more十分相似&#xff0c;都可以用来浏览文字档案的内容&#xff0c;不同的是less命令允许用户向前或向后浏览文件&#xff0c;而more命令只能向前浏览。用less命令显示文件时&#xff0c;用PageUp键向上翻页&…...

试用cursor的简单的记录

快下班时又饿了&#xff0c;饿了几个小时了。中午那点饭&#xff0c;没够顶到下班。难怪店家说饭可以随便加。 所以不编码了&#xff0c;本周任务也超额完成了&#xff0c;这种状态再去编码调试&#xff0c;搞不好会写出自己不认识的代码。 本周工作中&#xff0c;新的事务是…...

下载Edge/Chrome浏览器主题的背景图片

当我们为Edge安装了心仪的主题后&#xff0c;希望把对应的背景图片下载保存要怎么做呢&#xff0c;以下图的“湖心小屋”主题为例。如下图&#xff0c;我们已经在应用商店中按照了该主题。 当打开新标签页后&#xff0c;可以欣赏这个主题内置的背景图片。 如果想要下载这个背景…...

Python解力扣算法题4(基础)

# 1.求斐波那契数列下标为n的数 &#xff08;从零开始&#xff09; # def fib(n): # if n < 2: # return n # # p, q, r 0, 0, 1 # for i in range(2, n 1): # p, q q, r # r p q # # return r#2. 和谐数组是指一个数组里元素…...

鸿蒙NEXT开发-网络管理(基于最新api12稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…...

【LeetCode每日一题】——1413.逐步求和得到正数的最小值

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 前缀和 二【题目难度】 简单 三【题目编号】 1413.逐步求和得到正数的最小值 四【题目描述】…...

混合求解器:用神经网络增强传统微分方程数值方法

1. 项目概述&#xff1a;当数值方法遇到机器学习在科学计算和工程仿真领域&#xff0c;求解常微分方程&#xff08;ODE&#xff09;和偏微分方程&#xff08;PDE&#xff09;是绕不开的核心任务。无论是模拟电路中的电流变化、预测天气系统的演变&#xff0c;还是分析机械结构的…...

2026在线测评系统十大量表对比:信效度与场景全解析

【30s 核心摘要】2026 年在线测评成人才管理刚需&#xff0c;信效度与场景适配成选型核心。本文聚焦十大量表&#xff0c;从信度、效度、适配场景等维度深度对比&#xff0c;重点解析问卷星、北森、金数据等主流平台的量表能力与落地效果&#xff0c;为企业、高校及机构提供科学…...

AI智能体到底强在哪?为什么大家开始从“养龙虾”转向“养马”

那么AI智能体的核心能力是什么&#xff1f; 1、理解需求 它能分析你的真实意图&#xff0c;而不是只看表面的文字&#xff0c;比如让它整理这个月的消费情况&#xff0c;它明白之后&#xff0c;会读取账单&#xff0c;做分类统计&#xff0c;生成总结&#xff0c;最后输出图表。…...

高性能Windows流媒体服务器部署:5大核心技术与3种实战架构深度解析

高性能Windows流媒体服务器部署&#xff1a;5大核心技术与3种实战架构深度解析 【免费下载链接】srs-windows 项目地址: https://gitcode.com/gh_mirrors/sr/srs-windows 在Windows平台上构建专业级流媒体服务系统&#xff0c;需要综合考虑协议兼容性、性能优化和部署架…...

AArch64内存管理:MAIR_EL3寄存器详解与应用

1. AArch64内存管理基础与MAIR_EL3寄存器定位 在Armv8-A/v9-A架构中&#xff0c;内存管理单元(MMU)通过多级页表实现虚拟地址到物理地址的转换。当处理器执行内存访问时&#xff0c;MMU会遍历页表条目(Translation Table Entry)&#xff0c;其中包含两个关键信息&#xff1a;目…...

力扣HOT100(30)两两交换链表中的节点

链表的交换要注意 “链表不断链”。前驱和后继都要连着迭代法&#xff08;必学死磕&#xff01;O (n) 时间&#xff0c;O (1) 空间&#xff09;1. 为什么必须用虚拟头节点&#xff1f;因为交换后链表的头节点会变&#xff01; 比如示例 1 中&#xff0c;原来的头是 1&#xff0…...

Python基础语法:生成器 generator(yield)

一、简介根据指定的规则循环生成数据&#xff0c;当条件不成立时则生成数据结束。数据不是一次性全部生成出来&#xff0c;而是使用一个&#xff0c;再生成一个&#xff0c;好处是可以节约大量的内存。就像设计模式中的懒汉式。适合处理大数据或流数。生成器是一种特殊的迭代器…...

巧用对称性与平均值原理:低成本实现高精度电阻分压器校准

1. 项目概述&#xff1a;用数学思维突破测量设备的精度极限在电子实验室里捣鼓精密电路&#xff0c;尤其是涉及到电压基准、信号调理或者高精度ADC前端时&#xff0c;一个绕不开的坎就是精密分压器。你可能在设计一个需要0.1%甚至更高精度的分压网络&#xff0c;但手头的万用表…...

总线式智能提示灯系统设计:从恒流驱动到模块化架构

1. 项目概述&#xff1a;从传统到智能的剧场提示灯系统革新在剧场、演播室或者大型活动现场的后台&#xff0c;如果你待过&#xff0c;一定对那套“红灯停&#xff0c;绿灯行”的提示灯系统不陌生。导演或舞台监督通过对讲机喊“Standby”&#xff08;准备&#xff09;&#xf…...

终极Windows风扇控制指南:FanControl让你的电脑安静又高效

终极Windows风扇控制指南&#xff1a;FanControl让你的电脑安静又高效 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trendin…...