TCP粘包问题

cmd客户端代码

import socket
import struct
import socket
import json c = socket.socket()
c.connect(("127.0.0.1",9090))
while True:
cmd = input(">>:")
if not cmd:
print("命令不能为空")
continue
c.send(cmd.encode("utf-8")) # 1.接收的是额外信息的长度
length = c.recv(4)
len_data = struct.unpack("i",length)[0] # 转换为整型 # 2.接收额外信息
t_data = c.recv(len_data)
print(t_data.decode("utf-8")) json_dic = json.loads(t_data.decode("utf-8"))
print("执行时间:%s" % json_dic["time"]) data_size = json_dic["size"] # 得到数据长度 # 3.接收真实数据
all_data = b"" # 存储已接收数据
rcv_size = 0 # 已接收长度
# 接收真实数据
# 循环接收 直到 接收到的长度等于总长度
while rcv_size < data_size:
data = c.recv(1024)
rcv_size += len(data)
all_data += data print("接收长度%s" % rcv_size)
print(all_data.decode("gbk"))

cmd服务端代码

import  socket
import subprocess
import struct
import datetime
import json server = socket.socket()
server.bind(("127.0.0.1",9090))
server.listen() # 要求 不仅返回命令的结果 还要返回执行命令的时间 执行时间:2018/12/26 while True:
client,addr = server.accept()
while True:
try:
# 接收命令
cmd = client.recv(1024).decode("utf-8")
p = subprocess.Popen(cmd,shell=True,stdout=-1,stderr=-1)
# data与err_data 都是采用的系统编码 windows是GBK
data = p.stdout.read()
err_data = p.stderr.read() print("数据长度:%s" % (len(data) + len(err_data)))
# 计算真实数据长度
length = len(data) + len(err_data) # 在发送数据之前发送额外的信息
#t = "{执行时间:%s 真实数据长度:%s" % (datetime.datetime.now(),length)
# 把要发送的数据先存到字典中
t = {}
t["time"] = str(datetime.datetime.now())
t["size"] = length
t["filename"] = "a.mp4" t_json = json.dumps(t) # 得到json格式字符串
t_data = t_json.encode("utf-8") # 将json转成了字节
t_length = struct.pack("i",len(t_data)) # 1.先发送额外信息的长度
client.send(t_length)
# 2.发送额外信息
client.send(t_data) # 3.发送真实数据
client.send(data)
client.send(err_data)
except ConnectionResetError:
client.close()
print("连接中断......")
break # 1.发送了真实数据长度
2.发送了额外信息长度
3.发送额外信息
4.真实数据

粘包测试

服务器端
import socket
import subprocess server = socket.socket()
server.bind(("127.0.0.1",9090))
server.listen()
client,addr = server.accept() # data = client.recv(2)
# print(data.decode("utf-8"))
# data = client.recv(2)
# print(data.decode("utf-8"))
# data = client.recv(2)
# print(data.decode("utf-8")) data = client.recv(1024)
print(data.decode("utf-8"))
data = client.recv(1024)
print(data.decode("utf-8"))
data = client.recv(1024)
print(data.decode("utf-8")) 客户端
import time
import socket
c = socket.socket()
c.connect(("127.0.0.1",9090)) # c.send("abcdefg".encode("utf-8"))
c.send("bc".encode("utf-8"))
# time.sleep(1)
c.send("ca".encode("utf-8"))
# time.sleep(1)
c.send("da".encode("utf-8"))

day31 粘包问题的更多相关文章

  1. day31——recv工作原理、高大上版解决粘包方式、基于UDP协议的socket通信

    day31 recv工作原理 源码解释: Receive up to buffersize bytes from the socket. 接收来自socket缓冲区的字节数据, For the opt ...

  2. 《连载 | 物联网框架ServerSuperIO教程》- 9. 协议过滤器,解决一包多发、粘包、冗余数据

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  3. Socket编程(4)TCP粘包问题及解决方案

    ① TCP是个流协议,它存在粘包问题 TCP是一个基于字节流的传输服务,"流"意味着TCP所传输的数据是没有边界的.这不同于UDP提供基于消息的传输服务,其传输的数据是有边界的.T ...

  4. Netty(三)TCP粘包拆包处理

    tcp是一个“流”的协议,一个完整的包可能会被TCP拆分成多个包进行发送,也可能把小的封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题. 粘包.拆包问题说明 假设客户端分别发送数据包D1和D ...

  5. netty 解决TCP粘包与拆包问题(二)

    TCP以流的方式进行数据传输,上层应用协议为了对消息的区分,采用了以下几种方法. 1.消息固定长度 2.第一篇讲的回车换行符形式 3.以特殊字符作为消息结束符的形式 4.通过消息头中定义长度字段来标识 ...

  6. Netty的TCP粘包/拆包(源码二)

    假设客户端分别发送了两个数据包D1和D2给服务器,由于服务器端一次读取到的字节数是不确定的,所以可能发生四种情况: 1.服务端分两次读取到了两个独立的数据包,分别是D1和D2,没有粘包和拆包. 2.服 ...

  7. Socket粘包问题

    这两天看csdn有一些关于socket粘包,socket缓冲区设置的问题,发现自己不是很清楚,所以查资料了解记录一下: 一两个简单概念长连接与短连接:1.长连接 Client方与Server方先建立通 ...

  8. Mina传输大数组,多路解码,粘包问题的处理

    我的实际情况: 1,传递的业务数据种类很多,这就决定了我们要用多路解码器,MINA的中文手册提供的是DemuxingProtocolCodecFactory; 2,,有的数据长度达到8K,网上有资料说 ...

  9. TCP的粘包现象

    看面经时,看到有面试官问TCP的粘包问题.想起来研一做购物车处理数据更新时遇到粘包问题,就总结一下吧. 1 什么是粘包现象 TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看, ...

随机推荐

  1. Loadrunner:win10下Vuser 运行脚本通过,Controller执行用户并发报错

    现象:win7安装LR可以正常使用,将win7升级到win10之后,运行场景之后报错:Error (-81024): LR_VUG: The 'QTWeb' type is not supported ...

  2. 0基础学习MySQL 之常用数据类型

    原文地址 =========================================== 数据类型是定义列中可以存储什么数据以及该数据实际怎么存储的基本规则. Mysql的常用数据类型主要有: ...

  3. 转载:HTuple数据和VC数据的相互赋值

    转载来自:http://blog.csdn.net/taily_duan/article/details/51026260 HTuple和VC数据的相互赋值 // HTuple→VC 数据类型转换 H ...

  4. Python基础2 列表 字典 集合

    本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ...

  5. js 简单算法

    1. 嵌套数组打平并且去重 ,,,,,,,,[,,,,[,,]]]; var obj = {};//去重标识 function test(data) { var newArr = []; for ( ...

  6. spring cloud之路(1)

    1.各个功能 springcloud 注册中心 Eureka负载均衡 Ribbon路由网关 Zuul断路器 Hystrix分布式配置 config服务调用跟踪 sleuth日志输出 elk 认证集成 ...

  7. 机器学习进阶-图片基本处理-ROI区域 1.img[0:200, 0:200]截取图片 2.cv2.split(对图片的颜色通道进行拆分) 3. cv2.merge(将颜色通道进行合并) 4 cur_img[:, :, 0] = 0 使得b通道的颜色数值为0

    1. 截取图片的部分区域img[0:200, 0:200], 读入的图片是ndarray格式 2. b, g, r = cv2.split(img)  # 对图片的颜色通道进行拆分 3.img = c ...

  8. 机器学习进阶-svm支持向量机

    支持向量机需要解决的问题:找出一条最好的决策边界将两种类型的点进行分开 这个时候我们需要考虑一个问题,在找到一条直线将两种点分开时,是否具有其他的约束条件,这里我们在满足找到一条决策边界时,同时使得距 ...

  9. APP-9.1-百度应用-文字识别

    1.创建应用-文字识别 https://console.bce.baidu.com/ai/#/ai/ocr/app/list 尽量勾选:文字识别.百度语音.图像设别.人脸识别.图像搜索 2.获取Acc ...

  10. CSRF学习小结

    什么是CSRF CSRF,全称是Cross Site Request Forgery,也即跨站请求伪造.对于CSRF来说,它的请求有两个关键点:跨站点的请求和请求是伪造的. 跨站点的请求的来源是其他站 ...