80,353
社区成员
发帖
与我相关
我的任务
分享
public void send() {
new Thread(new Runnable() {
@Override
public void run() {
try {
OutputStream outputStream = mSocket.getOutputStream();
InputStream inputStream = mSocket.getInputStream();
//将文件名和文件大小发送给接收端
outputStream.write(getHeaderString(mHeader).getBytes(UTF_8));
outputStream.flush();
sendMessage(mHandler, 10, "已发送文件名和文件大小");
byte[] startData = new byte[buf_size];
int len = inputStream.read(startData);
if(len != -1) {
String start = new String(startData, 0, len);
if(start.equals("start")) {
for(FileInfo fileInfo : mHeader.getFileInfos()) {
int sentLen = 0;
byte[] sendData = new byte[file_buf_size];
long totalSize = fileInfo.getFileLength();
InputStream fileInputStream = new FileInputStream(new File(fileInfo.getFileName()));
sendMessage(mHandler, 10, "正在发送: " + fileInfo.getFileName());
while ((len = fileInputStream.read(sendData)) != -1) {
outputStream.write(sendData, 0, len);
sentLen += len;
int progress = (int) (sentLen * 100 / totalSize);
L.error("文件(" + fileInfo.getFileName() + ") 总大小: " + totalSize + " 已接收文件(" + progress + "): " + sentLen);
}
fileInputStream.close();
}
outputStream.close();
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
L.error("FileNotFoundException: " + e.getMessage());
} catch (IOException e) {
e.printStackTrace();
L.error("IOException: " + e.getMessage());
} finally {
try {
mSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
sendMessage(mHandler, 10, "发送完成");
}
}
}).start();
}
public void receive() {
new Thread(new Runnable() {
@Override
public void run() {
//是否全部接收完毕
boolean isFinish = false;
if (mSocket != null) {
try {
final InputStream is = mSocket.getInputStream();
OutputStream os = mSocket.getOutputStream();
//获取文件名和文件大小
byte[] headerData = new byte[buf_size];
int len = is.read(headerData);
if (len != -1) {
Header header = getHeader(new String(headerData, 0, len, UTF_8));
if (header != null && header.getFileInfos() != null && header.getFileInfos().size() > 0) {
sendMessage(mHandler, ReceiverActivity.INIT_ADAPTER, header.getFileInfos());
//告知发送端开始发送
os.write("start".getBytes(UTF_8));
os.flush();
//准备接收
String fileDir = FileUtils.getReceiveFilesPath();
for (int i = 0; i < header.getFileTotalCount(); i++) {
FileInfo fileInfo = header.getFileInfos().get(i);
String filename = fileInfo.getFileName();
long totalSize = fileInfo.getFileLength();
sendMessage(mHandler, 10, "准备接收: 文件名: " + filename + " 文件大小: " + totalSize);
//如果文件不存在,创建它
File file = new File(fileDir + filename);
if (!file.exists()) {
file.getParentFile().mkdirs();
file.createNewFile();
}
DataOutputStream dos = new DataOutputStream(new FileOutputStream(file));
byte[] recvData = new byte[file_buf_size];
int receiveLen = 0;
while ((len = is.read(recvData)) != -1) {
dos.write(recvData, 0, len);
receiveLen += len;
int progress = (int) (receiveLen * 100 / totalSize);
sendMessage(mHandler, ReceiverActivity.REFRESH_PROGRESS, i, progress);
L.error("文件(" + filename + ") 总大小: " + totalSize + " 已接收文件(" + progress + "): " + receiveLen);
if(progress == 100) {
break;
}
}
//文件大小不一致
if (receiveLen != totalSize) {
sendMessage(mHandler, 10, "文件大小不一致");
}
dos.flush();
dos.close();
}
//全部接收完毕
isFinish = true;
os.close();
is.close();
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
isFinish = false;
sendMessage(mHandler, 10, "接收失败: " + e.getMessage());
} catch (IOException e) {
e.printStackTrace();
isFinish = false;
sendMessage(mHandler, 10, "接收失败: " + e.getMessage());
} finally {
try {
//关闭Socket
mSocket.close();
} catch (IOException e) {
isFinish = false;
e.printStackTrace();
}
if (isFinish) {
sendMessage(mHandler, 10, "全部接收完毕");
} else {
sendMessage(mHandler, 10, "接收出错");
}
}
}
}
}).start();
}