📄 netreceiverthread.java
字号:
package thread.receiver;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import view.receiver.NFR_FileHandleItem;
import CreateFrame.CreateErrorFrame;
import CreateFrame.CreateReceiverFrame;
public class NetReceiverThread extends ReceiverThread {
private CreateReceiverFrame crf = null;
private NFR_FileHandleItem ntr;
private long count;
private long oldCount;
private long tCount;
private long fileSize;
private boolean active = true;
private File rootDir;
private long folderSize;
private long folderCount;
private FileOutputStream fos;
private File saveFile;
public NetReceiverThread(Socket socket) {
super(socket);
this.socket = socket;
}
public void run() {
// String hostName = null, ipAddress = null;
boolean connect = true;
try {
Integer NTRInteger = null;
while (connect) {
cmdList = splitToken(readUTF());
if (equParam(0,"OpenFrame")){
System.out.println("Receive OpenFrame - NetReceiverThread");
if (equParam(1, "v1.3")){
List packageList = this.cmdList.subList(2, cmdList.size());
crf = new CreateReceiverFrame(socket,packageList);
crf.start();
System.out.println("CreateReceiverFrame(socket) - NetReceiverThread");
connect = false;
}
}else if (equParam(0,"PutFile")){
//PutFile|<filePath>|<NTRHandle>|<fileSize>|
String filePath = getParam(1);
NTRInteger = new Integer(getParam(2));
ntr = (NFR_FileHandleItem) ConnectSession.hashNTR.get(NTRInteger);
long fileSize = Long.valueOf(getParam(3)).longValue();
saveFile = new File(filePath);
ReceiveFile(saveFile, fileSize);
if (active) ConnectSession.hashNTR.remove(NTRInteger);
connect = false;
}else if (equParam(0,"PutFolderFile")) {
// PutFolderFile|<SubFolder>|<FileSize>|
saveFile = new File(rootDir, ((String) cmdList.get(1)));
long fileSize = Long.valueOf((String)cmdList.get(2)).longValue();
ReceiveFile1(saveFile,fileSize);
} else if (equParam(0,"PutFolder")){
// PutFolder|<filePath>|<NTRHandle>|
String filePath = getParam(1);
NTRInteger = new Integer(getParam(2));
ntr = (NFR_FileHandleItem) ConnectSession.hashNTR.get(NTRInteger);
rootDir = new File(filePath);
} else if (equParam(0,"CreateFolder")) {
// CreateFolder|<SubFolder>|
rootDir = new File(rootDir, ((String) cmdList.get(1)));
rootDir.mkdir();
} else if (equParam(0,"GoUpFolder")) {
// GoUpFolder|
rootDir = rootDir.getParentFile();
} else if (equParam(0,"FolderInfo")) {
// FolderInfo|NTRHandle
ntr = (NFR_FileHandleItem) ConnectSession.hashNTR.get(new Integer(getParam(1)));
folderSize = ntr.getFileSize();
folderCount = folderSize/0xffff;
tCount = oldCount = folderCount;
} else if (equParam(0,"End")) {
// End|
ntr.display.syncExec(new Runnable() {
public void run() {
if (active){
NetReceiverThread.this.ntr.setProcess(100);
NetReceiverThread.this.ntr.setLinkText("open");
}
// ReceiverSession.this.ntr.setPercent(100);
NetReceiverThread.this.ntr.setSpeed("");
}
});
if (active) ConnectSession.hashNTR.remove(NTRInteger);
connect = false;
}
}
} catch (IOException e) {
try {
if (fos!=null) fos.close();
} catch (IOException e1) {
e1.printStackTrace();
}
if (saveFile!=null) saveFile.delete();
ntr.display.syncExec(new Runnable() {
public void run() {
NetReceiverThread.this.ntr.setSpeed("");
}
});
}finally{
free();
}
}
/*
* 从网络流中读取数据(读取目录中的文件)
* saveFile:读取数据后写入此文件。
* size:文件大小。
*/
private void ReceiveFile1(File saveFile,long size) {
this.fileSize = size;
TimerTask speedTimerTask = new TimerTask(){
public void run() {
ntr.display.syncExec(new Runnable() {
public void run() {
NetReceiverThread.this.ntr.setSpeed((tCount-folderCount)*0xffff/1024/1024+" MB/s");
tCount = folderCount;
}
});
}};
Timer speedTimer = new Timer(true);
speedTimer.schedule(speedTimerTask, 1000,1000);
try {
fos = new FileOutputStream(saveFile);
} catch (FileNotFoundException e) {
CreateErrorFrame thread = new CreateErrorFrame();
thread.setMessage("Can not open file");
thread.start();
e.printStackTrace();
}
byte[] buffer = new byte[0xffff];
count = size / 0xffff;
while ((count) > 0 && active) {
try {
inByte.readFully(buffer);
} catch (IOException e1) {
active = false;
e1.printStackTrace();
}
try {
fos.write(buffer);
} catch (IOException e) {
active = false;
CreateErrorFrame thread = new CreateErrorFrame();
thread.setMessage("Please check free space");
thread.start();
}
ntr.display.syncExec(new Runnable() {
public void run() {
NetReceiverThread.this.ntr
.setProcess((int) (100 - folderCount * 100 / oldCount));
// ReceiverSession.this.ntr
// .setPercent((int) (100 - ReceiverSession.this.folderCount
// * 100 / ReceiverSession.this.oldCount));
NetReceiverThread.this.ntr
.setTransfered((oldCount-folderCount)*0xffff);
}
});
folderCount--;
count--;
yield();
}
speedTimer.cancel();
if (active){
try {
inByte.readFully(buffer, 0, (int) (size % 0xffff));
} catch (IOException e2) {
e2.printStackTrace();
}
try {
fos.write(buffer, 0, (int) (size % 0xffff));
} catch (IOException e1) {
CreateErrorFrame thread = new CreateErrorFrame();
thread.setMessage("Please check free space");
thread.start();
}
}
ntr.display.syncExec(new Runnable() {
public void run() {
NetReceiverThread.this.ntr
.setTransfered((oldCount-folderCount)*0xffff+fileSize%0xffff);
}
});
try {
fos.close();
} catch (IOException e) {
CreateErrorFrame thread = new CreateErrorFrame();
thread.setMessage("Close file failed");
thread.start();
}
buffer = null;
yield();
}
/*
* 从网络流中读取数据(读取单独的文件)
* saveFile:读取数据后写入此文件。
* size:文件大小。
*/
private void ReceiveFile(File saveFile, long size) {
this.fileSize = size;
TimerTask speedTimerTask = new TimerTask(){
public void run() {
ntr.display.syncExec(new Runnable() {
public void run() {
NetReceiverThread.this.ntr.setSpeed((tCount-count)*0xffff/1024/1024+" MB/s");
tCount = count;
}
});
}};
Timer speedTimer = new Timer(true);
speedTimer.schedule(speedTimerTask, 1000,1000);
// speedTimer.scheduleAtFixedRate(speedTimerTask, 3, 1000);
try {
fos = new FileOutputStream(saveFile);
} catch (FileNotFoundException e) {
CreateErrorFrame thread = new CreateErrorFrame();
thread.setMessage("Can not open file");
thread.start();
e.printStackTrace();
}
byte[] buffer = new byte[0xffff];
tCount = oldCount =count = size / 0xffff;
while ((count) > 0&& active) {
try {
inByte.readFully(buffer);
} catch (IOException e1) {
active = false;
e1.printStackTrace();
}
try {
fos.write(buffer);
} catch (IOException e) {
active = false;
CreateErrorFrame thread = new CreateErrorFrame();
thread.setMessage("Please check free space");
thread.start();
}
ntr.display.syncExec(new Runnable() {
public void run() {
NetReceiverThread.this.ntr
.setProcess((int) (100 - count * 100 / oldCount));
NetReceiverThread.this.ntr
.setTransfered((oldCount-count)*0xffff);
}
});
count--;
yield();
}
speedTimer.cancel();
if (active){
try {
inByte.readFully(buffer, 0, (int) (size % 0xffff));
} catch (IOException e2) {
e2.printStackTrace();
}
try {
fos.write(buffer, 0, (int) (size % 0xffff));
} catch (IOException e1) {
CreateErrorFrame thread = new CreateErrorFrame();
thread.setMessage("Please check free space");
thread.start();
}
}
try {
fos.close();
} catch (IOException e) {
CreateErrorFrame thread = new CreateErrorFrame();
thread.setMessage("Close file failed");
thread.start();
}
ntr.display.syncExec(new Runnable() {
public void run() {
NetReceiverThread.this.ntr.setSpeed("");
if (oldCount <= 0){ //如果文件小于0xffff
NetReceiverThread.this.ntr.setProcess(100);
// ReceiverSession.this.ntr.setPercent(100);
NetReceiverThread.this.ntr
.setTransfered(fileSize%0xffff);
}else{
if (active) NetReceiverThread.this.ntr.setProcess(100);
NetReceiverThread.this.ntr
.setTransfered((oldCount-count)*0xffff+fileSize%0xffff);
}
if (active) {
NetReceiverThread.this.ntr.setLinkText("open");
// ReceiverSession.this.ntr.setPercent(100);
}
}
});
buffer = null;
yield();
}
protected void free(){
super.free();
crf = null;
ntr = null;
this.cmdList = null;
this.rootDir = null;
this.fos = null;
this.saveFile = null;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -