json 二进制传输方案

json 传输二进制数组方案

json 是一种很简洁的协议,但可惜的是,它只能传递基本的数型(int,long,string等),但不能传递byte类型。如果想要传输图片等二进制文件的话,是没办法直接传输。

本文提供一种思路给大家参考,让大家可以在json传输二进制文件,如果大家有这个需求又不知怎么实现的话,也许本文能够帮到你。思想适用于所有语言,本文以java实现,相信大家很容易就能转化为自己懂得语言。

思路

1. 读取二进制文件到内存

2. 用Gzip压缩一下。毕竟是在网络传输嘛,当然你也可以不压缩。

3. 用Base64 把byte[] 转成字符串

补充:什么是Base64

Base64是一种编码方式,它可以将8位的非英语字符转化为7位的ASCII字符。这样的初衷,是为了满足电子邮件中不能直接使用非ASCII码字符的规定,但是也有其他重要的意义:

a)所有的二进制文件,都可以因此转化为可打印的文本编码,使用文本软件进行编辑;

b)能够对文本进行简单的加密。

实现

主要思路就是以上3步,把字符串添加到json字段后发给服务端,然后服务器再用Base64解密–>Gzip解压,就能得到原始的二进制文件了。是不是很简单呢?说了不少,下面我们来看看具体的代码实现。

***注:Java SE是没办法直接用Base64的哦,必须要先自己去下载一份。但Android已经集成了Base64,因此大家可以直接在Android使用。


/**
* @author xing
*/
public class TestBase64 {
public static void main(String[] args) {
byte[] data = compress(loadFile());


String json = new String(Base64.encodeBase64(data));
System.out.println("data length:" + json.length());
}

/**
* 加载本地文件,并转换为byte数组
* @return
*/
public static byte[] loadFile() {
File file = new File("d:/11.jpg");


FileInputStream fis = null;
ByteArrayOutputStream baos = null;
byte[] data = null ;


try {
fis = new FileInputStream(file);
baos = new ByteArrayOutputStream((int) file.length());


byte[] buffer = new byte[1024];
int len = -1;
while ((len = fis.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}

data = baos.toByteArray() ;


} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fis != null) {
fis.close();
fis = null;
}

baos.close() ;
} catch (IOException e) {
e.printStackTrace();
}
}

return data ;
}

/**
* 对byte[]进行压缩
*
* @param 要压缩的数据
* @return 压缩后的数据
*/
public static byte[] compress(byte[] data) {
System.out.println("before:" + data.length);

GZIPOutputStream gzip = null ;
ByteArrayOutputStream baos = null ;
byte[] newData = null ;

try {
baos = new ByteArrayOutputStream() ;
gzip = new GZIPOutputStream(baos);

gzip.write(data);
gzip.finish();
gzip.flush();

newData = baos.toByteArray() ;
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
gzip.close();
baos.close() ;
} catch (IOException e) {
e.printStackTrace();
}
}

System.out.println("after:" + newData.length);
return newData ;
}
}

 

最后输出了一下字符串长度,大家也许觉得经过压缩也没降低多少体积嘛。但大家可以试试不用gzip,你会发现经过转换的字符串比原来大多了。没办法,这是由Base64的算法决定的。所以嘛,还是压缩一下好。

本文所使用的方法比较简单,大家如果有更好或者觉得有更好的方式,不妨一起探讨一下。

时间: 2024-08-03 12:09:36

json 二进制传输方案的相关文章

【转】android实时视频网络传输方案总结(一共有五套)

最近研究了Android的实时视频网络传输问题,在视频处理方面花费了大量精力进行研究,总结出以下五套方案,并加以比较 以320×240大小的视频传输为例 方案 压缩率 压缩/传输方式 实时性 平均流量消耗  传输距离 用camera的回调函数发送原始的yuv420数据 0 无压缩,按帧传输 高(20~30 fps) 很高(6.5 Mbps)太恐怖了O_O  近距离有线或无线 用MediaRecorder对yuv420进行H264硬编码后发送 高(95%) 帧间压缩,视频流传输 高(20 fps)

Android客户端与服务端(jsp)之间json的传输与解析【附效果图附源码】

最近有个项目需要用到json的传输,之前不是太了解,在网上找了些相关资料,写了一个小小的demo,可以实现基本功能:android客户端发送json到服务端,服务端使用jsp接收,解析后以json的形式返回给客户端,客户端接收打印,先看看运行的效果截图,源码会在文章的末尾给出. 1.服务端:接收到json后解析打印,然后发送json到客户端 2.客户端,收到服务端返回的json后打印 简单的介绍下源码: 服务端使用json.jsp来接收解析客户端传过来的json,json的解析需要使用lib目录

JsonSockketTcp套接字 for qt(json数据流传输层)

主要处理tcp的json数据流,解析和除错json数据流,继承与 qtcpsocket层,方便扩展 数据流格式: #ifndef CONFIGTCPSOCKET_H #define CONFIGTCPSOCKET_H #include <QTcpSocket> #include <QJsonDocument> class JsonTcpSocket : public QTcpSocket { Q_OBJECT public: explicit JsonTcpSocket(QObje

Androidclient与服务端(jsp)之间json的传输与解析【附效果图附源代码】

近期有个项目须要用到json的传输,之前不是太了解,在网上找了些相关资料,写了一个小小的demo,能够实现基本功能:androidclient发送json到服务端,服务端使用jsp接收,解析后以json的形式返回给client,client接收打印,先看看执行的效果截图,源代码会在文章的末尾给出. 1.服务端:接收到json后解析打印,然后发送json到client 2.client,收到服务端返回的json后打印 简单的介绍下源代码: 服务端使用json.jsp来接收解析client传过来的j

Oracle MFT 12c 快速、灵活的企业文件传输方案

已有文件传输方案的问题 因为丢失或者更糟的情况,暴露了合作伙伴的敏感文件,对企业的业务造成影响? 大文件阻塞了系统,使关键业务流程运行缓慢? 现有的文件传输解决方案经常会造成文件的丢失或损坏? 能否追踪到哪一个部门.合作伙伴或者员工使用了最多的资源? 现有的工具是否难于诊断文件传输的问题? 在构建.监控和维护文件传输时,是否受制于现有的资源? 产品概览 即使在当今动态的.面向事件的业务环境当中,对各类文件进行没有大小限制的高效传输都是任何集成策略的核心内容.通过一个统一的.可靠的受管文件传输解决

探讨HTTP中敏感数据的安全性传输方案

通用信息 文档介绍:本文档是为了探讨提高http中的敏感数据如密码等的安全性传输方案. 修订历史:1.0 方案探讨 方案1:应用Base64 方案介绍:发送端在发送敏感数据之前,先用Base64对其进行编码,再将编码后的值传输给接收端.收端接收到该值后,用Base64对其进行解码,便可读到敏感数据的内容. 优点:Base64算法复杂度低,所以计算效率会比较高,编码后的长度增加也较少. 缺点:为了保证Webpage端的JavaScript和Webserver端的c代码能够互相编码和解码,就要求Ba

二进制传输与文本传输的区别

Ftp,winscp等工具下载文件时候有选项,可选的有二进制方式和文本方式.文本方式又称为ASCII方式 两者区别如下. ASCII 方式和BINARY方式的区别是回车换行的处理,binary方式不对数据执行任何处理,ASCII 方式将回车换行转换为本机的回车字符,比如Unix下 是\n,Windows下是\r\n,Mac下是\r ASCII 方式下会转换文件,不一样的系统有不一样的行完毕符,unix系统下行完毕符是一个字节,即十六进制的0A,而ms的系统是两个字节,即十六进制的0D0A所以当你

二进制传输和文本传输的区别

ftp,securecrt,winscp等工具下载文件时候有选项,可选的有二进制方式和文本方式,文本方式又称为ascii方式 ascii方式和binary方式的区别是回车换行的处理,binary方式不对数据执行任何处理,ascii方式将回车换行转换为本机的回车字符,比如unix下是\n,windows下是\r\n,mac下是\r ascii方式下会转换文件,不一样的系统有不一样的行完毕符, unix系统下行完毕符是一个字节,即十六进制的0A,而ms的系统是两个字节,即十六进制的0D0A所以当你用

TCG开发日志(6)Koa-body与Json的传输

在服务端和客户端之间用http的方式传递json时,现在可以在客户端用fetch发起请求: var datas = { foo:1, bar:2 } var ret = await fetch('/api/', { method: 'POST', headers:{ 'Content-Type' : 'application/json' }, body:JSON.stringify(datas) }); 本来在fetch后的URL中应该填写localhost:3000/api的,但是在本地调试出