📄 filereceive.java
字号:
//接收文件, 并对文件进行判定
package dssclient;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.Socket;
import javax.swing.JLabel;
class filereceive implements Runnable
{
JLabel statusLabel;
Socket serverSocket;
long resumeSize = 0;
DataOutputStream output;
DataInputStream input;
RandomAccessFile inFile;
FileReceiver fr;
public filereceive(Socket serverSocket,FileReceiver fr)
{
this.serverSocket = serverSocket;
this.fr=fr;
}
static int DENY = 0;
static int ACCEPT = 1;
static int RESUME = 2;
public void run()
{
try
{
String hostName = serverSocket.getInetAddress().getHostName(); //得到主机名
String hostAddress = serverSocket.getInetAddress().getHostAddress(); //得到地址
output = new DataOutputStream(serverSocket.getOutputStream()); //输出流
input = new DataInputStream(serverSocket.getInputStream()); //输入流
long magicNumber = input.readLong(); //得到输入流的长度
if(magicNumber!=FileReceiver.MAGIC_NUMBER){ //如果长度不为常量
input.close();
output.close();
serverSocket.close();
}
int fileNameLength = input.readInt(); //得到文件的长度
String fileName = "";
for(int i=0;i < fileNameLength;i++)
fileName += input.readChar();
long fileSize = input.readLong();
String toSavePath = fr.save(fileName);
if(toSavePath=="Canceled")
{
output.writeInt(DENY);
serverSocket.close();
return;
}
if(toSavePath.startsWith("**resume**"))
{
toSavePath = toSavePath.substring(10);
output.writeInt(RESUME);
resumeSize = new File(toSavePath,fileName).length();
output.writeLong(resumeSize);
}
else
{
File toSaveFile = new File(toSavePath,fileName);
if(toSaveFile.exists()&&toSaveFile.isFile())
{
toSaveFile.delete();
}
output.writeInt(ACCEPT);
}
String sizeString = FileReceiver.size(fileSize);
addLabel(fileName,hostName,hostAddress,sizeString);
byte[] inBuf = new byte[FileReceiver.bufferSize];
int inBytesRead = 0;
inFile = new RandomAccessFile(toSavePath+"/"+fileName,"rw");
inFile.seek(resumeSize);
long totalBytesRead = resumeSize;
while((inBytesRead = input.read(inBuf))>-1)
{
inFile.write(inBuf,0,inBytesRead);
totalBytesRead += inBytesRead;
statusLabel.setText("\""+fileName+"\" from "+hostName+" ["+hostAddress+"]: "+FileReceiver.size(totalBytesRead)+"/"+sizeString);
}
if(totalBytesRead == fileSize)
fr.fileReceived(fileName);
if(totalBytesRead < fileSize)
fr.otherSideCanceled();
}
catch(Exception e)
{
fr.handleException(e.toString());
}
finally
{
try
{
input.close();
output.flush();
output.close();
if(inFile != null)
inFile.close();
serverSocket.close();
}
catch(IOException e)
{
fr.handleException(e.toString());
}
if(statusLabel!=null)
fr.remove(statusLabel);
}
}
void addLabel(String fileName, String hostName, String hostAddress, String sizeString)
{
statusLabel = new JLabel("\""+fileName+"\" from "+hostName+" ["+hostAddress+"]: 0MB/"+sizeString);
fr.getContentPane().add(statusLabel);
fr.pack();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -