python 缓冲区 subprocess 黏包 黏包解决方案
一.缓冲区

二.两种黏包现象
两种黏包现象:
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 黏包 黏包解决方案的更多相关文章
- python 黏包现象及其解决方案
一.数据缓冲区 缓冲区(buffer),它是内存空间的一部分.也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区,显然缓冲区是具有一定大小的 ...
- Python学习日记(三十一) 黏包问题
import subprocess res = subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE,stderr=subprocess.P ...
- python之路----网络编程--黏包
黏包现象 让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd) res=subprocess.Popen(cmd.decode('utf-8'), shell ...
- 网络编程3 网络编程之缓冲区&subprocess&粘包&粘包解决方案
1.sub简单使用 2.粘包现象(1) 3.粘包现象(2) 4.粘包现象解决方案 5.struct学习 6.粘包现象升级版解决方案 7.打印进度条
- 黏包-黏包的成因、解决方式及struct模块初识、文件的上传和下载
黏包: 同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接收到之前执行的另外一部分结果,这种显现就是黏包. 只有TCP协议中才会产生黏包,UDP协议中不会有黏包(udp协议中数 ...
- python 全栈开发,Day35(TCP协议 粘包现象 和解决方案)
一.TCP协议 粘包现象 和解决方案 黏包现象让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd)执行远程命令的模块 需要用到模块subprocess sub ...
- 【TCP协议】(3)---TCP粘包黏包
[TCP协议](3)---TCP粘包黏包 有关TCP协议之前写过两篇博客: 1.[TCP协议](1)---TCP协议详解 2.[TCP协议](2)---TCP三次握手和四次挥手 一.TCP粘包.拆包图 ...
- Python子进程 (subprocess包)
Python子进程 (subprocess包) subprocess以及常用的封装函数 当我们运行python的时候,我们都是在创建并运行一个进程.正如我们在Linux进程基础中介绍的那样,一个进程可 ...
- 【Python】TCP Socket的粘包和分包的处理
Reference: http://blog.csdn.net/yannanxiu/article/details/52096465 概述 在进行TCP Socket开发时,都需要处理数据包粘包和分包 ...
随机推荐
- day2(老男孩-Python3.5-S14期全栈开发)
作者:赵俊 发布日期:2019/11/5 一.模块初识 import sys '''默认在当前目录下找模块,找不到再去python环境变量中寻找''' print(sys.pat ...
- 在window下远程虚拟机(centos)hadoop运行mapreduce程序
(注:虽然连接成功但是还是执行不了.以后有时间再解决吧 看到的人别参考仅作个人笔记)先mark下 1.首先在window下载好一个eclipse.和拷贝好linux里面hadoop版本对应的插件(我是 ...
- TZOJ 4021 Ugly Problem(线段树区间子段最大)
描述 给定一个序列A[0],A[1],…A[N-1],要求找到p0,p1,p2,p3使得A[p0]+A[p0+1]+…+A[p1] + A[p2]+A[p2+1]+…+A[p3]最大(0<=p0 ...
- GUID(Globally Unique Identifier)全局唯一标识符
最近有大量数据存入数据库时,因为主键为一个nvarchar类型,起初想着用int 类型,每次打开表的时候,获取最后一行的ID,然后让其++. 但发现由于字段是char类型,数据库对其进行了排序.再次插 ...
- Django项目:CRM(客户关系管理系统)--55--46PerfectCRM实现登陆后页面才能访问
#urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...
- LUOGU P1937 [USACO10MAR]仓配置Barn Allocation
传送门 解题思路 扫了一眼觉得是贪心+线段树,结果贪心的时候刚开始按区间长度排的序..这还有82分,后来叉了自己,换成按右端点排序过了. 代码 #include<iostream> #in ...
- input输入框的input事件和change事件
input输入框的onchange事件,要在 input 失去焦点的时候才会触发: 在输入框内容变化的时候不会触发change,当鼠标在其他地方点一下才会触发: onchange 事件也可用于单选框与 ...
- 正确而又严谨得ajax原生创建方式
自己去封装一个xhr对象是一件比较麻烦的事情.其实也不麻烦,注意逻辑和一个ie6兼容方案(可无),和一个304 其他2开头的status都可以就好了 <!DOCTYPE html> < ...
- JAVA:在0-99间产生100个不重复的随机数
Random rand = new Random(); boolean[] bool = new boolean[100]; int[] number = new int[100]; int rand ...
- ubuntu和win10设置双显示器
ubuntu:最右上角那个图标,点开找到系统设置,系统设置中找到“显示”中,在其中可以调节双屏显示或者只显示一个屏,图等会补... win10:现在是ubuntu系统所以操作忘记了写不出来,等下换系统 ...