Python--day32--复习:https和http的区别;黏包;黏包问题的解决方式;

1,https和http的区别:
https比较安全,传输的时候先对内容进行加密,收到后再进行解密;它的传输内容不容易拦截,就算拦截下来了,也是加密的,看不懂。但是要买证书,一年要好几万,小公司承担不起。听说非常安全,在业内都没有出过问题。
2,udp不会黏包,只有tcp会黏包
传输的时候只能传输bite类型数据
demo1--远程执行命令:
server.py
sk = socket.socket()
sk.bind(('127.0.0.1', 8080))
sk.listen()
conn,addr = sk.accept()
while True:
cmd = input('>>>')
if cmd == 'q':
conn.send(b'q')
break
conn.send(cmd.encode('gbk'))
res = conn.recv(1024).decode('gbk')
print(res)
conn.close()
sk.close()
client.py
#接收server端的命令之后在自己的机器上执行
import socket
#找个什么人去帮你执行程序
import subprocess #创建一个sokect的对象
sk = socket.socket()
sk.connect(('127.0.0.1', 8080))
while True:
#收1024个字节
cmd = sk.recv(1024).decode('gbk')
if cmd == 'q':
break
#把接收的结果预先存到PIPE管道里面,就是装数据的容器
res = subprocess.Popen(cmd,shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
sk.send(res.stdout.read())
sk.send(res.stderr.read())
sk.close()
黏包现象:




3、什么是黏包问题,这里终于讲清楚了:
黏包(是tcp协议内部的优化算法造成的):
client接收数据的时候,分两次接收,第一次接收的时候假如只接收两个的话,第二次接收的时候就不会接收得到十个数据,只能接收掉了八个数据。
如果是udp,第一次接收了两个数据,第二次接收是接收不到数据的,因为后面八位数据已经丢失了。
只有tcp中有缓存机制才能发生第二次接收的时候从缓存中接收到剩下的机制,这种现象就是黏包现象。第一次没有完全接收,第二次就会把剩下的发给我,这种问题就是黏包问题。
现在用到的所有的网络传输都是基于socket的

#优化算法
#连续的小数据包会被合并
#多个send 小的数据连在一起,会发生黏包现象,是tcp协议内部的优化算法造成的
#连续使用了send

client端发送信息的机制:
当把所需要的消息发送完关闭之后,默认再往服务器发送一个空消息。(比较高点版本的Windows系统会发送空消息,比较低版本的Windows系统直接报错,我在win7下测试发送的也是空消息)
client2.py

server2.py

#在tcp优化算法中,只有在非常短的时间内接收到消息,才会发生黏包,
#如果等了一段时间,比如一个网络延时了,就会先发先走
server2.py

client2.py

4、发生黏包的原因:
1,连续send两个小数据
2,两个recv,第一个recv特别小
#发生黏包的本质就是你不知道到底要接收多大的数据

5、黏包问题的解决方式
1,方法1:
首先:发送一下这个数据到底有多大
再按照数据的长度接收数据
#好处:确定了我到底要接收多大的数据
#要在文件中配置一个配置项:就是每一次recv的大小 buffer = 4096
#当我们要发送大数据的时候,要明确的告诉接收方要发送多大的数据,以便接收方能够准确的接收到所有的数据
#多用在文件传输的过程中
#大文件的传输 一定是按照字节读 每一次读固定的字节
#传输的过程中 一边读一边传 接收端 一边收一边写
#send这个大文件之前,35672字节 send(4096) 35672-4096-4096 -->0
#recv这个文件,recv 35672字节 recv(2048) 35672-2048 -->0 #不好的地方:多了一次交互
#send sendto 在超过一定的范围的时候 都会报错
#程序的内存管理
程序:
client.py
#接收server端的命令之后在自己的机器上执行
import socket
#找个什么人去帮你执行程序
import subprocess #创建一个sokect的对象
sk = socket.socket()
sk.connect(('127.0.0.1', 8080))
while True:
#收1024个字节
cmd = sk.recv(1024).decode('gbk')
if cmd == 'q':
break
#把接收的结果预先存到PIPE管道里面,就是装数据的容器
res = subprocess.Popen(cmd,shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
std_out = res.stdout.read()
std_err = res.stderr.read()
sk.send(str(len(std_out)+len(std_err)).encode('utf-8'))#
#这里一般不超过4096个,过大会给运行内存造成巨大的压力
sk.recv(4096) #ok
sk.send(std_out)
sk.send(std_err)
sk.close()
server.py
#server 下发命令 给client import socket
sk = socket.socket()
sk.bind(('127.0.0.1', 8080))
sk.listen()
conn,addr = sk.accept()
while True:
cmd = input('>>>')
if cmd == 'q':
conn.send(b'q')
break
conn.send(cmd.encode('gbk'))
num = conn.recv(1024).decode('utf-8')
conn.send(b'ok')
res = conn.recv(int(num)).decode('gbk')
print(res)
conn.close()
sk.close()
2,方法2:struct模块解决黏包问题(看红色的代码)

init.py
import struct
ret = struct.pack('i', 4096) #‘i’代表int,就是即将要把一个数字转换成固定长度bytes类型
print(ret)
num = struct.unpack('i', ret)
print(num[0])
#如果发送数据的时候
#先发送长度 先接收长度
server.py
import struct
import socket
sk = socket.socket()
sk.bind(('127.0.0.1', 8080))
sk.listen()
conn,addr = sk.accept()
while True:
cmd = input('>>>')
if cmd == 'q':
conn.send(b'q')
break
conn.send(cmd.encode('gbk'))
13 num = conn.recv(4) #2048
14 num = struct.unpack('i', num)[0] #2048
res = conn.recv(int(num)).decode('gbk')
print(res)
conn.close()
sk.close()
client.py
import struct
import socket
#找个什么人去帮你执行程序
import subprocess #创建一个sokect的对象
sk = socket.socket()
sk.connect(('127.0.0.1', 8080))
while True:
#收1024个字节
cmd = sk.recv(1024).decode('gbk')
if cmd == 'q':
break
#把接收的结果预先存到PIPE管道里面,就是装数据的容器
res = subprocess.Popen(cmd,shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
std_out = res.stdout.read()
std_err = res.stderr.read()
len_num = len(std_out)+len(std_err) 22 num_by = struct.pack('i', len_num)
23 sk.send(num_by) #4 2048
sk.send(std_out)#
sk.send(std_err)#1024 4+2048
sk.close()
Python--day32--复习:https和http的区别;黏包;黏包问题的解决方式;的更多相关文章
- https http 混合访问_https 页面中引入 http 资源的解决方式
解决android 5.0 webview不能加载http与https混合内容的问题 在使用WebView加载https资源文件时,如果认证证书不被Android认可,那么会出现无法成功加载对应资源问 ...
- Python新式类与经典类的区别
1.新式类与经典类 在Python 2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于“新式类”,都会获得所有“新式类”的特性:反之,即不由任意内置类型派生出的类 ...
- Python import与from import使用及区别介绍
Python程序可以调用一组基本的函数(即内建函数),比如print().input()和len()等函数.接下来通过本文给大家介绍Python import与from import使用及区别介绍,感 ...
- 嵩天老师的零基础Python笔记:https://www.bilibili.com/video/av15123607/?from=search&seid=10211084839195730432#page=25 中的42-45讲 {字典}
#coding=gbk#嵩天老师的零基础Python笔记:https://www.bilibili.com/video/av15123607/?from=search&seid=1021108 ...
- Python中str()与repr()函数的区别——repr() 的输出追求明确性,除了对象内容,还需要展示出对象的数据类型信息,适合开发和调试阶段使用
Python中str()与repr()函数的区别 from:https://www.jianshu.com/p/2a41315ca47e 在 Python 中要将某一类型的变量或者常量转换为字符串对象 ...
- HTTPS和HTTP的区别
(转自:http://www.php100.com/html/it/biancheng/2015/0209/8582.html) 总的来说,http效率更高,https安全性更高. 首先谈谈什么是HT ...
- 使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接
使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接: 使用requests获取html后,分析html中的标签发现所需要的链接在& ...
- HTTPS和HTTP的区别(转)
HTTPS和HTTP的区别 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信 息.HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器 ...
- python _、__和__xx__的区别
python _.__和__xx__的区别 本文为译文,版权属于原作者,在此翻译为中文分享给大家.英文原文地址:Difference between _, __ and __xx__ in Pytho ...
- python中import和from...import...的区别
python中import和from...import...的区别: 只用import时,如import xx,引入的xx是模块名,而不是模块内具体的类.函数.变量等成员,使用该模块的成员时需写成xx ...
随机推荐
- 【水滴石穿】LoginScreen_Firabase_ReactNativeApp_Redux
先看效果 分析代码我们会发现,它使用了firebase 关于登陆部分应该是实时数据库,应该是他们后端校验的 //app.js //这里使用了实时数据库 import React, { Componen ...
- Linux常用命令3 文件搜索命令
文件搜索非常占用资源,所以尽量不要使用这个命令 避免少用该命令最好的方式是设置好文件夹结构,文件不要乱放 1.文件搜索命令:find 命令名称:find 所在路径:/bin/find 执行权限:所有用 ...
- word Stock Market Indices
Stock Market Indices USA Africa Asia and Pacific Canada Europe Middle East South America Internation ...
- html(),val(),text()的区别
.html(),.text(),.val() 三种方法都是用来读取选定元素的内容: .html()是用来读取元素的HTML内容(包括其Html标签): .text()用来读取元素的纯文本内 容,包括其 ...
- 【JZOJ4925】【GDOI2017模拟12.18】稻草人
题目描述 YLOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,YLOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条 ...
- 【JZOJ4930】【NOIP2017提高组模拟12.18】C
题目描述 给出一个H的行和W列的网格.第i行第j列的状态是由一个字母的A[i][j]表示,如下: "." 此格为空. "o" 此格包含一个机器人. " ...
- 【51NOD1304】字符串的相似度
题目描述 我们定义2个字符串的相似度等于两个串的相同前缀的长度.例如 "abc" 同 "abd" 的相似度为2,"aaa" 同 " ...
- Oracle使用——Oracle表字段的增加、删除、修改和重命名
增加字段 语法 alter table tablename add (column datatype [default value][null/not null]); 说明:alter table 表 ...
- jmeter进行的接口测试和压力测试
1.接口测试 接口测试的内容我们之前已经讲过,values-key形式和json串传参形式: 包括的协议有http,webservice(soap),jdbc数据库,java请求 2.参数化 定义:把 ...
- H5本地存储技术和微信小程序中的本地存储
1.H5的本地存储 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...