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

Posted smart1san

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()

 

以上是关于tcp协议产生-粘包问题的解决方案的主要内容,如果未能解决你的问题,请参考以下文章

粘包产生的原因 socket 基于tcp实现远程执行命令(解决粘包)low

查漏补缺:socket编程:TCP粘包问题和常用解决方案(上)

TCP协议粘包问题详解

TCP粘包拆包原因与解决方案

TCP粘包拆包原因与解决方案

利用struct模块解决int类型粘包问题