image.png
image.png
注意事项:
在读取网络套接字的时候,由于网络状况的原因,每次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;
}
}