?? socketthread.java
字號:
//解包
private void upPackage(byte[] data) {
ByteArrayInputStream bias = new ByteArrayInputStream(data);
DataInputStream biasDis = new DataInputStream(bias);
int type = 0;
try {
type = biasDis.readInt();
} catch (SocketTimeoutException ex) {
setError("網(wǎng)絡(luò)超時!");
} catch (IOException ex1) {
setError("對方取消了文件傳輸或網(wǎng)絡(luò)錯誤!");
}
switch (type) {
case PACKAGE_TYPE_FILENAME: {
try {
int length = biasDis.readInt();
bias.read(dataBuf,0,length);
fileName = new String(dataBuf,0,length);
fileSize = biasDis.readLong();
length = biasDis.readInt();
if (length !=-1) {
bias.read(dataBuf,0,length);
message = new String(dataBuf,0,length);
}
fileTransStatus = FILE_TRANS_STATUS_WAITFORCONFIRM;
} catch (SocketTimeoutException ex) {
setError("網(wǎng)絡(luò)超時!");
} catch (IOException ex) {
setError("對方取消了文件傳輸或網(wǎng)絡(luò)錯誤!");
}
break ;
}
case PACKAGE_TYPE_CONTEXT: {
try {
int flag = biasDis.readInt();
int length = biasDis.readInt();
bias.read(dataBuf,0,length);
writeToFile(dataBuf,0,length);
transFileLength += length;
if (flag == 0) {
fileTransStatus = FILE_TRANS_STATUS_SUCCESS;
stopThread();
}
} catch (SocketTimeoutException ex) {
setError("網(wǎng)絡(luò)超時!");
} catch (IOException ex) {
setError("對方取消了文件傳輸或網(wǎng)絡(luò)錯誤!");
}
break ;
}
}
}
//發(fā)送文件
private void sendFile() {
int length;
switch (fileTransStatus) {
case FILE_TRANS_STATUS_FILENAME: {
try {
byte [] buf;
fileName = aFile.getName();
fileSize = aFile.length();
buf = doPackage(null, 0);
writeToSocket(buf);
fileTransStatus = FILE_TRANS_STATUS_WAITFORCONFIRM;
} catch (IOException ex) {
setError("對方取消了文件傳輸或網(wǎng)絡(luò)錯誤!");
}
break ;
}
case FILE_TRANS_STATUS_WAITFORCONFIRM: {
int flag;
try {
flag = readFromSocket();
if (flag == 0) {
setError("對方拒絕了文件傳輸!");
} else {
fileTransStatus = FILE_TRANS_STATUS_CONTEXT;
transFileLength = readLongFromSocket();
fDis.skip(transFileLength);
aSocket.setSoTimeout(30000);
}
} catch (SocketTimeoutException ex) {
setError("網(wǎng)絡(luò)超時!");
} catch (IOException ex) {
setError("對方取消了文件傳輸或網(wǎng)絡(luò)錯誤!");
}
break ;
}
case FILE_TRANS_STATUS_CONTEXT: {
length = readFromFile(dataBuf,0,CACHE_SIZE);
try {
writeToSocket(doPackage(dataBuf, length));
transFileLength += length;
if (transFileLength >= fileSize) {
fileTransStatus = FILE_TRANS_STATUS_SUCCESS;
Thread.sleep(1000);
stopThread();
}
} catch (IOException ex) {
setError("對方取消了文件傳輸或網(wǎng)絡(luò)錯誤!");
} catch (InterruptedException ex1) {
}
count++;
if(count==2){
//stopThread();
}
break ;
}
}
}
//接收文件
private void receiveFile() {
if (fileTransStatus == FILE_TRANS_STATUS_CONTEXT ||
fileTransStatus == FILE_TRANS_STATUS_FILENAME) {
try {
int length = dis.readInt();
int len=dis.read(dataBuf,0,length);
while(len<length){
len=len+dis.read(dataBuf,len,length-len);
}
upPackage(dataBuf);
} catch (SocketTimeoutException ex) {
setError("網(wǎng)絡(luò)超時!");
ex.printStackTrace();
} catch (IOException ex) {
setError("對方取消了文件傳輸或網(wǎng)絡(luò)錯誤!");
}
} else if (fileTransStatus == FILE_TRANS_STATUS_CANCELTRANS) {
try {
doPackage(null, 0);
} catch (IOException ex1) {
}
setError("已取消文件傳輸!");
}
}
//確認(rèn)是否接收文件
public void confirmReceiveFile(boolean flag, String fileName, long off) {
if (flag) {
try {
writeToSocket(1);
if (off >0) {
writeToSocket(off);
} else {
writeToSocket(0L);
File aFile=new File(fileName);
if(aFile.exists()){
System.out.println("*");
aFile.delete();
}
}
raf = new RandomAccessFile(fileName, "rws");
this.fileName = fileName;
fileTransStatus = FILE_TRANS_STATUS_CONTEXT;
fileTransed=true;
raf.seek(off);
} catch (FileNotFoundException ex) {
setError("創(chuàng)建文件錯誤!");
} catch (IOException ex) {
setError("對方取消了文件傳輸或網(wǎng)絡(luò)錯誤!");
}
transFileLength = off;
} else {
try {
writeToSocket(0);
writeToSocket(0L);
} catch (IOException ex) {
setError("對方取消了文件傳輸或網(wǎng)絡(luò)錯誤!");
}
}
}
//返回已傳輸字節(jié)數(shù)
public long getTransFileLength() {
return transFileLength;
}
//設(shè)置錯誤消息
public void setError(String errorMessage) {
fileTransStatus = FILE_TRANS_STATUS_FAIL;
this.errorMessage = errorMessage;
if (!fileSender&&fileTransed) {
File tmpFile = new File(fileName + ".tmp");
try {
DataOutputStream dos = new DataOutputStream(new
FileOutputStream(
tmpFile));
dos.writeLong(transFileLength);
dos.writeLong(fileSize);
dos.close();
} catch (IOException ex) {
}
}
stopThread();
}
//返回錯誤消息
public String getErrorMessage() {
return errorMessage;
}
//返回傳輸狀態(tài)
public int getStatus() {
return fileTransStatus;
}
//是否是文件發(fā)送者
public boolean isFileSender() {
return fileSender;
}
public void cancelTrans() {
if (fileTransStatus == FILE_TRANS_STATUS_WAITFORCONFIRM) {
confirmReceiveFile(false, null, 0);
}
setError("已取消文件傳輸!");
}
public String getMessage() {
return message;
}
public String getIP() {
return IP;
}
public int getPort() {
return port;
}
public String getFileName() {
if (fileName.length()>0) {
return fileName.substring(0,fileName.lastIndexOf('.')) +
fileName.substring(fileName.lastIndexOf('.'),
fileName.length());
} else {
return fileName;
}
}
public String getFileTransMessage(){
if(fileSender){
return "文件發(fā)送 目標(biāo)IP: "+getIP()+" 端口:"+getPort();
}
else{
return "文件接收 來自: "+getIP();
}
}
private void jbInit() throws Exception {
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -