📄 clienttcpthread.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 + -