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

📄 clienttcpthread.java

📁 局域网飞鸽传输
💻 JAVA
字号:
/**
  * @(#)logic.ClientTCPThread.java  2008-10-9  
  * Copy Right Information	: Tarena
  * Project					: IPMsg
  * JDK version used		: jdk1.6.4
  * Comments				: Socket网络客户端。
  * Version					: 1.0
  * Sr	Date		Modified By		Why & What is modified
  * 1.	2008-10-9 	小猪     		新建
  **/
package logic;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JOptionPane;

import tools.DownSpeed;
import tools.FileInfo;

import data.FSMessage;
import frm.FileSendOK;
import frm.ReceiveNewMSG;

 /**
 * Socket网络客户端。<br>
 * 主要负责接受文件。
 * 2008-10-9
 * @author		达内科技[Tarena Training Group]
 * @version	1.0
 * @since		JDK1.6(建议) 
 */
public class ClientTCPThread extends Thread {

	/** 客户端对象 */
	private Socket client = null;
	/** 对象输出流 */
	private ObjectOutputStream oos = null;
	/** 对象输入流 */
	private ObjectInputStream ois = null;
	/** 文件下载流 */
	private DataOutputStream dos = null;
	/** 程序运行否 */
	private boolean isRun = true;
	///** 程序是否暂停 */
	//private boolean isPause = false;
	/** 是否开始传输文件 */
	private boolean isBeginSend = false;
	/** 数据保存的目录 */
	private String savePath = "";
	/** 数据的远程目录 */
	private String path = "";
	/** 开始传送文件时间 */
	private long beginTime = 0L;
	/** 文件开始下载时间 */
	private long fileBeginTime = 0L;
	/** 文件结束下载时间 */
	private long fileEndTime = 0L;
	/** 已下载文件数据(单位:字节) */
	private long totalDownData = 0L;
	/** 总计下载的数据(单位:字节) */
	private long totalData = 0L;
	/** 当前下载文件的长度(单位:字节) */
	private long fileLength = 1L;
	/** 当前下载文件名 */
	private String fileName = ""; 
	/** 当前引用该线程的窗口 */
	private ReceiveNewMSG newMSG = null;
	
	
	public ClientTCPThread(ReceiveNewMSG newMSG,String ip,int port,String path,String savePath) {
		try {
			this.newMSG = newMSG;
			this.savePath = savePath;
			this.path = path;
			client = new Socket(ip,port);
			oos = new ObjectOutputStream(new BufferedOutputStream(new DataOutputStream(client.getOutputStream())));
			new WriteThread(new FSMessage(10,path)).start();
			ois = new ObjectInputStream(new BufferedInputStream(new DataInputStream(client.getInputStream())));
			beginTime = System.currentTimeMillis();
		} catch (UnknownHostException e) {
			closeClient();
		} catch (IOException e) {
			closeClient();
		}
	}
	
	/**
	 * 消息内容:
	 * 类型说明:
	 * 10:客户端发送文件地址
	 * 11:客户端发送的地址有误,不予响应
	 * 20:服务端发送相对目录地址到客户端,客户端接到信息创建目录
	 * 21:服务端发送相对文件地址到客户端,客户端接到信息创建文件
	 * 22:开始发送数据,发送文件长度
	 * 31:数据发送完成
	 * 40:客户端请求暂停发送
	 * 41:客户端请求继续发送
	 * 42:服务端取消发送
	 * 90:客户端退出
	 * 91:服务端退出
	 * 92:请求数据全部发送完成.
	 */
	@Override
	public void run() {
		try {
			while(isRun && ois!=null && oos!=null){
				if(!isBeginSend){//未传输文件时
					Object obj = ois.readObject();
					if(obj instanceof FSMessage){
						FSMessage message = (FSMessage)obj;
						int type = message.getType();
						switch (type) {
						case 11:
							JOptionPane.showMessageDialog(null, message.getObject());
							break;
						case 20:
							createDirectory(message.getObject());
							break;
						case 21:
							createFile(message.getObject());
							break;
						case 22:
							dealBeginSend(message.getObject());
							break;
						case 31:
							break;
						case 42:
							dealServerQuit();
							break;
						case 91:
							dealServerQuit();
							break;
						case 92:
							sendOK();
						}
					}
				}else{//传输文件
					while(isRun && oos!=null && ois!=null){
						int readlen = 0;
						byte data[] = new byte[1024];
						readlen = ois.read(data);
						//System.out.println("-->n:"+readlen);
						if(readlen==-1)
							break;
						else{
							dos.write(data,0,readlen);
							dos.flush();
							fileEndTime = System.currentTimeMillis();
							totalDownData += readlen;
							totalData += readlen;
						}
						setSpeed();
					}
					closeFile();
					isBeginSend = false;
				}
			}
		} catch (IOException e) {
			closeClient();
		} catch (ClassNotFoundException e) {
			closeClient();
		}
	}
	
	/**
	 * 传送完成。
	 * 
	 */
	private void sendOK(){
		new FileSendOK(newMSG,true,"总计:"+FileInfo.getFileLength(totalData)+" "+DownSpeed.getSpeed(totalData, beginTime, fileEndTime)+"<br>"+((fileEndTime-beginTime)/1000)+"s "+path.substring(path.lastIndexOf(File.separator)+1));
		newMSG.initBtnList();
		dealServerQuit();
	}
	
	/**
	 * 获取当前速度。
	 * @return 返回当前的传输速度。
	 */
	private String getSpeed(){
		return fileName+" "+FileInfo.getFileLength(totalDownData)+"/"+FileInfo.getFileLength(fileLength)+
			" "+DownSpeed.getSpeed(totalDownData, fileBeginTime, fileEndTime)+" ("+totalDownData*100/fileLength+"%)";
	}
	
	/**
	 * 设置当前速度。
	 */
	private void setSpeed(){
		//if(fileEndTime-fileBeginTime>=1000)
		newMSG.setSpeed(getSpeed());
	}
	
	/**
	 * 开始发送数据。
	 * @param obj 
	 */
	private void dealBeginSend(Object obj){
		isBeginSend = true;
		if(obj instanceof Long)
			fileLength = (Long)obj;
		fileBeginTime = System.currentTimeMillis();
	}
	
	/**
	 * 关闭文件流。
	 */
	private void closeFile(){
		totalDownData = 0L;
		fileEndTime = System.currentTimeMillis();
		try {
			if(dos!=null){
				dos.flush();
				dos.close();
				dos = null;
			}
		} catch (IOException e) {}
	}
	
	/**
	 * 停止传送。
	 */
	public void stopSend(){
		new WriteThread(new FSMessage(90,null)).start();
		isRun = false;
		closeFile();
		closeClient();
		newMSG.initBtnList();
	}
	
	/**
	 * 暂停传送。
	 */
	public void pauseSend(){
		new WriteThread(new FSMessage(40,null)).start();
	}
	
	/**
	 * 继续发送。
	 */
	public void continueSend(){
		new WriteThread(new FSMessage(41,null)).start();
	}
	
	/**
	 * 创建文件。
	 * @param obj 创建文件的相对路径。
	 */
	private void createFile(Object obj){
		try {
			String path = obj.toString();
			path = savePath+path;
			System.out.println("==>"+path);
			//writeLog("创建文件"+path+"...");
			File file = new File(path);
			if(file.exists()){
				//日志:存在同名文件,替换之...
				file.delete();
			}
			else{
				File parentFile = file.getParentFile();
				System.out.println("父目录:"+parentFile.getAbsolutePath());
				if(!parentFile.exists())
					parentFile.mkdirs();
				//file.createNewFile();
			}
			fileName = file.getName();
			dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file)));
			//日志:文件创建成功
		} catch (IOException e) {
			System.out.println("创建文件时错误:"+e.getMessage());
		}
	}
	
	/**
	 * 创建目录。
	 * @param obj 创建目录的相对路径路径.
	 */
	private void createDirectory(Object obj){
		try {
			String path = obj.toString();
			path = savePath+path;
			System.out.println("==>"+path);
			//创建目录
			File file = new File(path);
			if(!file.exists())
				file.mkdirs();
			//日志:创建目录成功!
		} catch (RuntimeException e) {
			System.out.println("创建目录时错误:"+e.getMessage());
		}
	}
	
	/**
	 * 处理服务端退出。
	 */
	private void dealServerQuit(){
		isRun = false;
		closeClient();
	}
	
	/**
	 * 断开连接。
	 */
	private void closeClient(){
		try {
			if(oos!=null)
				oos.close();oos = null;
			if(ois!=null)
				ois.close();ois = null;
			if(client!=null)
				client.close();client = null;
		} catch (IOException e) {
			System.out.println("关闭时错误:"+e.getMessage());
		}
	}
	
	/**
	 * 书写线程。
	 * 2008-10-5
	 * @author		达内科技[Tarena Training Group]
	 * @version	1.0
	 * @since		JDK1.6(建议) 
	 */
	private class WriteThread extends Thread{
		FSMessage message = null;
		public WriteThread(FSMessage message) {
			this.message = message;
		}
		@Override
		public void run() {
			try {
				if(oos!=null){
					oos.writeObject(message);
					oos.flush();
				}
			} catch (IOException e) {}
		}
	}

	public boolean isRun() {
		return isRun;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -