?? client_get.java
字號(hào):
/**
*協(xié)議的Client_Get狀態(tài).
*/
import java.util.Timer;
import java.io.FileInputStream;
public class Client_Get extends State {
public static FileIOClass myfile;//將要存儲(chǔ)的文件名
public static ComClass Com; //用于傳輸
Timer timer = new Timer(false);
State doIt() {
String addr, file;
SimpleIO input = new SimpleIO(System.in);
System.out.println("請(qǐng)輸入文件名:\n");
file = input.readString();
System.out.println("請(qǐng)輸入服務(wù)器IP:\n");
addr = input.readString();
Com = new ComClass(5555);
FileIOClass myfile = new FileIOClass();
byte filemode = myfile.createFile(file+".n"); //創(chuàng)建一個(gè)新的文件
if(filemode==FileIOClass.already_exists||
filemode==FileIOClass.create_failed) { //打開(kāi)不成功則返回Client_Put狀態(tài)
this.next_state = new Client_Get(); ///???
return this.next_state;
}
Com.writeOtherSiteAddress(addr); //記下服務(wù)器IP
byte num = 1 ;
RWDelayClass Rdelay = new RWDelayClass(file);//發(fā)送RRQ的任務(wù)線程
Rdelay.start();
byte[] revbuf = Com.receivePacket() ;
//如果不是DATA包或者對(duì)方相應(yīng)的序號(hào)錯(cuò)
while(revbuf[1]!=PacketCode.DATA ||revbuf[3]!=num) {
System.out.println("收到了錯(cuò)誤的DATA包,保持等待!");
revbuf = Com.receivePacket() ;
}
Rdelay.task.cancel();//取消任務(wù)
timer.purge(); //移除任務(wù)
myfile.writeToFile(revbuf);
boolean endsLoop = false;
while( endsLoop == false) {
ACKDelayClass ACKdelay = new ACKDelayClass(num);//發(fā)送ACK的任務(wù)線程
ACKdelay.start() ;
if(num == 125) {
num = 0 ;
}
revbuf = Com.receivePacket();
while(revbuf[1]!=PacketCode.DATA||revbuf[3]!=num+(byte)1) {
System.out.println("收到了錯(cuò)誤的DATA的包,保持等待!");
revbuf = Com.receivePacket() ;
}
ACKdelay.task.cancel();
timer.purge();
myfile.writeToFile(revbuf);
num += 1;
if(revbuf[515] == 1) { //如果是最后一個(gè)包
endsLoop = true ;
myfile.endWrite() ;
}
}
System.out.print("發(fā)送最后一個(gè)ACK包:");
Com.sendPacketACK((byte)0,num);
Com.closeSocket();
this.next_state = new Idle();
return this.next_state;
}
//發(fā)送讀請(qǐng)求包的線程
public class RWDelayClass extends java.lang.Thread {
String filename ;
RWResendClass task ;
public RWDelayClass(String filename) {
this.filename = filename ;
task = new RWResendClass(filename);
}
public void run() {
timer.schedule(task,0 ,2000);
}
}
//超時(shí)重發(fā)讀請(qǐng)求包的線程
public class RWResendClass extends java.util.TimerTask {
String filename ;
final long time = System.currentTimeMillis();//date.getTime();
public RWResendClass(String filename) {
this.filename = filename ;
}
public void run() {
Client_Get.Com.sendPacketRW(filename,(byte)0,PacketCode.RRQ); //發(fā)送數(shù)據(jù)報(bào)
if (System.currentTimeMillis() - time >= 10000) {
this.cancel();
timer.purge();
System.out.println("等待超時(shí)!");
System.exit(0);
}
}
}
//發(fā)送ACK的線程
public class ACKDelayClass extends java.lang.Thread {
byte num ;
ACKResendClass task ;
public ACKDelayClass(byte num) {
this.num = num ;
task = new ACKResendClass(num);
}
public void run() {
timer.schedule(task,0 ,2000);
}
}
//超時(shí)重發(fā)ACK包的線程
public class ACKResendClass extends java.util.TimerTask {
byte num ;
final long time = System.currentTimeMillis();//date.getTime();
public ACKResendClass(byte num) {
this.num = num ;
}
public void run() {
Client_Get.Com.sendPacketACK((byte)0,num); //發(fā)送數(shù)據(jù)報(bào)
if (System.currentTimeMillis() - time >= 10000) {
this.cancel();
timer.purge();
System.out.println("等待超時(shí)!");
System.exit(0);
}
}
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -