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七层 ... 
随机推荐
- 字典树(trie树)的指针简单实现pascal
			问题1:给你一个单词集合,支持添加,删除,询问某个单词出现次数. ; maxn=; type dictree=^rec; rec=record next:array[..maxword]of dict ... 
- hdu4336 Card Collector  【最值反演】
			题目链接 hdu4336 题解 最值反演 也叫做\(min-max\)容斥,在计算期望时有奇效 \[max\{S\} = \sum\limits_{T \in S} (-1)^{|T| + 1}min ... 
- 前端学习 -- Xhtml语法规范
			Xhtml语法规范 HTML中不区分大小写,但是尽量使用小写: HTML的注释不能嵌套: 标签必须结构完整{要么成对出现,要么自结束标签,虽然浏览器会帮我们修正一些不符合规范的内容} 标签可以嵌套但是 ... 
- Service Intent must be explicit的解决方法
			今天遇到如标题问题,查阅资料:http://blog.android-develop.com/2014/10/android-l-api-21-javalangillegalargumen.html ... 
- Vulkan vs OpenGL ES
			Vulkan 简介 Vulkan是一个免费开放的.跨平台的.底层的图形API,在一定程度上比AMD Mantle.微软DirectX 12.苹果Metal更值得开发者关注. Vulkan的最大任务不是 ... 
- bzoj 1814: Ural 1519 Formula 1 插头dp经典题
			用的括号序列,听说比较快. 然并不会预处理,只会每回暴力找匹配的括号. #include<iostream> #include<cstdio> #include<cstr ... 
- Long与long的区别
			Java的数据类型分两种:1.基本类型:long,int,byte,float,double,char2. 对象类型(类): Long,Integer,Byte,Float,Double,Char,S ... 
- Chapter 5(串)
			1.kmp #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <str ... 
- Ansible1: 简介与基本安装
			目录 Ansible特性 Ansible的基本组件 Ansible工作机制 Ansible的安装 Ansible是一个综合的强大的管理工具,他可以对多台主机安装操作系统,并为这些主机安装不同的应用程序 ... 
- P3866 [TJOI2009]战争游戏
			P3866 [TJOI2009]战争游戏 题目背景 小R正在玩一个战争游戏.游戏地图是一个M行N列的矩阵,每个格子可能是障碍物,也可能是空地,在游戏开始时有若干支敌军分散在不同的空地格子中.每支敌军都 ... 
