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的区别;黏包;黏包问题的解决方式;的更多相关文章

  1. https http 混合访问_https 页面中引入 http 资源的解决方式

    解决android 5.0 webview不能加载http与https混合内容的问题 在使用WebView加载https资源文件时,如果认证证书不被Android认可,那么会出现无法成功加载对应资源问 ...

  2. Python新式类与经典类的区别

    1.新式类与经典类 在Python 2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于“新式类”,都会获得所有“新式类”的特性:反之,即不由任意内置类型派生出的类 ...

  3. Python import与from import使用及区别介绍

    Python程序可以调用一组基本的函数(即内建函数),比如print().input()和len()等函数.接下来通过本文给大家介绍Python import与from import使用及区别介绍,感 ...

  4. 嵩天老师的零基础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 ...

  5. Python中str()与repr()函数的区别——repr() 的输出追求明确性,除了对象内容,还需要展示出对象的数据类型信息,适合开发和调试阶段使用

    Python中str()与repr()函数的区别 from:https://www.jianshu.com/p/2a41315ca47e 在 Python 中要将某一类型的变量或者常量转换为字符串对象 ...

  6. HTTPS和HTTP的区别

    (转自:http://www.php100.com/html/it/biancheng/2015/0209/8582.html) 总的来说,http效率更高,https安全性更高. 首先谈谈什么是HT ...

  7. 使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接

    使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接: 使用requests获取html后,分析html中的标签发现所需要的链接在& ...

  8. HTTPS和HTTP的区别(转)

    HTTPS和HTTP的区别 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信 息.HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器 ...

  9. python _、__和__xx__的区别

    python _.__和__xx__的区别 本文为译文,版权属于原作者,在此翻译为中文分享给大家.英文原文地址:Difference between _, __ and __xx__ in Pytho ...

  10. python中import和from...import...的区别

    python中import和from...import...的区别: 只用import时,如import xx,引入的xx是模块名,而不是模块内具体的类.函数.变量等成员,使用该模块的成员时需写成xx ...

随机推荐

  1. linux系统命令配置文件

    系统命令要独占地控制系统,并让一切正常工作.所有如 login(完成控制台用户身份验证阶段)或 bash(提供用户和计算机之间交互)之类的程序都是系统命令.因此,和它们有关的文件也特别重要.这一类别中 ...

  2. Leetcode896.Monotonic Array单调数列

    如果数组是单调递增或单调递减的,那么它是单调的. 如果对于所有 i <= j,A[i] <= A[j],那么数组 A 是单调递增的. 如果对于所有 i <= j,A[i]> = ...

  3. PHP学习(数组)

    数组就是一个键值对组成的语言结构,键类似于酒店的房间号,值类似于酒店房间里存储的东西. PHP有两种数组:索引数组.关联数组. 索引和关联两个词都是针对数组的键而言的. 索引数组 先介绍下索引数组,索 ...

  4. ELK学习之jdk和jre的区别

    JRE: Java Runtime EnvironmentJDK:Java Development KitJRE顾名思义是java运行时环境,包含了java虚拟机,java基础类库.是使用java语言 ...

  5. 【md5加密】不可逆之简单例子原理

    import hashlib def md5_get(data): ret = hashlib.md5("gfdwuqmo@md1.".encode("utf-8&quo ...

  6. Directx教程(22) 简单的光照模型(1)

    原文:Directx教程(22) 简单的光照模型(1)      在前面的教程中,我们在顶点属性中直接给顶点赋颜色,这样生成的三维物体缺乏真实感,如下图中两个立方体,左边的是通过光照生成物体表面颜色的 ...

  7. PyCharm切换Python版本

    由于代码格式问题,很多情况下需要我们去切换Python版本,那么在当下火爆的PyCharm中是如何切换Python版本的呢? 打开File菜单,选择Settings: 打开Settings窗口后,选择 ...

  8. Python学习之路11☞异常处理

    一 错误和异常 part1:程序中难免出现错误,而错误分成两种 1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) #语法错误示范一 if #语法错误示范二 de ...

  9. linux下清除tomcat缓存

    进入tomcat/bin目录下,执行命令:./shutdown.sh 然后执行命令:ps -aux ,查看tomcat是否真的关闭了 如果没有关闭则执行命令:kill -9 #pid来彻底关闭tomc ...

  10. sqlite数据库文件导入到sqlserver 2016-03-26 21:55 1292人阅读 评论(1) 收藏

    最近在公司做项目,需要做两个版本,都是cs的,然后要求是一个单机版,自带数据库,另一个要进行局域网内的连接,所以公司的大牛设计是,局域网版的用sqlserver2008,单机版的则用sqlite.然后 ...