缓冲区 粘包 029 send 和sendall 的区别 find 和 findall 的区别
一.tcp : 属于长连接 与客户端连接了之后 其他客户端需要等待 要连接另外一个 必须优雅的断开前面这个客户的连接.
二.缓冲区 :为了避免网络传输信号不通畅而是程序一直停留在消息发送状态而不向下进行.
每个socket被创建后 都会分配两个缓冲区 ,输入缓冲区和输出缓冲区
write()/send()并不立即向网络中传输数据 而是先写入缓冲区 再由tcp协议将数据从缓冲区发送到目标机器 一旦写入到缓冲区 函数就可以成功返回 继续进行接下来的操作 不管数据有没有到达目的机器 也不管何时被发送到网络.接收也一样.
缓冲区特性:
1.I/O缓冲区在每个TCP套接字中单独存在
2.I/O缓冲区在创建套接字时自动生成
3.即使关闭套接字也会继续传输缓冲区遗留的数据:
4.关闭套接字将丢失缓冲区域的数据
三.粘包(tcp) :
(1) 发两条信息 但是在客服端一下拼接起来给显示出来 比如 先发送一个 12再发送一个 3 要求计算12/3 但是过去显示为 123 此现象即为粘包现象
粘包需要先引入一个模块 subprocess
import subprocess
cmd = input('请输入指令>>>')
res = subprocess.Popen(
cmd,# 字符串指令 : 'dir','ipconfig'等等
shell=True,# 使用shell 就相当于使用cmd窗口
stderr=subprocess.PIPE,#标准错误输出,凡是指令输出的错误信息就会被他拿到
stdout=subprocess.PIPE#标准输出,正确指令的输出结果被它拿到
)
print(res.stdout.read().decode('gbk'))
print(res.stderr.read().decode('gbk'))
客户端:
import socket
client = socket.socket()
server_ip_port = ('192.168.155.1',8006)
client.connect(server_ip_port)
client.send('hello'.encode('utf-8'))
client.send('sigui'.encode('utf-8'))
client.close()
服务端:
server.bind(ip_port)
server.listen()
conn,addr = server.accept()
from_client_msg1 = conn.recv(1024).decode('utf-8')
from_client_mag2 = conn.recv(1024).decode('utf-8')
print('msg1',from_client_msg1)
print('mag2',from_client_mag2)
conn.close()
server.close()
结果为 :
msg1 hellosigui
mag2
两次连接到一起传给服务端
(2) 客户第一次发送了一条2000B的数据 第二次发送1000B的数据 服务端每次接收1024B结果就是 第一次接收1024 B 第二次接收客户端第一次信息的976 + 第二次24 就比较乱了
根本原因 : 服务端不知道客户端发送的数据大小是多少.
send 和 send all 的区别:
使用send发送的时候 Python将内容传递给系统底层的send接口,也就是说,Python并不知道这次调用是否会全部发送完成 ,比如MTU(Maximum Transmission Unit 最大传输单元 指的是能传输的最大数据包大小(以字节为单位)) 是1500 但是此次发送的内容是2000 , 那么除了包头等其他信息占用 发送量可能在1000左右 , 还有1000未发送完毕 而此时的send不会再进行第二次发送 因为他只发送一次 如果想将剩下的1000发送完毕 需要自行获取返回结果 然后将剩下的内容继续调用fsend发送
sendall()是对 send的包装 完成了用户需要手动完成的部分 会自动判断每次发送的内容量 将剩下的继续传递给send()进行发送:
一般情况下我们都应该使用sendall()
find 和 findall 的区别:
find()用法 : find(name , attrs , recursive , text , **wargs)
查找标签 , 基于name参数
查找文本 , 基于text参数
基于正则表达式的查找
查找标签的属性 , 以及基于attrs参数
基于函数的查找
find_all()用法 相比find() find_all() 有一个额外的参数limit 如 p = soup.find_all(text = 'algae',limit=2) 其实 find()就是当limit=1时的find_all()
find_all() 方法没有找到目标时返回的是空列表 find()方法找不到目标时返回的是None.
缓冲区 粘包 029 send 和sendall 的区别 find 和 findall 的区别的更多相关文章
- python-day8socket、粘包、并发、多用户ftp
@以字符串名称形式引入外部模块:同级文件lib里面有个函数a打印66 1.解释器内部使用 m=__import__('lib')print(m.a()) 结果: 66 None 官方推荐用户使用 im ...
- 网络编程基础之粘包现象与UDP协议
一.粘包现象原理分析 1.我们先来看几行代码,从现象来分析: 测试程序分为两部分,分别是服务端和客户端 服务端.py #!/usr/bin/env python3 #-*- coding:utf-8 ...
- python socket实现文件传输(防粘包)
1.文件传输的要点: 采用iterator(迭代器对象)迭代读取,提高读取以及存取效率: 通过for line in file_handles逐行conn.send(): 2.socket粘包问题: ...
- socket粘包问题解决
粘包client.send(data1)client.send(data2)这两次send紧挨在一起,处理的时候会放在一起发过去在Linux里每次都粘包,Windows里面某次会出现粘包在两次send ...
- 解决socket粘包的两种low版模式 os.popen()和struct模块
os.popen()模式 server端 import socket import os phone = socket.socket() # 实例化一个socket对象 phone.bind((&qu ...
- python之路--subprocess,粘包现象与解决办法,缓冲区
一. subprocess 的简单用法 import subprocess sub_obj = subprocess.Popen( 'dir', #系统指令 shell=True, #固定方法 std ...
- python socket 连续send,出现粘包问题
使用网上socket代码实现ssh功能,如下: server.py #服务端Linux系统下:处理命令并返回import socketimport os#声明类型,生成socket链接对象server ...
- python--subprocess,粘包现象与解决办法,缓冲区
一. subprocess 的简单用法 import subprocess sub_obj = subprocess.Popen( 'dir', #系统指令 shell=True, #固定方法 std ...
- 网络编程3 网络编程之缓冲区&subprocess&粘包&粘包解决方案
1.sub简单使用 2.粘包现象(1) 3.粘包现象(2) 4.粘包现象解决方案 5.struct学习 6.粘包现象升级版解决方案 7.打印进度条
随机推荐
- 【摘自张宴的"实战:Nginx"】try_files指令
语法:try_files param1 [param2...paramN] fallback 默认值:none 使用环境: location 该指令用于告诉nginx测试每个文件是否存在,并且使用首先 ...
- Linux 内核与模块调试
一.简介 内核开发比用户空间开发更难的一个因素就是内核调试艰难.内核错误往往会导致系统宕机,很难保留出错时的现场.调试内核的关键在于你的对内核的深刻理解. 二.方法总结 1)内核模块相关指令 ht ...
- javascript 准确的判断类型方法
在 JavaScript 里使用 typeof 来判断数据类型,只能区分基本类型,即 “number”,”string”,”undefined”,”boolean”,”object” 五种. 对于数组 ...
- java反射中,Class.forName和classloader的区别
http://blog.csdn.net/qq_27093465/article/details/52262340
- WordCountPro小程序
WordCountPro小程序 基本任务 1.githu地址 https://github.com/JarrySmith/WordCountPro 2.psp2.1表 PSP2.1 PSP阶段 预 ...
- Android将程序崩溃信息保存本地文件
大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了 ...
- Win7共享问题 映射网盘时出现的错误 the specified server cannot perform the requested operation
Win7共享问题 映射网盘时出现的错误:the specified server cannot perform the requested operation 解决方案: 1.重启电脑: 2.修改注册 ...
- 源码方式安装rabbitmq
由于工作环境中属于内网,yum安装方式不可用,所以需要采用源码进行rabbitmq的安装.rabbitmq是基于erlang环境进行运行的,所以需要先按照erlang环境,才能运行rabbitmq-s ...
- vtk-py z-Buffer可见算法
C++版例子: https://lorensen.github.io/VTKExamples/site/Cxx/PolyData/SelectVisiblePoints/ 优点: Simple to ...
- 多层mvc,thikphp进阶
程序员,是一种生活态度. 我尽忠恪守,我努力进取,热衷于解决问题,希望得到同样的回报. 我遇到问题,将所有的力量用在解决问题,而不是抱怨,推卸责任上. ------------------------ ...