⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 netreceiverthread.java

📁 用swt作的一个类似飞鸽一样的局域网通信工具
💻 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 + -