zoukankan      html  css  js  c++  java
  • 粘包的高大上版本

    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'))
    

      

  • 相关阅读:
    记录一些css奇淫技巧
    git的一些常用基础命令
    # 实现二维表格行头和列头固定的解决方案
    拿来-util工具函数
    mpvue开发小程序项目遇到的问题
    mac设置终端命令行别名alias(git、npm)
    简单配置nginx反向代理,实现跨域请求
    以前的阅读计划搁浅了,这里是分割线
    源码阅读心得11-13
    源码阅读心得1-10
  • 原文地址:https://www.cnblogs.com/shicongcong0910/p/10421963.html
Copyright © 2011-2022 走看看