/**
* 客户端上传文件流程
* @throws IOException
* 1.(客户端)建立链接
* 2.(客户端)发送文件上传请求报文(4001)
* 3.(服务端)验证身份,发送应答报文(4008)
* 4.(客户端)发送文件数通知报文(4006)
* 5.(服务端)发送应答报文(4008)
* 6. (客户端)发送文件信息通知报文(4003)
* 7.(服务端)发送断点通知报文(4005)
* 8.(客户端)发送数据报文(4004)
* 9.(服务端)发送应答报文(4008)
* 10. 重复8、9,直至文件传输完成
* 11.(客户端)发送文件传输结束报文(4007)
* 12.(服务端)发送应答报文(4008)
* 13. 转第6步,开始下一个文件的传输,如无文件则执行第14步
* 14.(客户端)关闭Socket连接
* 15.(客户端)断开拨号连接
*/
public void filesUpload() {
try{
//1.(客户端)HIClient对象创建时客户端就建立了链接
//2.(客户端)发送文件上传请求报文(4001)
//发送文件上传请求报文(4001)
os.write("0068888800014001 71005103 FFFFFFFF".getBytes());
//3.(服务端)验证了客户端发送过来的请求,并且向客户端发送应答报文(4008)
String str1 = getMessageBody(); //得到应答报文(4008)
//客户端根据应答报文判断请求是否成功
if(str1 != null && pdResMessage(str1)){
System.out.println("连接成功,发送上传文件请求成功,响应码为:" + str1);
int fileCounts = getFileCounts(); //得到目标文件夹下文件的数量
System.out.println("需要上传文件个数 :" + fileCounts);
//4.(客户端)向服务器发送文件数通知报文(4006)
//拼接文件数通知报文(4006)
String reqMessageCount = "0016888800014006" + addZeroForNum(fileCounts, 4);
os.write(reqMessageCount.getBytes());
//5.(服务端)向客户端发送应答报文(通知客户端:服务器是否接收到文件数报文)
String str2 = getMessageBody(); //得到文件通知数报文响应(4008)
//判断文件数是否接受成功
if(str2 != null && pdResMessage(str2)){
//如果文件通知数有响应,并且目标文件夹下文件数大于0,则循环发送文件
//直到文件发送完毕,终止循环
System.out.println("发送文件数请求成功,响应码为 :" + str2);
if(fileCounts > 0){
while(true){
//文件是否传输完成
if(getFileCounts() == 0){
System.out.println("文件已全部传输完毕!");
break;
}
//得到所要传送的文件是哪个文件,文件名是什么。
File file = new File(getUpLoadFilePath());
File[] f = file.listFiles(); //得到目标文件夹下的所有文件
String fileName = f[0].getName(); //得到第一个文件的名字
//System.out.println("");
//得到此文件的长度
long fileLength = getFileLength(file + File.separator + fileName);
//6.(客户端)向服务器发送要传输的文件信息
//拼接发送文件信息通知报文(4003)
String reqMessageHead = "0120888800014003" +
addZeroForString(fileName, 50) + setSpace(48) +
addZeroForNum(fileLength, 10);
os.write(reqMessageHead.getBytes());
//7.(服务端)向客户端发送断点通知报文(主要告知客户端文件传输到什么地方中断了)(4005)
//得到断点通知报文(4005)
String cutMes = getMessageBody();
if(cutMes != null && pdResMessage(cutMes)){
System.out.println("发送文件信息请求成功,响应断点信息为: " + cutMes);
//解析4005得到断点信息
long resMesLength = Integer.parseInt(cutMes.substring(cutMes.length()
- 10, cutMes.length()));
File file1 = new File(file + File.separator + fileName);
//创建随机读取文件类,使指针指向断点位置
RandomAccessFile raf = new RandomAccessFile(file1, "r");
raf.seek(resMesLength);
long fCountLen = file1.length(); //文件的总长度
int finaFileCountLen = (int) (fCountLen - resMesLength); //得到文件最终发送长度
//每包数据发送1024个字节,判断文件长度是否需要分包传输
int packCount = finaFileCountLen/1024;
int pc = finaFileCountLen%1024;
//如果最终长度小于1024,则不需分包发送
//直接拼接数据文件尾报文进行发送
if(packCount < 1){
byte[] b1 = new byte[1024];
int len = raf.read(b1);
String str3 = new String(b1,0,len);
int messageLen = str3.length() + 13;
//8.(客户端)客户端从传输文件初始开始位置或者传输文件断点位置开始发送报文(4004)
//拼接并发送数据尾报文(4004)
String reqMessageData = addZeroForNum(messageLen, 4)
+ "8888000140041" + str3;
// System.out.println("发送的数据报文为:" + reqMessageData);
os.write(reqMessageData.getBytes());
//9.(服务端)向客户端发送传输文件接收是否成功发送应答报文(4008)
String str4 = getMessageBody();
if(str4 != null && pdResMessage(str4)){
// System.out.println("发送数据响应成功,响应码为 :" + str4);
//发送文件传输结束报文(4007)
//11.(客户端)向服务器发送文件传输结束报文表示此次文件传输完成(4007)
os.write("0020000000014007**TEOF**".getBytes());
// System.out.println("发送结束报文为:0020000000014007**TEOF**");
String str5 = getMessageBody();
//得到文件传输结束报文响应
if(str5 != null && pdResMessage(str5)){
System.out.println(fileName + "文件传输成功!");
raf.close(); //关闭随机读取流
setFileGotoAppointAddress(file1); //把传输过的文件放到指定的文件夹下
}else{
System.out.println("文件传输结束请求失败!!!");
return;
}
}else{
System.out.println("发送数据响应失败!!!");
return;
}
//如果文件最终长度大于1024,则需要分包循环发送
}else{
//如果分包之后最后一包数据不为1024个字节,则循环发送报文数据,直到读取发送数据
//小于1024字节时,则为最后一包数据,拼接尾报文
if(pc != 0){
while(true){
byte[] b2 = new byte[1024];
int len = raf.read(b2);
String str6 = new String(b2,0,len);
int dataLen = str6.length() + 13;
//拼接发送数据的报文(4004)
if(dataLen < 1037){
//拼接最后一包数据报文(4004)
String reqMessageData1 = addZeroForNum(dataLen, 4)
+ "8888000140041" + str6;
os.write(reqMessageData1.getBytes());
// System.out.println("发送的最后一块数据报文为:" + reqMessageData1);
String str8 = getMessageBody();
if(str8 != null && pdResMessage(str8)){
// System.out.println("最后一块数据报文请求成功,响应码为 :" + str8);
// 发送文件传输结束报文
os.write("0020888800014007**TEOF**".getBytes());
// System.out.println("文件传输结束报文:0020888800014007**TEOF**");
String str9 = getMessageBody();
if(str9 != null && pdResMessage(str9)){
System.out.println(fileName + "文件传输成功!");
}else{
System.out.println("传输结束报文请求失败!!!");
return;
}
}else{
System.out.println("最后一块数据报文请求失败!!!");
return;
}
raf.close(); //关闭资源
setFileGotoAppointAddress(file1); //把传输过的文件放到指定的文件夹下
break; //跳出循环
}else{
String reqMessageData = addZeroForNum(dataLen, 4)
+ "8888000140040" + str6;
os.write(reqMessageData.getBytes());
// System.out.println("发送的数据报文为:" + reqMessageData);
String str7 = getMessageBody();
if(str7 != null && pdResMessage(str7)){
// System.out.println("发送数据报文请求成功,响应码:" + str7);
}else{
System.out.println("发送数据报文请求失败!!!");
return;
}
}
}
//如分包之后最后一包数据也是1024长度,则循环发送数据报文,直到循环的次数
//等于包的数量时,则表示是最后一包,拼接尾报文
}else{
for(int i = 1; i <= packCount;i++){
byte[] b3 = new byte[1024];
int len = raf.read(b3);
String str6 = new String(b3,0,len);
int dataLen = str6.length() + 13;
if(i == packCount){
//拼接最后一包数据报文(4004)
String reqMessageData1 = addZeroForNum(dataLen, 4)
+ "8888000140041" + str6;
os.write(reqMessageData1.getBytes());
// System.out.println("发送的最后一块数据报文为:" + reqMessageData1);
String str8 = getMessageBody();
if(str8 != null && pdResMessage(str8)){
// System.out.println("最后一块数据报文请求成功,响应码为 :" + str8);
// 发送文件传输结束报文
os.write("0020888800014007**TEOF**".getBytes());
// System.out.println("文件传输结束报文:0020888800014007**TEOF**");
String str9 = getMessageBody();
if(str9 != null && pdResMessage(str9)){
System.out.println(fileName + "文件传输成功!");
}else{
System.out.println("传输结束报文请求失败!!!");
return;
}
}else{
System.out.println("最后一块数据报文请求失败!!!");
return;
}
raf.close(); //关闭资源
setFileGotoAppointAddress(file1); //把传输过的文件放到指定的文件夹下
break; //跳出循环
}
else{
String reqMessageData = addZeroForNum(dataLen, 4)
+ "8888000140040" + str6;
os.write(reqMessageData.getBytes());
// System.out.println("发送的数据报文为:" + reqMessageData);
String str7 = getMessageBody();
if(str7 != null && pdResMessage(str7)){
// System.out.println("发送数据报文请求成功,响应码:" + str7);
}else{
System.out.println("发送数据报文请求失败!!!");
return;
}
}
}
}
}
}else{
System.out.println("发送文件信息请求失败!!!");
return;
}
}
}else{
System.out.println("没有文件需要上传!!!");
os.close();
is.close();
client.close();
}
}else{
System.out.println("发送文件数请求失败!!!");
return;
}
}else{
System.out.println("文件上传请求失败!!!");
return;
}
}catch(IOException e){
e.printStackTrace();
}finally{
try {
if(os != null){
os.close();
}
if(is != null){
is.close();
}
if(client != null){
client.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端上传文件流程
猜你喜欢
转载自blog.csdn.net/sinat_27674731/article/details/113740101
今日推荐
周排行