首页 > 其他 > 详细

粘包的高大上版本

时间:2019-02-23 11:36:05      阅读:154      评论:0      收藏:0      [点我收藏+]
import socket
import subprocess
import json
import struct
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  #socket.AF_INET 基于网络的 socket.SOCK_STREAM
server.bind((127.0.0.1,8848))                  #绑定ip和端口时要用元祖的形式
server.listen(5)
while True:
    conn,addr = server.accept()                  #等待客户端的接入
    while True:
        try:
            cmd = conn.recv(1024).decode(utf-8)        #接收的命令必须是解码后的命令 不然会报错

            obj = subprocess.Popen(              #crm的命令加载框架 
                cmd,
                shell= True,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
            )
            right_msg = obj.stdout.read()
            error_msg = obj.stderr.read()
            file = {file_name:aaa,            #关于文件的必须要有文件名,文件路径,文件大小
                    file_path:‘‘,
                    file_size:len(right_msg + error_msg)
            }
            dic_json = json.dumps(file) #将字典序列化为字符串
            dic_json_bytes = dic_json.encode(utf-8) #将字典的字符串转化为字节
            dic_json_bytes_len = struct.pack(i,len(dic_json_bytes)) #将字典的字节数转化为固定的四个字节
            conn.send(dic_json_bytes_len)
            conn.send(dic_json_bytes)
            conn.send(right_msg+error_msg)

        except Exception:
            break
    conn.close()
server.close()

 以上是服务端的代码:注意点 编程中接收和发送的都是字节 

数据的发送都是字节的形式:通过三次发送报头,字典的字节,以及数据的字节

技术分享图片

报头和字典都是辅助数据 都只是为了解决接收数据时可能会产生粘包问题做的铺垫 

 

客户端的代码:

 

import socket
import struct
import json
client = socket.socket()
client.connect((‘127.0.0.1‘,8848))   #ip和端口用的是元祖的形式
cmd = input(‘>>>‘)
client.send(cmd.encode(‘utf-8‘))
dic_json_bytes_len = client.recv(4)  #接收报头 固定四个字节
dic_json_bytes = struct.unpack(‘i‘,dic_json_bytes_len)[0]    #struct.unpack解包后的数据为元祖
dic_json_encode = client.recv(dic_json_bytes)   #接收字典的字节数 根据报头解包出字典的字节数 判断接收字典的字节
dic_json = dic_json_encode.decode(‘utf-8‘)  #字符串
dic = json.loads(dic_json) #得到字典的原型
total_data = b‘‘
while len(total_data) < dic[‘file_size‘]:#接收的字节数小于数据的字节数式,以每次接收1024的数量进行循环,直至接收完毕
    data = client.recv(1024)
    total_data += data
print(total_data.decode(‘gbk‘))

  

 

粘包的高大上版本

原文:https://www.cnblogs.com/shicongcong0910/p/10421963.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!