tcp协议产生-粘包问题的解决方案

客户端

 1 客户端
 2
 3 from socket import *
 4 import json,struct
 5
 6
 7 client=socket(AF_INET,SOCK_STREAM)
 8 client.connect((‘127.0.0.1‘,8080))
 9
10
11 while True:
12     cmd=input(‘>>>‘).strip()
13     if len(cmd)==0:continue
14     client.send(cmd.encode(‘utf8‘))
15     print(‘客户端命令发送完毕‘)
16     # 收到报头的长度
17     header_len=struct.unpack(‘i‘,client.recv(4))[0]
18
19     # 收到报头的字节内容
20     header_bytes=client.recv(header_len)
21
22     # 转成字符串
23     header_str=header_bytes.decode(‘utf8‘)
24
25     # 根据json转成字典
26     header_dic=json.loads(header_str)
27
28     # 取得文件总大小
29     total_size=header_dic[‘total_size‘]
30
31     recv_size=0
32
33     # 下面的 data 是字节,所以res也必须是字节
34     res=b‘‘
35     while recv_size<total_size:
36         data=client.recv(1024)
37         res+=data
38         recv_size+=len(data)
39     print(res.decode(‘gbk‘))
40
41 client.close()

服务端

 1 服务端
 2
 3 from socket import *
 4 import json,struct
 5 import subprocess
 6
 7 server=socket(AF_INET,SOCK_STREAM)
 8 server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
 9 server.bind((‘127.0.0.1‘,8080))
10 server.listen()
11
12 while True:
13     conn,client_addr=server.accept()
14     while True:
15         try:
16             cmd=conn.recv(1024)
17             if len(cmd)==0:break
18             obj=subprocess.Popen(cmd.decode(‘utf8‘),
19                                  shell=True,
20                                  stdout=subprocess.PIPE,
21                                  stderr=subprocess.PIPE,
22                                  )
23             stdout=obj.stdout.read()
24             stderr=obj.stderr.read()
25             # 制作字典报头
26             header_dic={
27                 ‘file_name‘:‘07 执行python程序的两种方式.mp4‘,
28                 ‘total_size‘:len(stderr)+len(stdout),
29                 ‘hash‘:‘fkjds‘
30             }
31             # 将报头用json 序列化
32             header_json=json.dumps(header_dic)
33             # 将json文件转成字节
34             header_bytes=header_json.encode(‘utf8‘)
35
36             # 将报头打包发送给客户端
37             header=struct.pack(‘i‘,len(header_bytes))
38
39             # 将4个字节的报头发送给客户端,客户端会收到压缩的4个字节的报头
40             conn.send(header)
41
42             # 将字节的报头内容发送给客户端,因为上一步只是将报头的长度发送给了客户端
43             conn.send(header_bytes)
44
45             # 发送正文
46             conn.send(stdout)
47             conn.send(stderr)
48         except ConnectionResetError:
49             break
50     conn.close()
51
52 server.close()

原文地址:https://www.cnblogs.com/Smart1san/p/9286369.html

时间: 2024-10-08 20:35:52

tcp协议产生-粘包问题的解决方案的相关文章

基于tcp协议下粘包现象和解决方案

一.缓冲区 每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区.write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送到目标机器.一旦将数据写入到缓冲区,函数就可以成功返回,不管它们有没有到达目标机器,也不管它们何时被发送到网络,这些都是TCP协议负责的事情.TCP协议独立于 write()/send() 函数,数据有可能刚被写入缓冲区就发送到网络,也可能在缓冲区中不断积压,多次写入的数据被一次性发送到网络,这取决

tcp协议下粘包问题的产生及解决方案

1.粘包产生原因: (1)TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一个TCP段.若连续几次需要send的数据都很少,通常TCP会根据优化算法(Nagle)把这些数据合成一个TCP段后一次发送出去,这样接收方就收到了粘包数据: (2)接收方不知道消息之间的界限,不知道一次性提取多少字节的数据:接收时有字节的限制,如果超过这个限制没有接收完的会留在 操作系统缓存,下次再执行命令获取结果时,优先收取上次命令结果残留的信息: 注:UDP是无连接的,面向消息的,提供高效率服务.不会使用

python学习_day30_基于tcp协议的粘包现象

1.基于远程执行命令的程序 需用到subprocess模块 服务端: #1.执行客户端发送的指令 import socket import subprocess phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.bind(('127.0.0.1',8090)) phone.listen(5) while True: conn,addr=phone.accept() print('IP:%s PORT:%s' %(addr[0

Netty中使用MessagePack时的TCP粘包问题与解决方案

[toc] Netty中使用MessagePack时的TCP粘包问题与解决方案 通过下面的实例代码来演示在Netty中使用MessagPack时会出现的TCP粘包问题,为了学习的连贯性,参考了<Netty权威指南>第7章中的代码,但是需要注意的是,书中并没有提供完整代码,提供的代码都是片段性的,所以我根据自己的理解把服务端的代码和客户端的代码写了出来,可以作为参考. 仍然需要注意的是,我使用的是Netty 4.x的版本. 另外我在程序代码中写了非常详细的注释,所以这里不再进行更多的说明. 在使

Netty系列(四)TCP拆包和粘包

Netty系列(四)TCP拆包和粘包 一.拆包和粘包问题 (1) 一个小的Socket Buffer问题 在基于流的传输里比如 TCP/IP,接收到的数据会先被存储到一个 socket 接收缓冲里.不幸的是,基于流的传输并不是一个数据包队列,而是一个字节队列.即使你发送了 2 个独立的数据包,操作系统也不会作为 2 个消息处理而仅仅是作为一连串的字节而言.因此这是不能保证你远程写入的数据就会准确地读取.举个例子,让我们假设操作系统的 TCP/TP 协议栈已经接收了 3 个数据包: 由于基于流传输

有关TCP和UDP 粘包 消息保护边界

http://www.cnblogs.com/lancidie/archive/2013/10/28/3392428.html 在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.因此TCP的socket编程,收发两端(客户端和服务器端)都要有一一成对的 socket,因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一 个大的数据块,然后进行封包.这样,接收端,就难于分辨出来了,必须提供科学的拆包机

TCP网络传输“粘包”问题,经典解决(附代码)

一.前言 关于TCP网络传输粘包,网上很多人写了原理.总结起来就一句话:这里拿Server和Client长连接,Server和Client之间通过信令传输做说明: Server发送的时候按照一条条信令发送,到达操作系统网络层,首先进入缓冲池,然后TCP协议层从池子中获取数据,传输给Client.我们知道TCP的传输有几个方案,比如,滑动窗口.1比特方案.所以Client收到的数据已经不可能是一个个完整的信令的. 个人理解TCP粘包的概念:它描述了一个场景:"信令是一个个紧挨着的,好像是被粘在一起

TCP 拆、粘包

Netty(三) 什么是 TCP 拆.粘包?如何解决? 前言 记得前段时间我们生产上的一个网关出现了故障. 这个网关逻辑非常简单,就是接收客户端的请求然后解析报文最后发送短信. 但这个请求并不是常见的 HTTP ,而是利用 Netty 自定义的协议. 有个前提是:网关是需要读取一段完整的报文才能进行后面的逻辑. 问题是有天突然发现网关解析报文出错,查看了客户端的发送日志也没发现问题,最后通过日志发现收到了许多不完整的报文,有些还多了. 于是想会不会是 TCP 拆.粘包带来的问题,最后利用 Net

粘包问题及解决方案

一.粘包问题问题1: 无法确认对方发送过来数据的大小. ‘client.py' import socket client = socket.socket() client.connect( ('127.0.0.1', 9000)) while True: cmd = input('客户端输入的内容: ') client.send(cmd.encode('utf-8')) data = client.recv(19190) print(len(data)) print(data.decode('g