文件传输的样例(使用DataOutputStream ):
https://blog.csdn.net/u010154380/article/details/78710840
注意事项:
在读取网络套接字的时候,由于网络状况的原因,每次read的字节数很可能不是write的字节数,需要多次read。(解决AES解密失败)
示例代码:
// 客户端发送文件,服务器接收文件
dis = new DataInputStream(socket.getInputStream());
String toName = dis.readUTF();
String fileName = dis.readUTF();
File dir = new File(baseStorePath + File.separatorChar + toName);
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(dir.getAbsolutePath() + File.separatorChar + fileName);
fos = new FileOutputStream(file);
while(true) {
long len = 0;
try {
len = dis.readLong();// 文件总长度,从对端发送过来
} catch (Exception e) {
// e.printStackTrace();
break;
}
if (len > 0) {
byte[] data = new byte[(int) len];
int readNum = 0;
// 由于网络原因,一次read很可能没有读取所有内容,
// 如果不加这个while循环容易导致解密失败。
while(readNum < len) {
readNum += dis.read(data, readNum, (int)(len-readNum));
}
String dataString = new String(data, "utf-8");
String deString = AESUtils.decrypt(dataString, client.getShareKey());
byte[] deData = Base64Utils.decode(deString);
fos.write(deData, 0, deData.length);
fos.flush();
}else {
break;
}
}
具体参考:
https://blog.csdn.net/nightcurtis/article/details/51324105
https://blog.csdn.net/lmb55/article/details/79511007
Java 的字节流文件读取(一)
https://www.cnblogs.com/yangming1996/p/9046178.html
网友评论