一:什么是socket大数据包发送问题

  socket服务器端或者客户端在向对方发送的数据大于对方接受的缓存时,会出现第二次接受还接到上次命令发送的结果。这就出现象第一次接受结果不全,第二次接果出现第一次结果。

  比如send 1900 数据,recv 只接受1024。多于数据900放在缓存区里,第二次命令来的时候,调用send会先把900发回去,在把新数据放到缓存区,等到1024在系统会自动发送过去。

  发送数据,一是缓存区满,二是超时

 解决办法:

  在发送数据前,计算发送数据的大小,把大小发给对方。对方接受数据循环,只到接到数据和大小一样。

 

二:示例代码

  

服务器
# -*- coding:utf-8 -*-
__author__ = 'shisanjun' import socket
import subprocess
server=socket.socket() server.bind(("127.0.0.1",9999))
server.listen(5) while True:
conn,addr=server.accept()
print("new conn:",addr) while True:
print(addr)
data=conn.recv(1024)
print(len(data))
print(data.decode())
if not data:
print("conn close ",addr)
break
print(data.decode())
cmd_res=subprocess.Popen(data.decode(),shell=True,stdout=subprocess.PIPE)
outread=cmd_res.stdout.read()
print(outread.decode("gb2312"))
conn.send(outread)
客户端
# -*- coding:utf-8 -*-
__author__ = 'shisanjun' import socket client=socket.socket()
client.connect(("127.0.0.1",9999)) while True:
cmd=input(">>:").strip()
if len(cmd)==0:continue
print(cmd)
client.send(cmd.encode("utf-8"))
print("res")
res=client.recv(1024)
print(res.decode("gb18030"))

大数据发送结果乱问题现象截图:

  

  

  

三:解决代码如下:

服务器端
# -*- coding:utf-8 -*-
__author__ = 'shisanjun' import socket
import subprocess
server=socket.socket() server.bind(("127.0.0.1",9999))
server.listen(5) while True:
conn,addr=server.accept()
print("new conn:",addr) while True:
print(addr)
data=conn.recv(1024)
print(len(data))
print(data.decode())
if not data:
print("conn close ",addr)
break
print(data.decode())
cmd_res=subprocess.Popen(data.decode(),shell=True,stdout=subprocess.PIPE)
outread=cmd_res.stdout.read()
print(len(outread))
conn.send(("%s" %len(outread)).encode("utf-8"))
print(outread.decode("gb2312"))
conn.send(outread)
# -*- coding:utf-8 -*-
__author__ = 'shisanjun' import socket client=socket.socket()
client.connect(("127.0.0.1",9999)) while True:
cmd=input(">>:").strip()
if len(cmd)==0:continue
print(cmd)
client.send(cmd.encode("utf-8"))
print("res")
res_size=client.recv(1024).decode("utf-8")
size=0
while size<int(res_size):
res=client.recv(1024)
print(res.decode("gb18030"))
size+=len(res) #这里要用len(),因为最后一次长度不固定

python网络编程-socket发送大数据包问题的更多相关文章

  1. C# TCP socket发送大数据包时,接收端和发送端数据不一致 服务端接收Receive不完全

    简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...

  2. 网络编程 - socket接收大数据

    通过socket,实现客户端发送命令,将服务端执行出的结果,反回到客户端,主要4个步骤:1.服务端返回数据: 2.服务端返回数据的大小: 3.客户端接收返回数据的大小: 4.客户端按返回数据大小接收数 ...

  3. Python -- 网络编程 -- Socket发送文件

    客户端如果直接send两次,一次发文件名,一次发文件内容 服务端接受的时候会一起接收,不知怎么分开发送,或者分开接收, 或者全部接收再解析内容 今天发现传送mp3文件的时候没问题,传送文本文件的话,以 ...

  4. Python网络编程socket

    网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...

  5. Day07 - Python 网络编程 Socket

    1. Python 网络编程 Python 提供了两个级别访问网络服务: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口 ...

  6. python 网络编程--socket模块/struct模块

    socket模块: 客户端:CS架构,  client -> server 浏览器:BS架构,  browser -> server 网络通信本质:传输字节 doc命令查看ip地址:ipc ...

  7. 用原生socket发送HTTP数据包

    分享一个写扫描器和POC时的小技巧. 有时候有的漏洞需要一些特殊的数据包,比如说畸形的HTTP头.畸形的Multipart.畸形的chunk包等,此时用编程语言自己的HTTP库可能构造不出这种数据包, ...

  8. python网络编程-socket“粘包”(小数据发送问题)

    一:什么是粘包 “粘包”, 即服务器端你调用时send 2次,但你send调用时,数据其实并没有立刻被发送给客户端,而是放到了系统的socket发送缓冲区里,等缓冲区满了.或者数据等待超时了,数据才会 ...

  9. python网络编程-socket编程

     一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...

随机推荐

  1. BZOJ4727 [POI2017]Turysta 【竞赛图哈密顿路径/回路】

    题目链接 BZOJ4727 题解 前置芝士 1.竞赛图存在哈密顿路径 2.竞赛图存在哈密顿回路,当且仅当它是强联通的 所以我们将图缩点后,拓扑排序后一定是一条链,且之前的块内的点和之后块内的点的边一定 ...

  2. 【bzoj3598】 Scoi2014—方伯伯的商场之旅

    http://www.lydsy.com/JudgeOnline/problem.php?id=3598 (题目链接) 题意 Solution 原来这就是极水的数位dp,呵呵= =,感觉白学了.htt ...

  3. linux中的分段和分页

    http://blog.csdn.net/hguisu/article/details/6152921 Linux 内存管理 觉得这篇文章写分段和分页机制还是挺清晰的,在此转载一下. 前一段时间看了& ...

  4. Eclipse Oxygen(4.7.0)安装插件Eclipse Class Decompiler反编译JAR文件

    引用自官方内容 Eclipse Class Decompiler是一款Eclipse插件,整合了多种反编译器,和Eclipse Class Viewer无缝集成,能够很方便的使用插件查看类库源码,进行 ...

  5. 解题:洛谷2257 YY的GCD

    题面 初见莫比乌斯反演 有一个套路是关于GCD的反演经常设$f(d)=\sum_{gcd(i,j)==d},g(d)=\sum_{d|gcd(i,j)}$,然后推推推 $\sum\limits_{i= ...

  6. 使用VS2012调试Dump文件

    前一节我讲了怎么设置C++崩溃时生成Dump文件 , 点击 传送门 , 这一节我讲讲怎么使用 VS2012 调试生成的 Dump 文件 , 甚至可以精确到出错的那一行代码上面 ; 1. 生成 Dump ...

  7. 野指针(Wild pointer)和悬垂指针(dangling pointer)

    详细参考如下: Dangling pointer(悬垂指针.迷途指针)和 Wild pointer(野指针) 迷途指针经常出现在混杂使用malloc() 和 free() 库调用: 当指针指向的内存释 ...

  8. linux常见故障一:linux 文件系统变只读

    1. 重启系统看是否可以自动修复. 2. 使用fsck -y /dev/sda1 进行自动修复.(用”-y”选项来执行该命令对硬盘进行检查和修复)   添加参数:fsck -y -C -t ext3 ...

  9. 「Vue」v-xxx 标签

    v-cloak:v-text:插值表达式v-html:v-bind:提供用于绑定属性的指令,可以简写为:,可以写合法的JS表达式v-on:事件绑定,可以简写为@,v-model 只能应用在表单元素中 ...

  10. java基础-数组的折半查找原理

    java基础-数组的折半查找原理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果让你写一个数组的查找功能,需求如下:在一个数组中,找一个元素,是否存在于数组中, 如果存在就返回 ...