TCP粘包问题

cmd客户端代码

  1. import socket
  2. import struct
  3. import socket
  4. import json
  5. c = socket.socket()
  6. c.connect(("127.0.0.1",9090))
  7. while True:
  8. cmd = input(">>:")
  9. if not cmd:
  10. print("命令不能为空")
  11. continue
  12. c.send(cmd.encode("utf-8"))
  13. # 1.接收的是额外信息的长度
  14. length = c.recv(4)
  15. len_data = struct.unpack("i",length)[0] # 转换为整型
  16. # 2.接收额外信息
  17. t_data = c.recv(len_data)
  18. print(t_data.decode("utf-8"))
  19. json_dic = json.loads(t_data.decode("utf-8"))
  20. print("执行时间:%s" % json_dic["time"])
  21. data_size = json_dic["size"] # 得到数据长度
  22. # 3.接收真实数据
  23. all_data = b"" # 存储已接收数据
  24. rcv_size = 0 # 已接收长度
  25. # 接收真实数据
  26. # 循环接收 直到 接收到的长度等于总长度
  27. while rcv_size < data_size:
  28. data = c.recv(1024)
  29. rcv_size += len(data)
  30. all_data += data
  31. print("接收长度%s" % rcv_size)
  32. print(all_data.decode("gbk"))

cmd服务端代码

  1. import socket
  2. import subprocess
  3. import struct
  4. import datetime
  5. import json
  6. server = socket.socket()
  7. server.bind(("127.0.0.1",9090))
  8. server.listen()
  9. # 要求 不仅返回命令的结果 还要返回执行命令的时间 执行时间:2018/12/26
  10. while True:
  11. client,addr = server.accept()
  12. while True:
  13. try:
  14. # 接收命令
  15. cmd = client.recv(1024).decode("utf-8")
  16. p = subprocess.Popen(cmd,shell=True,stdout=-1,stderr=-1)
  17. # data与err_data 都是采用的系统编码 windows是GBK
  18. data = p.stdout.read()
  19. err_data = p.stderr.read()
  20. print("数据长度:%s" % (len(data) + len(err_data)))
  21. # 计算真实数据长度
  22. length = len(data) + len(err_data)
  23. # 在发送数据之前发送额外的信息
  24. #t = "{执行时间:%s 真实数据长度:%s" % (datetime.datetime.now(),length)
  25. # 把要发送的数据先存到字典中
  26. t = {}
  27. t["time"] = str(datetime.datetime.now())
  28. t["size"] = length
  29. t["filename"] = "a.mp4"
  30. t_json = json.dumps(t) # 得到json格式字符串
  31. t_data = t_json.encode("utf-8") # 将json转成了字节
  32. t_length = struct.pack("i",len(t_data))
  33. # 1.先发送额外信息的长度
  34. client.send(t_length)
  35. # 2.发送额外信息
  36. client.send(t_data)
  37. # 3.发送真实数据
  38. client.send(data)
  39. client.send(err_data)
  40. except ConnectionResetError:
  41. client.close()
  42. print("连接中断......")
  43. break
  44. # 1.发送了真实数据长度
  45. 2.发送了额外信息长度
  46. 3.发送额外信息
  47. 4.真实数据

粘包测试

  1. 服务器端
  2. import socket
  3. import subprocess
  4. server = socket.socket()
  5. server.bind(("127.0.0.1",9090))
  6. server.listen()
  7. client,addr = server.accept()
  8. # data = client.recv(2)
  9. # print(data.decode("utf-8"))
  10. # data = client.recv(2)
  11. # print(data.decode("utf-8"))
  12. # data = client.recv(2)
  13. # print(data.decode("utf-8"))
  14. data = client.recv(1024)
  15. print(data.decode("utf-8"))
  16. data = client.recv(1024)
  17. print(data.decode("utf-8"))
  18. data = client.recv(1024)
  19. print(data.decode("utf-8"))
  20. 客户端
  21. import time
  22. import socket
  23. c = socket.socket()
  24. c.connect(("127.0.0.1",9090))
  25. # c.send("abcdefg".encode("utf-8"))
  26. c.send("bc".encode("utf-8"))
  27. # time.sleep(1)
  28. c.send("ca".encode("utf-8"))
  29. # time.sleep(1)
  30. 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. 29.Mongodb可视化工具 Studio 3t

    Studio 3T 链接地址:https://pan.baidu.com/s/1X-Sqk50Xm76NJIZOz0ehFw 密码:td2a 安装配置成功链接本地如图所示:

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

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

  3. Linux 硬链接、软链接

    索引节点 inode(index node) 我们知道文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata).用户数据,即文件数据块 ...

  4. Mysql中select的正确姿势

    引言 大家在开发中,还有很多童鞋在写查询语句的时候,习惯写下面这种不规范sql select * from table 而不写成下面的这种规范方式 select col1,col2,...,coln ...

  5. linux驱动开发第二步 驱动模块传参(module_param函数使用)

    在驱动的模块中声明一下你要传递的参数名称,类型和权限 module_param(变量的名称,类型,权限); 先上例子 #include <linux/init.h> #include &l ...

  6. Activity工作流学习(二)--Activity数据库

    23张表 ACT_RE_资源库流程规划表 act_re_deployment 部署信息表 act_re_model 流程设计模型部署表 act_re_procdef 流程定义数据表 ACT_RU_运行 ...

  7. DOS 格式化日期时间输出

    if "%date:~5,2%" lss "10" (set mm=0%date:~6,1%) else (set mm=%date:~5,2%)if &quo ...

  8. sqlserver中 事物 索引及视图

      事务 1.什么是事务 事务是一个不可分割的工作逻辑单元,它包含了一组数据库的操作命令,并且所有命令作为一个整体一起向系统提交或撤销操作请求,即要么都执行,要么都不执行 2.事务的4个属性 (1). ...

  9. java实现解压zip文件,(亲测可用)!!!!!!

    项目结构: Util.java内容: package com.cfets.demo; import java.io.File; import java.io.FileOutputStream; imp ...

  10. python 可迭代对象与迭代器

    生成器函数的工作原理只要 Python 函数的定义体中有 yield 关键字, 该函数就是生成器函数. 调用生成器函数时, 会返回一个生成器对象. 也就是说, 生成器函数是生成器工厂. 调用生成器函数 ...