day29-struct模块解决黏包问题】的更多相关文章

struct模块 解决黏包问题 FTP…
为什么会出现黏包现象: 首先只有在TCP协议中才会出现黏包现象,是因为TCP协议是面向流的协议,在发送的数据传输的过程中还有缓存机制来避免数据丢失,因此,在连续发送小数据的时候,以及接收大小不符的时候容易出现黏包现象.本质还是因为我们在接收数据的时候不知道发送的数据的长短. 解决黏包问题 在传输大量数据之前首先告诉接收端要发送的数据大小,如果想更漂亮的解决问题,可以通过struct模块来定制协议. struct模块: 功能:可以把一个类型,如数字,转成固定长度的bytes. import str…
#struct模块可以把一个数据类型,例如数字int,转化成固定长度(4个字节)的bytes.int转为4个bytes. #在大量传输数据之前先告诉接收端即将接收数据的大小,方可解决黏包问题: #利用struct模块打包要发送的数据的长度,接收端接收这个包,解包之后,接收这个长度的数据. import struct pack = struct.pack('i',4096) #打包,'i'代表int,把数字转化成固定长度(4个字节)的bytes. print(pack) #b'\x00\x10\x…
一.TCP协议 粘包现象 和解决方案 黏包现象让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd)执行远程命令的模块 需要用到模块subprocess subprocess通过子进程来执行外部指令,并通过input/output/error管道,获取子进程的执行的返回信息. import subprocess sub_obj = subprocess.Popen( 'ls', #系统指令 shell=True, #固定 stdout=subprocess…
首先来看一下产生黏包现象的一段代码: # server.py 服务端 import socket ​ sk = socket.socket() sk.bind(('127.0.0.1',9000)) sk.listen() ​ conn,addr = sk.accept() conn.send('hello,'.encode('utf-8')) conn.send('world'.encode('utf-8')) conn.recv(1024) conn.close() ​ sk.close()…
一.socket套接字模块 socket概念 socket层 理解socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让S…
socket套接字简介 编写cs架构的程序 实现数据交互 OSI七层相当复杂 socket套接字是一门技术 socket模块>>>:提供了快捷方式 不需要自己处理每一层 """ 以后我们写软件连socket的影子都看不到 因为被封装起来 socket是最底层的原理 很多框架都封装了 其实我们不需要深入研究 """ socket模块 cs架构的软件无论是在编写还是运行 都应该先考虑服务端 # 服务端 import socket s…
上面利用struct模块与方案一比较,减少一次发送和接收请求,因为方案一无法知道client端发送内容的长度到底有多长需要和接收OK.多一次请求防止黏包,减少网络延迟…
目录 subprocess模块 struct模块 粘包 UDP协议 socket_server模块 subprocess模块 作用: 1.可以帮你通过代码执行操作系统的终端命令 2.并返回终端执行命令后的结果 import subprocess cmd = input('cmd>>') obj = subprocess.Popen( cmd, shell=True, stderr=subprocess.PIPE, # 返回错误结果参数 stdout=subprocess.PIPE # 返回正确…
服务器端程序 import struct import socket sk = socket.socket() sk.bind(('127.0.0.1',9000)) sk.listen() conn,addr = sk.accept() send_msg = input('>>>').encode() bytes_len = struct.pack('i',len(send_msg)) conn.send(bytes_len) conn.send(send_msg) # 粘包现象 co…
黏包: 同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接收到之前执行的另外一部分结果,这种显现就是黏包. 只有TCP协议中才会产生黏包,UDP协议中不会有黏包(udp协议中数据会直接丢失,俗称丢包) #面试 #首先只有在TCP协议中才有黏包现象,是因为TCP协议是面向流的协议, #在发送的数据传输的过程中还有缓存机制来避免数据丢失 #因此在连续发送小数据的时候,以及接收大小不符的时候,都容易产生黏包现象 #本质是不知道客户端发送的数据长度 面试中解释黏包 #连续send…
1,https和http的区别: https比较安全,传输的时候先对内容进行加密,收到后再进行解密:它的传输内容不容易拦截,就算拦截下来了,也是加密的,看不懂.但是要买证书,一年要好几万,小公司承担不起.听说非常安全,在业内都没有出过问题. 2,udp不会黏包,只有tcp会黏包 传输的时候只能传输bite类型数据 demo1--远程执行命令: server.py sk = socket.socket() sk.bind(('127.0.0.1', 8080)) sk.listen() conn,…
os.popen()模式 server端 import socket import os phone = socket.socket() # 实例化一个socket对象 phone.bind(("localhost",8088)) # 绑定地址(host,port)到套接字,在AF_INET下,以元组(host,port)的形式表示地址 phone.listen(5) # 开始TCP监听.backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量.该值至少为1,大部分应用程序设为…
目录 昨日回顾 软件开发架构 C/S架构 B/S架构 网络编程 互联网协议 socket套接字 今日内容 一.subprocess模块 二.粘包问题 三.struct模块 四.UDP 五.QQ聊天室 六.SocketServer 昨日回顾 软件开发架构 C/S架构 Client:客户端 Server:服务端 优点 占用网络资源少,软件的使用稳定 缺点 用户在使用多个软件要下载客户端,软件每次更新用户也需要更新 用户体验差 B/S架构 Broser:浏览器 Server:服务端 优点 用户不需要下…
目录 subproess模块 TCP粘包问题 粘包两种情况 解决粘包问题 struct模块的使用 使用struct模块解决粘包 优化解决粘包问题 上传大文件 服务端 客户端 UDP协议 upd套接字 基于upd实现qq聊天室 socketserver subproess模块 import subprocess while True: cmd = input('cmd>>>: ') if cmd == 'q': break data = subprocess.Popen( cmd, she…
目录 模拟ssh远程执行命令 服务端 客户端 粘包问题 什么是粘包 TCP发送数据的四种情况 粘包的两种情况 解决粘包问题 struct模块 解决粘包问题 服务端 客户端 模拟ssh远程执行命令 服务端 import socket import subprocess server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(('127.0.0.1', 8000)) server.listen(5) print('…
黏包的解决方案 解决方案一 问题的根源在于,接收端不知道发送端将要传送的字节流的长度,所以解决粘包的方法就是围绕,如何让发送端在发送数据前,把自己将要发送的字节流总大小让接收端知晓,然后接收端来一个死循环接收完所有数据. #_*_coding:utf-8_*_import socket,subprocessip_port=('127.0.0.1',8080)s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.setsockopt(socket.…
Socket概念 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议. 一.socker层 (在程序中就是一个模块功能可以直接导入使用) Socker 是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,其实就i是一个门面模式,把复杂的协议放在socker后面. IP地址: 12…
黏包的解决方案 发生黏包主要是因为接收者不知道发送者发送内容的长度,因为tcp协议是根据数据流的,计算机操作系统有缓存机制, 所以当出现连续发送或连续接收的时候,发送的长度和接收的长度不匹配的情况下就会出现黏包.下面说几个处理方法: 解决方案一 问题的根源在于,接收端不知道发送端将要传送的字节流的长度,所以解决粘包的方法就是围绕,如何让发送端在发送数据前, 把自己将要发送的字节流总大小让接收端知晓,然后接收端来一个死循环接收完所有数据. 如图所示,即使发送了数据长度和数据内容,但在这两个发送的中…
1.缓冲区: 输入缓冲区  输出缓冲区 2. subprocess的使用import subprocess sub_obj = subprocess.Popen('ls', #系统指令shell=True, #固定stdout=subprocess.PIPE, #标准输出 PIPE 管道,保存着指令的执行结果stderr=subprocess.PIPE #标准错误输出 ) print('正确输出',sub_obj.stdout.read().decode('gbk'))print('错误输出',…
一.模拟ssh 1.subprocess模块 ipconfig -all dir subprocess模块是python从2.4版本开始引入的模块.主要用来取代 一些旧的模块方法,如os.system.os.spawn*.os.popen*.commands.*等.subprocess模块可用于产生进程,并连接到进程的输入/输出/错误输出管道,并获取进程的返回值. import subprocess #subprocess(色破儿赛斯) res = subprocess.Popen("dir&q…
铁乐学Python_Day34_Socket模块2和黏包现象 套接字 套接字是计算机网络数据结构,它体现了C/S结构中"通信端点"的概念. 在任何类型的通信开始之前,网络应用程序必須创建套接字. 可以将它们比作成电话插孔,没有它将无法进行通信. 套接字最初是为同一主机上的应用程序所创建,使得主机上运行的一个程序(又名一个进程)与另一个运行的程序进行通信. 这就是所谓的进程间通信(Inter Process Communication, IPC). 有两种类型的套接字:基于文件的和面向网…
二.解决黏包问题 2.1 解决黏包方法1 计算消息实体的大小 服务端接受两次,一次时消息大小,二次是消息实体,解决消息实体黏包 客户端发送两次,一次是消息大小,一次是消息实体 在两次收发之间加入一次多余通信,以防止消息大小和消息实体黏包 server端 import socket sk = socket.socket() sk.bind(('127.0.0.1',9000)) sk.listen() conn,addr = sk.accept() print(conn,addr) while T…
一.缓冲区   每个socket被创建以后,都会分配两个缓冲区,输入缓冲区和输出缓冲区,默认大小都为8k,可以通过getsocket()获取,暂时存放传输数据,防止程序在发送数据的时候卡组,提高代码运行效率   首先看python的系统交互subprocess import subprocess sub_obj = subprocess.Popen( 'dir', # 系统指令:'dir','ipconfig'.等 shell=True, # 使用shell,就相当于使用cmd窗口 stdout…
缓冲区: 将程序和网络解耦输入缓冲区输出缓冲区 print('>>>>', server.getsockopt(SOL_SOCKET, SO_SNDBUF)) 查看输出缓冲区大小 print('>>>>', server.getsockopt(SOL_SOCKET, SO_RCVBUF)) 查看输入缓冲区大小 import subprocess sub_obj = subprocess.Popen( "dir", # 系统指令 shell…
TCP/IP网络通讯粘包问题 案例:模拟执行shell命令,服务器返回相应的类容.发送指令的客户端容错率暂无考虑,按照正确的指令发送即可. 服务端代码 # -*- coding: utf- -*- # 声明字符编码 # coding:utf- import socket import subprocess def server_Tcp(): server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.setsockopt(s…
1.UDP通信编解码类 (1) 类 # ------------------UDP通信解码编码类------------------------ from socket import * class My_Socket(socket): def __init__(self,coding='utf-8'): self.coding = coding super(My_Socket, self).__init__(type=SOCK_DGRAM) def my_recv(self,num): msg…
黏包现象 让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd) res=subprocess.Popen(cmd.decode('utf-8'), shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE) #结果的编码是以当前所在的系统为准的,如果是windows,那么res.stdout.read()读出的#就是GBK编码的,在接收端需要用GBK解码 #且只能从管道里读一次结果 同时执行多条…
黏包现象主要发生在TCP连接, 基于TCP的套接字客户端往服务端上传文件,发送时文件内容是按照一段一段的字节流发送的,在接收方看来,根本不知道该文件的字节流从何处开始,在何处结束. 两种黏包现象: 1 连续的小包可能会被优化算法给组合到一起进行发送 2 第一次如果发送的数据大小2000B接收端一次性接受大小为1024,这就导致剩下的内容会被下一次recv接收到,导致结果错乱 解决黏包现象的两种方案: 方案一:由于双方不知道对方发送数据的长度,导致接收的时候,可能接收不全,或者多接收另外一次发送的…