python网络编程-socket发送大数据包问题
一:什么是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发送大数据包问题的更多相关文章
- C# TCP socket发送大数据包时,接收端和发送端数据不一致 服务端接收Receive不完全
简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...
- 网络编程 - socket接收大数据
通过socket,实现客户端发送命令,将服务端执行出的结果,反回到客户端,主要4个步骤:1.服务端返回数据: 2.服务端返回数据的大小: 3.客户端接收返回数据的大小: 4.客户端按返回数据大小接收数 ...
- Python -- 网络编程 -- Socket发送文件
客户端如果直接send两次,一次发文件名,一次发文件内容 服务端接受的时候会一起接收,不知怎么分开发送,或者分开接收, 或者全部接收再解析内容 今天发现传送mp3文件的时候没问题,传送文本文件的话,以 ...
- Python网络编程socket
网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...
- Day07 - Python 网络编程 Socket
1. Python 网络编程 Python 提供了两个级别访问网络服务: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口 ...
- python 网络编程--socket模块/struct模块
socket模块: 客户端:CS架构, client -> server 浏览器:BS架构, browser -> server 网络通信本质:传输字节 doc命令查看ip地址:ipc ...
- 用原生socket发送HTTP数据包
分享一个写扫描器和POC时的小技巧. 有时候有的漏洞需要一些特殊的数据包,比如说畸形的HTTP头.畸形的Multipart.畸形的chunk包等,此时用编程语言自己的HTTP库可能构造不出这种数据包, ...
- python网络编程-socket“粘包”(小数据发送问题)
一:什么是粘包 “粘包”, 即服务器端你调用时send 2次,但你send调用时,数据其实并没有立刻被发送给客户端,而是放到了系统的socket发送缓冲区里,等缓冲区满了.或者数据等待超时了,数据才会 ...
- python网络编程-socket编程
一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...
随机推荐
- java回文算法
1987891这个就是回文,判断“1987891”是不是回文? 1 public static boolean isPalindrome(String str) { return str.equals ...
- 解题:POI 2011 Strongbox
首先洛谷的题面十分的劝退(至少对我这个菜鸡来说是这样),我来解释一下(原来的英文题面): 有一个有若干个密码(每个密码都可以开箱子)的密码箱,密码是在$0$到$n-1$的数中的,且所有的密码都满足一个 ...
- 解题:USACO14OPEN Fair Photography
题面 有点像JRY的那道序列题,大概是统计题的经典套路? 先说无修改的:将白奶牛记为$-1$,花奶牛记为$1$,然后做前缀和统计某个前缀和$sum$第一次出现的位置,之后再出现就统计答案.对于修改(将 ...
- 使用VS2012调试Dump文件
前一节我讲了怎么设置C++崩溃时生成Dump文件 , 点击 传送门 , 这一节我讲讲怎么使用 VS2012 调试生成的 Dump 文件 , 甚至可以精确到出错的那一行代码上面 ; 1. 生成 Dump ...
- 线性判别分析 LDA
点到判决面的距离 点\(x_0\)到决策面\(g(x)= w^Tx+w_0\)的距离:\(r={g(x)\over \|w\|}\) 广义线性判别函数 因任何非线性函数都可以通过级数展开转化为多项式函 ...
- boost::asio::deadline_timer(理解)
并发与并行: 并发和并行从宏观上来讲都是同时处理多路请求的概念.但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔内发生. 1.Timer.1 - 使 ...
- ubuntu vim 配置
set nuset autoindent cindentmap<F9> :w<cr> :!g++ -O2 -o %< % -Wall<cr>map<F1 ...
- linux命令总结之ip命令
Linux的ip命令和ifconfig类似,但前者功能更强大,并旨在取代后者.使用ip命令,只需一个命令,你就能很轻松地执行一些网络管理任务.ifconfig是net-tools中已被废弃使用的一个命 ...
- Zabbix应用四:Zabbix监控Nginx
利用Zabbix监控Nginx 一.准备nginx监控模版: 1.1.下载nginx监控模版: 点此下载 1.2.导入模版: Zabbix管理页面,选择'配置'->'模版'->'导入': ...
- 面试心得与总结---BAT、网易、蘑菇街
作者:Xoper.ducky链接:https://www.nowcoder.com/discuss/3043来源:牛客网 之前实习的时候就想着写一篇面经,后来忙就给忘了,现在找完工作了,也是该静下心总 ...