一.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. 如何使用google等一系列搜索引擎?

    对于我们经常使用的搜索引擎大家都都不陌生,但是,如何高效的利用呢?大家都知道空格是搜索多个关键词,那么有没有其他的快捷键呢?答案是肯定的,以下内容转自知乎 1.双引号 把搜索词放在双引号中,代表完全匹 ...

  2. ztree 树的模糊搜索

    (转载),有个坑记录下: (原文)实现类似下面这种: /** * 展开树 * @param treeId */ function expand_ztree(treeId) { var treeObj ...

  3. springBoot 案例

    一.工具 JDK1.7 Eclipse Maven 这里Eclipse集成Maven的这一步就省了! 二.编码 新建Maven Project 命名为:SpringBootDemo 选项如图 2.修改 ...

  4. 安装nodemon热启动

    1.安装: cnpm i nodemon -g 2.执行 nodemon .\launch.js .\config_preview\ .\launch.js 为我要启动的脚本文件 .\config_p ...

  5. 使用java开源包解析ifc并获取数据(树形结构)

     import java.io.File;import java.util.Collection;import java.util.Enumeration;import java.util.HashM ...

  6. JavaPersistenceWithMyBatis3笔记-第1章-001

    一.介绍 1.项目结构 2.数据库结构 二.代码 1.Mapper package com.mybatis3.mappers; import java.util.List; import com.my ...

  7. hive与hbase数据类型对应关系

    hive与hbase数据类型对应关系 当hbase中double,int 类型以byte方式存储时,用字符串取出来必然是乱码. 在hivd与hbase整合时也遇到这个问题:做法是:#b 1.加#b C ...

  8. Java_枚举类

    枚举类 枚举类不出来的时候只能如下写代码 //Student.java package cn.itcast.enumeration; public class Student { private St ...

  9. Netty的Channel

    Channel是一个网络端口连接,或者是可以进行读,写,链接,绑定端口的组件的连接.  Channel就是一个链接,它提供了如下的功能. 1:获取当前链接的状态 2:配置当前链接参数 3:进行read ...

  10. Python中的切片操作

    python中的切片操作功能十分强大,通常我们利用切片来进行提取信息,进行相关的操作,下面就是一些切片的列子. 列如我们从range函数1-100中取7的倍数,函数及结果如下所示: >>& ...