使用json协议传输二进制文件
来源:互联网 发布:零售超市收银软件 编辑:程序博客网 时间:2024/05/01 04:39
前几天,项目中需要在socket中传输二进制文件.
这本来是很简单的事,因为我们知道socket传输的就是字节流.所以非常简单.
java的实现:
Java代码
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class FileReceive {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(8800);
System.out.println("server started!");
while (true) {
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
FileOutputStream fileOutputStream = new FileOutputStream("d:/b.png");
int i;
while ((i = inputStream.read()) != -1) {
fileOutputStream.write(i);
}
fileOutputStream.flush();
fileOutputStream.close();
inputStream.close();
serverSocket.close();
break;
}
}
}
import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.Socket;
public class FileSend {
public static void main(String[] args) throws Exception {
// 打开文件流
FileInputStream fileInputStream = new FileInputStream("d:/a.png");
Socket socket = new Socket("127.0.0.1", 8800);
OutputStream outputStream = socket.getOutputStream();
int i;
// 读取并写入socket
while ((i = fileInputStream.read()) != -1) {
outputStream.write(i);
}
// 结束
outputStream.flush();
socket.close();
}
}
测试的时候先运行FileReceive,再运行FileSend
这样你就能看到在D:/下有一个文件是"b.png".跟原来的一模一样.代表传输成功!
不过我们的项目有个要求,需要用json的协议来传输.
我们都知道json是文本格式.所以我马上想到的是把文件编码成文本,再进行传输.
所以关键就是要把一个二进制文件翻译成文本,再翻译回去.如果可以,也就代表这个方案是可行的.
马上我就写出了第一个版本:
Java代码
// 读取文件
FileInputStream fileInputStream = new FileInputStream("d:/a.png");
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
int i;
while ((i = fileInputStream.read()) != -1) {
byteArrayOutputStream.write(i);
}
fileInputStream.close();
// 把文件存在一个字节数组中
byte[] filea = byteArrayOutputStream.toByteArray();
byteArrayOutputStream.close();
String fileaString = new String(filea);
System.out.println(fileaString);
// 写入文件
FileOutputStream fileOutputStream = new FileOutputStream("d:/b.png");
fileOutputStream.write(fileaString.getBytes());
fileOutputStream.flush();
fileOutputStream.close();
发现b.png根本无法打开,很是奇怪?而且大小也不一样了.
检查代码后发现把数组转化成string的时候后面还可以加个参数charset[编码名称].
于是马上改了一下:
.......
String fileaString = new String(filea,"uft-8");
.......
fileOutputStream.write(fileaString.getBytes("utf-8"));
结果还是不行,又改了一下:
.......
String fileaString = new String(filea,"ISO-8859-1");
.......
fileOutputStream.write(fileaString.getBytes("ISO-8859-1"));
结果成功了.
结合以前的编码知识,总算是想明白了.
把字节数组转换成字符串时,如果charset为空,那就表示用你的默认编码进行转换.
而不管gb2312和utf8都不是用单字节表示一个字符的.只要他不认识的,他就会默认转换成一个特定字符,所以这样的转换是不可逆的.
只有像ascii这样的单字节编码的转换才是可逆的.
明白了这个道理.我们就可以用json协议来传任何的数据了
这本来是很简单的事,因为我们知道socket传输的就是字节流.所以非常简单.
java的实现:
Java代码
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class FileReceive {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(8800);
System.out.println("server started!");
while (true) {
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
FileOutputStream fileOutputStream = new FileOutputStream("d:/b.png");
int i;
while ((i = inputStream.read()) != -1) {
fileOutputStream.write(i);
}
fileOutputStream.flush();
fileOutputStream.close();
inputStream.close();
serverSocket.close();
break;
}
}
}
import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.Socket;
public class FileSend {
public static void main(String[] args) throws Exception {
// 打开文件流
FileInputStream fileInputStream = new FileInputStream("d:/a.png");
Socket socket = new Socket("127.0.0.1", 8800);
OutputStream outputStream = socket.getOutputStream();
int i;
// 读取并写入socket
while ((i = fileInputStream.read()) != -1) {
outputStream.write(i);
}
// 结束
outputStream.flush();
socket.close();
}
}
import java.io.FileOutputStream;import java.io.InputStream;import java.net.ServerSocket;import java.net.Socket;public class FileReceive {public static void main(String[] args) throws Exception {ServerSocket serverSocket = new ServerSocket(8800);System.out.println("server started!");while (true) {Socket socket = serverSocket.accept();InputStream inputStream = socket.getInputStream();FileOutputStream fileOutputStream = new FileOutputStream("d:/b.png");int i;while ((i = inputStream.read()) != -1) {fileOutputStream.write(i);}fileOutputStream.flush();fileOutputStream.close();inputStream.close();serverSocket.close();break;}}}import java.io.FileInputStream;import java.io.OutputStream;import java.net.Socket;public class FileSend {public static void main(String[] args) throws Exception {// 打开文件流FileInputStream fileInputStream = new FileInputStream("d:/a.png");Socket socket = new Socket("127.0.0.1", 8800);OutputStream outputStream = socket.getOutputStream();int i;// 读取并写入socketwhile ((i = fileInputStream.read()) != -1) {outputStream.write(i);}// 结束outputStream.flush();socket.close();}}
测试的时候先运行FileReceive,再运行FileSend
这样你就能看到在D:/下有一个文件是"b.png".跟原来的一模一样.代表传输成功!
不过我们的项目有个要求,需要用json的协议来传输.
我们都知道json是文本格式.所以我马上想到的是把文件编码成文本,再进行传输.
所以关键就是要把一个二进制文件翻译成文本,再翻译回去.如果可以,也就代表这个方案是可行的.
马上我就写出了第一个版本:
Java代码
// 读取文件
FileInputStream fileInputStream = new FileInputStream("d:/a.png");
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
int i;
while ((i = fileInputStream.read()) != -1) {
byteArrayOutputStream.write(i);
}
fileInputStream.close();
// 把文件存在一个字节数组中
byte[] filea = byteArrayOutputStream.toByteArray();
byteArrayOutputStream.close();
String fileaString = new String(filea);
System.out.println(fileaString);
// 写入文件
FileOutputStream fileOutputStream = new FileOutputStream("d:/b.png");
fileOutputStream.write(fileaString.getBytes());
fileOutputStream.flush();
fileOutputStream.close();
// 读取文件FileInputStream fileInputStream = new FileInputStream("d:/a.png");ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();int i;while ((i = fileInputStream.read()) != -1) {byteArrayOutputStream.write(i);}fileInputStream.close();// 把文件存在一个字节数组中byte[] filea = byteArrayOutputStream.toByteArray();byteArrayOutputStream.close();String fileaString = new String(filea);System.out.println(fileaString);// 写入文件FileOutputStream fileOutputStream = new FileOutputStream("d:/b.png");fileOutputStream.write(fileaString.getBytes());fileOutputStream.flush();fileOutputStream.close();
发现b.png根本无法打开,很是奇怪?而且大小也不一样了.
检查代码后发现把数组转化成string的时候后面还可以加个参数charset[编码名称].
于是马上改了一下:
.......
String fileaString = new String(filea,"uft-8");
.......
fileOutputStream.write(fileaString.getBytes("utf-8"));
结果还是不行,又改了一下:
.......
String fileaString = new String(filea,"ISO-8859-1");
.......
fileOutputStream.write(fileaString.getBytes("ISO-8859-1"));
结果成功了.
结合以前的编码知识,总算是想明白了.
把字节数组转换成字符串时,如果charset为空,那就表示用你的默认编码进行转换.
而不管gb2312和utf8都不是用单字节表示一个字符的.只要他不认识的,他就会默认转换成一个特定字符,所以这样的转换是不可逆的.
只有像ascii这样的单字节编码的转换才是可逆的.
明白了这个道理.我们就可以用json协议来传任何的数据了
0 0
- 使用json协议传输二进制文件
- 有关使用HTTP协议传输二进制文件
- JSON网络传输协议
- TCP传输协议使用
- 使用json传输数组实例
- thrift使用传输协议TCompactProtocol
- 流媒体使用的传输协议
- carchive网络传输二进制文件
- Axis2(4):二进制文件传输
- webservice二进制文件传输
- adb 传输二进制文件
- App网络传输协议(Json、XML、protobuf)
- 用透过数据库传输二进制文件
- 使用 JSON 进行数据的异步传输
- 要使用json来传输数据
- AJAX - 使用JSON传输复杂数据
- 使用json往返传输数据 post方法
- 使用 JSON 进行数据的异步传输
- 回溯求幂集算法
- Programming Clojure笔记之二——探索Clojure
- 形态学操作
- android ListView 添加 HeaderView 和 FooterView时 不可选择点击
- [python] 优雅的操作字典
- 使用json协议传输二进制文件
- Android常用控件:ListView(2)
- mysql常用函数小结
- 原码, 反码, 补码 详解
- Java 并发工具包 java.util.concurrent 大全
- 大数据的处理方法<一>
- MongoDB简介
- AngularJs ui-router 路由的简单介绍
- 【HUSTOJ】1014: 三个数比大小