server端配置:

import socket,subprocess,struct
from socket import *
server=socket(AF_INET,SOCK_STREAM)
server.bind(('127.0.0.1',8080))
server.listen(5) while True:
conn,client_addr=server.accept()
while True:
try:
cmd=conn.recv(1024)
if len(cmd) == 0:break
obj=subprocess.Popen(
cmd.decode('utf-8'),
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
out=obj.stdout.read() #bytes类型
err=obj.stderr.read()
print(len(out+err)) # 解决粘包问题的步骤,先发型数据的长度
total_size=len(out)+len(err) #数据类型,1.变为bytes类型 2.还是个固定长度 #1.制作固定长度的包头
header=struct.pack('i',total_size) #2.发送报头
conn.send(header) #固定数据报的head头的大小(自定义数据) #下面是发送真是的数据
# conn.send(out+err)
#2个包是一起发过去的,因为间隔短
conn.send(out)
conn.send(err) #发过去的整体是一个数据报=报头+数据部分 except ConnectionResetError:
break
conn.close() server.close()

client端配置:

import socket
import socket,struct
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('127.0.0.1',8080))
while True:
cmd=input('输入执行的命令:')
if len(cmd) == 0: continue
client.send(cmd.encode('utf-8'))
#1.先收固定长度的的包头默认stuck就是固定了长度为4
header=client.recv(4) #第二次再收不是下一个包头,是上次命令的残留
#2.解析包头
total_size=struct.unpack('i',header)[0] #拿到的是个元祖,元祖的0就是这个长度值
print(total_size)
#3.根据包头内的信息,收取真实数据
# client.recv(total_size) 因为现实数据量太大的时候就不行,所以考虑while循环 #思考如果数据大,total_size数据会特别大就会直接报错
#为了解决输入较大程序,定义一个小的变量,循环一点点就去收
recv_size=0
res=b''
while recv_size < total_size:
recv_data=client.recv(1024) #recv_data是bytes类型,是唯一真实的值,有多少就会收多少
res+=recv_data
recv_size+=len(recv_data) print(res.decode('gbk')) client.close()

Python socket粘包问题(初级解决办法)的更多相关文章

  1. socket粘包现象加解决办法

    socket粘包现象分析与解决方案 简单远程执行命令程序开发(内容回顾) res = subprocess.Popen(cmd.decode('utf-8'),shell=True,stderr=su ...

  2. Python socket粘包解决

    socket粘包: socket 交互send时,连续处理多个send时会出现粘包,soket会把两条send作为一条send强制发送,会粘在一起. send发送会根据recv定义的数值发送一个固定的 ...

  3. Python socket粘包问题(最终解决办法)

    套接字: 就是将传输层以下的协议封装成子接口 对于应用程序来说只需调用套接字的接口,写出的程序自然是遵循tcp或udp协议的 实现第一个功能个:实现:通过客户端向服务端发送命令,调取windows下面 ...

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

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

  5. Python socket 粘包

    目录 1 TCP的三次握手四次挥手 0 1.1 三次握手 1 1.2 四次挥手 2 2 粘包现象 3 2.1 基于TCP制作远程执行命令操作(win服务端) 4 2.1 基于TCP制作远程执行命令操作 ...

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

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

  7. python socket粘包及实例

    1.在linux中经常出现粘包的出现(因为两个send近靠着,造成接受到的数据是在一起的.)解决方法: 在服务端两send的中间中再添加一个recv(),客户端添加一个send(),服务端收到信息确认 ...

  8. Python中Socket粘包问题的解决

    服务器端 import socket import subprocess import struct server = socket.socket() ip_port = ("192.168 ...

  9. 什么是TCP粘包?怎么解决这个问题

    在socket网络编程中,都是端到端通信,由客户端端口+服务端端口+客户端IP+服务端IP+传输协议组成的五元组可以明确的标识一条连接.在TCP的socket编程中,发送端和接收端都有成对的socke ...

随机推荐

  1. CentOS 7安装Docker服务详细过程

    ---恢复内容开始--- Docker 简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟 ...

  2. UI事件与内容,舞台与演员

    UI事件:创建/清除/显示/隐藏/填充内容/位置变化/形态变化/尺寸变化/颜色变化/ 非UI事件:点击/输入/拖动/

  3. Windows Azure 配置Active Directory 主机(1)

    现在越来越多企业将自己业务系统迁移云端,方便公司日常运维管理.这篇文章将简单介绍一下,从 Windows Azure 虚拟网络上的虚拟机 (VM) 中的 Corp Active Directory 林 ...

  4. python基础教程总结9——模块,包,标准库

    1. 模块 在python中一个文件可以被看成一个独立模块,而包对应着文件夹,模块把python代码分成一些有组织的代码段,通过导入的方式实现代码重用. 1.1 模块搜索路径 导入模块时,是按照sys ...

  5. Vue中npm run build报“Error in parsing SVG: Unquoted attribute value”

    自己做的一个Vue项目,在打包时老是报这个错误 # Error in parsing SVG: Unquoted attribute value 查了查网上说的,都说报错原因是压缩和抽离CSS的插件中 ...

  6. attachEvent和addEventListener 的使用方法和区别

    attachEvent方法,为某一事件附加其它的处理事件.(不支持Mozilla系列)addEventListener方法 用于 Mozilla系列document.getElementById(&q ...

  7. this经典试题

    <body> <div class="container"> <h3>输出内容</h3> <pre> var name ...

  8. VMWare安装苹果Mac OS X

    随着iPhone.iPad.Mac等苹果产品越来越火爆,越来越多的初学者想要了解和尝试苹果平台,包括苹果操作系统Mac OS X.苹果演示软件Keynote.苹果开发工具Xcode等.然而,苹果电脑价 ...

  9. WCF_基础学习

    1.https://www.cnblogs.com/swjian/p/8126202.html 2.https://www.cnblogs.com/dotnet261010/p/7407444.htm ...

  10. GoF23种设计模式之结构型模式之享元模式

    一.概述  运用共享技术有效地支持大量细粒度的对象. 二.适用性 1.当一个应用程序使用了大量的对象的时候. 2.由于使用大量的独享而造成很大的存储开销的时候. 3.对象的大多数状态都可变为外部状态的 ...