一.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 的区别的更多相关文章

  1. python-day8socket、粘包、并发、多用户ftp

    @以字符串名称形式引入外部模块:同级文件lib里面有个函数a打印66 1.解释器内部使用 m=__import__('lib')print(m.a()) 结果: 66 None 官方推荐用户使用 im ...

  2. 网络编程基础之粘包现象与UDP协议

    一.粘包现象原理分析 1.我们先来看几行代码,从现象来分析: 测试程序分为两部分,分别是服务端和客户端 服务端.py #!/usr/bin/env python3 #-*- coding:utf-8 ...

  3. python socket实现文件传输(防粘包)

    1.文件传输的要点: 采用iterator(迭代器对象)迭代读取,提高读取以及存取效率: 通过for line in file_handles逐行conn.send(): 2.socket粘包问题: ...

  4. socket粘包问题解决

    粘包client.send(data1)client.send(data2)这两次send紧挨在一起,处理的时候会放在一起发过去在Linux里每次都粘包,Windows里面某次会出现粘包在两次send ...

  5. 解决socket粘包的两种low版模式 os.popen()和struct模块

    os.popen()模式 server端 import socket import os phone = socket.socket() # 实例化一个socket对象 phone.bind((&qu ...

  6. python之路--subprocess,粘包现象与解决办法,缓冲区

    一. subprocess 的简单用法 import subprocess sub_obj = subprocess.Popen( 'dir', #系统指令 shell=True, #固定方法 std ...

  7. python socket 连续send,出现粘包问题

    使用网上socket代码实现ssh功能,如下: server.py #服务端Linux系统下:处理命令并返回import socketimport os#声明类型,生成socket链接对象server ...

  8. python--subprocess,粘包现象与解决办法,缓冲区

    一. subprocess 的简单用法 import subprocess sub_obj = subprocess.Popen( 'dir', #系统指令 shell=True, #固定方法 std ...

  9. 网络编程3 网络编程之缓冲区&subprocess&粘包&粘包解决方案

    1.sub简单使用 2.粘包现象(1) 3.粘包现象(2) 4.粘包现象解决方案 5.struct学习 6.粘包现象升级版解决方案 7.打印进度条

随机推荐

  1. 【android】关于自己实现adapter后gridview中item无法被选中的解决方法

    有时候,自己继承实现了baseadapter将其赋给gridview之后,gridview会十分奇怪的无法选中内部的item. 经过仔细研究,我发现是在继承的时候多复写了几个方法,解决方法就是,只保留 ...

  2. Go语言-变量和常量

    我们在这里需要优先说明的是用于声明变量的关键字var,以及用于声明常量的关键字const.要知道,绝大多数的数据类型的值都可以被赋给一个变量,包括函数.而常量则不同,它只能被赋予基本数据类型的值本身. ...

  3. Python 安装 django框架

    1.安装 pip install django 2.创建项目 d:/www/django文件夹下右键->打开dos窗口 输入: python C:\ProgramData\Miniconda3\ ...

  4. 32-回文字符串(dp)

    http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=37 回文字符串 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描 ...

  5. (转)Linux网络协议栈(三)——网络设备(1)

    网络设备(network device)是内核对网络适配器(硬件)的抽象与封装,并为各个协议实例提供统一的接口,它是硬件与内核的接口,它有两个特征:(1)    作为基于硬件的网络适配器与基于软件的协 ...

  6. Luogu 3479 [POI2009]GAS-Fire Extinguishers

    补上了这一道原题,感觉弱化版的要简单好多. 神贪心: 我们设$cov_{x, i}$表示在$x$的子树中与$x$距离为$i$的还没有被覆盖到的结点个数,设$rem_{x, i}$表示在$x$的子树中与 ...

  7. Git 之 初使用

    什么是Git? Git 是一个开源的分布式版本控制软件,用以有效.高速的处理从很小到非常大的项目版本管理. Git 最初是由Linus Torvalds设计开发的,用于管理Linux内核开发.Git ...

  8. 使用IDEA开发SPARK提交remote cluster执行

    开发环境 操作系统:windows 开发工具:IntelliJ IDEA  14.1.1 需要安装scala插件 编译环境:jdk 1.7   scala 2.10.4 使用IDEA开发spark应用 ...

  9. 二维码的生成细节和原理 -- 转http://news.cnblogs.com/n/191671/

    二维码又称 QR Code,QR 全称 Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的 Bar Code 条形码能存更多的信息,也能表示更多的数据类型:比如:字 ...

  10. 解决批处理命令执行完毕后自动关闭cmd窗口方法

    问题描述: 日常开发工作中,为了节省多余操作导致浪费时间,我们经常会自己建一些批处理脚本文件(xx.bat),文件中包含我们需要执行的命令,有时候我们希望执行完毕后看一下执行的结果,但是窗口执行完毕后 ...