一.缓冲区

二.两种黏包现象

两种黏包现象:

1 连续的小包可能会被优化算法给组合到一起进行发送

黏包现象1客户端

 import socket
BUFSIZE = 1024
ip_prort = ('127.0.0.1',8001) s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) res = s.connect(ip_prort) s.send('hi'.encode('utf-8'))
s.send('meinv'.encode('utf-8'))

黏包现象1服务端

 from socket import *
ip_prot = ('127.0.0.1',8001) tcp_socket_server = socket(AF_INET,SOCK_STREAM) tcp_socket_server.bind(ip_prot) tcp_socket_server.listen(5) conn,addr = tcp_socket_server.accept() data1 = conn.recv(10)
data2 = conn.recv(10) print('->>>>>',data1.decode('utf-8'))
print('->>>>>',data2.decode('utf-8')) conn.close()

2 第一次如果发送的数据大小2000B接收端一次性接受大小为1024,这就导致剩下的内容会被下一次recv接收到,导致结果错乱

黏包现象2客户端

 import socket

 client = socket.socket()

 ip_prot ='127.0.0.1',8002

 client.connect(ip_prot)

 while 1:
cmd = input('请输入指令') client.send(cmd.encode('utf-8')) server_cmd_result = client.recv(1025) print(server_cmd_result.decode('GBK'))

黏包现象2服务端

 import socket
import subprocess server = socket.socket() ip_prot = '127.0.0.1', 8002 server.bind(ip_prot) server.listen() conn, addr = server.accept() while 1:
from_client_cmd = conn.recv(1024) print(from_client_cmd.decode('utf-8')) sub_obj = subprocess.Popen(
from_client_cmd.decode('utf-8'), # 传入的cmd命令
shell=True,
stdout=subprocess.PIPE, # 正确结果的存放位置
stderr=subprocess.PIPE # 错误结果的存放位置
) std_msg = sub_obj.stdout.read() # 获得管道里面拿到结果 print('指令的执行结果长度>>>>', len(std_msg)) conn.send(std_msg)

三.黏包解决方案

客户端

 import socket
import struct client = socket.socket()
ip_port = '127.0.0.1',8001 client.connect(ip_port) while 1:
cmd = input('请输入指令') # 发送指令 client.send(cmd.encode('utf-8')) server_res_len = client.recv(4) msg_len = struct.unpack('i',server_res_len)[0] print('来自服务器端的消息长度',msg_len) server_cmd_result = client.recv(msg_len) print(server_cmd_result.decode('GBK'))

服务端

 import socket
import subprocess
import struct server = socket.socket()
ip_port = '127.0.0.1',8001 server.bind(ip_port) server.listen() conn,addr = server.accept() while 1:
from_client_cmd = conn.recv(1024) print(from_client_cmd.decode('utf-8')) sub_obj = subprocess.Popen( from_client_cmd.decode('utf-8'),
shell = True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
) std_msg = sub_obj.stdout.read() std_msg_len = len(std_msg) print('指令的执行结果长度>>>>',std_msg_len) msg_lenint_struct = struct.pack('i',std_msg_len) conn.send(msg_lenint_struct + std_msg)

python 缓冲区 subprocess 黏包 黏包解决方案的更多相关文章

  1. python 黏包现象及其解决方案

    一.数据缓冲区 缓冲区(buffer),它是内存空间的一部分.也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区,显然缓冲区是具有一定大小的 ...

  2. Python学习日记(三十一) 黏包问题

    import subprocess res = subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE,stderr=subprocess.P ...

  3. python之路----网络编程--黏包

    黏包现象 让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd) res=subprocess.Popen(cmd.decode('utf-8'), shell ...

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

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

  5. 黏包-黏包的成因、解决方式及struct模块初识、文件的上传和下载

    黏包: 同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接收到之前执行的另外一部分结果,这种显现就是黏包. 只有TCP协议中才会产生黏包,UDP协议中不会有黏包(udp协议中数 ...

  6. python 全栈开发,Day35(TCP协议 粘包现象 和解决方案)

    一.TCP协议 粘包现象 和解决方案 黏包现象让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd)执行远程命令的模块 需要用到模块subprocess sub ...

  7. 【TCP协议】(3)---TCP粘包黏包

    [TCP协议](3)---TCP粘包黏包 有关TCP协议之前写过两篇博客: 1.[TCP协议](1)---TCP协议详解 2.[TCP协议](2)---TCP三次握手和四次挥手 一.TCP粘包.拆包图 ...

  8. Python子进程 (subprocess包)

    Python子进程 (subprocess包) subprocess以及常用的封装函数 当我们运行python的时候,我们都是在创建并运行一个进程.正如我们在Linux进程基础中介绍的那样,一个进程可 ...

  9. 【Python】TCP Socket的粘包和分包的处理

    Reference: http://blog.csdn.net/yannanxiu/article/details/52096465 概述 在进行TCP Socket开发时,都需要处理数据包粘包和分包 ...

随机推荐

  1. Effective Modern C++ 条款2:理解auto型别推导

    在条款1中,我们已经了解了有关模板型别的推导的一切必要知识,那么也就意味着基本上了解了auto型别推导的一切必要知识. 因为,除了一个奇妙的例外情况,auto型别推导就是模板型别推导.尽管和模板型别推 ...

  2. 技术人自己的KPI

    为什么需要技术KPI 在业务技术团队,有一个不好的趋势,就是团队越来越业务,越来越没有技术味道.每个人都在谈业务,技术大会上在谈业务,周会上在聊业务,周报里写的是业务项目......唯独少被谈及的是技 ...

  3. Vue开发警告[Vue warn]: Avoid replacing instance root $data. Use nested data properties instead.

    Avoid replacing instance root $data. Use nested data properties instead. 翻译 避免替换实例根$data.请改用嵌套数据属性 错 ...

  4. 面试Nginx的几个常见问题(

    1.Nginx 服务器上的 Master 和 Worker 进程分别是什么 Master 进程:读取及评估配置和维持 Worker 进程:处理请求   2.怎么添加模块? Firstly, you h ...

  5. 破逼Json,该死的Json库,操了

    jansson,就这个库,破几把玩意,本来很简单的Json,就是简单的字符串操作,ATL一个CString就能解决,QT的QSting也能解决,DELPHI的String也能解决.而这B,非把那么简单 ...

  6. centos下彻底删除mysql

    打算重新试试安装两个mysql,就把老的删除了. yum remove mysql mysql-server mysql-libs compat-mysql51 rm -rf /var/lib/mys ...

  7. python OneHot编码

  8. Oracle查询表里的重复数据方法

    select id from group by id having count(*) > 1 按照id分组并计数,某个id号那一组的数量超过1条则认为重复. 如何查询重复的数据 select 字 ...

  9. Windows Phpstrom svn 配置

    网上百度找到的解决方案行不通,就是下图两项都不选中.临时是可以的,但是到了第二天,又不行了. 以下是自己瞎弄的,居然可以了. 第一步:安装TortoiseSVN 1.8.* ,注意安装选项要选上com ...

  10. ScrollView 实现子视图滑动到顶部时固定不动

    这个,个人建议使用自己写的布局使用view的gon或者visble的方法,使用design包中的控件来的话,局限性很大 方法有倆 (1)自定义ScrollView 重写ScrollView 的 com ...