package org.fw.qq.plugins.filetransfer;
import java.io.Serializable;
public class FileCarrier implements Serializable {
/**
*
*/
private static final long serialVersionUID = -8211632526317273714L;
/**
* 文件名
*/
private String fileName;
/**
* 偏移量
*/
private long pos;
/**
* 当前块长度
*/
private long curBlockLength;
/**
* 文件总长度
*/
private long totalLength;
/**
* 传输内容
*/
private byte[] content;
public long getCurBlockLength() {
return curBlockLength;
}
public void setCurBlockLength(long curBlockLength) {
this.curBlockLength = curBlockLength;
}
public long getPos() {
return pos;
}
public void setPos(long pos) {
this.pos = pos;
}
public long getTotalLength() {
return totalLength;
}
public void setTotalLength(long totalLength) {
this.totalLength = totalLength;
}
public byte[] getContent() {
return content;
}
public void setContent(byte[] content) {
this.content = content;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
}
文件发送类:
package org.fw.qq.plugins.filetransfer;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.RandomAccessFile;
import java.net.Socket;
import java.util.Calendar;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
public class FileTransfer extends JPanel implements Runnable {
/**
*
*/
private static final long serialVersionUID = -5946884272739604176L;
private String receiverIp;
private int receiverPort;
private String transferFilePath;
private Thread transferThread;
private final int fps = 5;
private int pos;
private JLabel speedLabel;
private JLabel fileLabel;
private JProgressBar progress;
public static void main(String[] args) {
FileTransfer transfer = new FileTransfer("127.0.0.1", 60000, "F:\\game\\大富翁8.zip");
transfer.start();
JFrame frame = new JFrame("发送窗口");
frame.add(transfer);
frame.setDefaultCloseOperation(3);
frame.setSize(540, 75);
frame.setVisible(true);
}
public FileTransfer(String receiverIp, int receiverPort, String transferFilePath) {
this.receiverIp = receiverIp;
this.receiverPort = receiverPort;
this.transferFilePath = transferFilePath;
transferThread = new Thread(this);
pos = 0;
progress = new JProgressBar(JProgressBar.HORIZONTAL);
progress.setMaximum(100);
progress.setMinimum(0);
progress.setStringPainted(true);
speedLabel = new JLabel("速度:0KB/S");
fileLabel = new JLabel("");
this.add(fileLabel);
this.add(progress);
this.add(speedLabel);
}
public void start() {
transferThread.start();
}
public void run() {
File transferFile = new File(transferFilePath);
long startTransferTime = System.currentTimeMillis();
boolean speedStart = false;
try {
// 缓存大小对速度有一定的影响
byte[] buffer = new byte[10240];
RandomAccessFile ras = new RandomAccessFile(transferFile, "r");
long startTime = 0;
long startPos = 0;
while (true) {
if (!speedStart) {
startTime = System.currentTimeMillis();
startPos = pos;
speedStart = true;
}
ras.seek(pos);
ras.read(buffer);
FileCarrier carrier = new FileCarrier();
carrier.setFileName(transferFile.getName());
carrier.setCurBlockLength(buffer.length);
carrier.setPos(pos);
carrier.setTotalLength(ras.length());
carrier.setContent(buffer);
pos = pos + buffer.length;
Socket socket = new Socket(receiverIp, receiverPort);
ObjectOutputStream objectOut = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));
objectOut.writeObject(carrier);
objectOut.flush();
objectOut.close();
fileLabel.setText("发送文件:" + transferFile.getName());
if (System.currentTimeMillis() - startTime >= 1E3) {
speedStart = false;
progress.setValue((int) ((double) (pos + buffer.length) / (ras.length()) * 100));
speedLabel.setText("速度:" + (pos - startPos) / 1024 + "KB/S");
}
Thread.sleep(fps);
if (pos >= ras.length()) {
progress.setValue(100);
System.out.println("发送完毕");
break;
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
Calendar c = Calendar.getInstance();
c.setTimeInMillis(System.currentTimeMillis() - startTransferTime);
System.out.println("耗时: " + c.get(Calendar.MINUTE) + "分 " + c.get(Calendar.SECOND) + "秒 " + c.get(Calendar.MILLISECOND) + " 微秒");
}
}
文件接收类:
package org.fw.qq.plugins.filetransfer;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.RandomAccessFile;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
public class FileReceiver extends JPanel implements Runnable {
/**
*
*/
private static final long serialVersionUID = 8385869427220376418L;
private String listenerIp;
private int listenerPort;
private String saveFilePath;
private ServerSocket server;
private Thread thread;
private JProgressBar progress;
private JLabel speedLabel;
private JLabel fileLabel;
public static void main(String[] args) {
FileReceiver receiver = new FileReceiver("127.0.0.1", 60000, "G:\\test.rar");
receiver.start();
JFrame frame = new JFrame("接收窗口");
frame.add(receiver);
frame.setSize(540, 75);
frame.setDefaultCloseOperation(3);
frame.setVisible(true);
}
public FileReceiver(String listenerIp, int listenerPort, String saveFilePath) {
this.listenerIp = listenerIp;
this.listenerPort = listenerPort;
this.saveFilePath = saveFilePath;
thread = new Thread(this);
try {
server = new ServerSocket(this.listenerPort, 1, InetAddress.getByName(this.listenerIp));
} catch (IOException e) {
e.printStackTrace();
}
progress = new JProgressBar(JProgressBar.HORIZONTAL);
progress.setMaximum(100);
progress.setStringPainted(true);
progress.setMinimum(0);
speedLabel = new JLabel("速度:0KB/S");
fileLabel = new JLabel();
this.add(fileLabel);
this.add(progress);
this.add(speedLabel);
}
public void start() {
thread.start();
}
public void run() {
boolean speedStart =false;
long startTime = 0;
long startPos = 0;
while (true) {
try {
Socket client = server.accept();
ObjectInputStream objIn = new ObjectInputStream(new BufferedInputStream(client.getInputStream()));
FileCarrier carrier = (FileCarrier) objIn.readObject();
File file = new File(saveFilePath);
if (!file.exists())
file.createNewFile();
RandomAccessFile ras = new RandomAccessFile(file, "rw");
ras.seek(carrier.getPos());
ras.write(carrier.getContent());
ras.close();
objIn.close();
fileLabel.setText("接收文件:"+carrier.getFileName());
if(!speedStart){
startTime = System.currentTimeMillis();
startPos = carrier.getPos();
speedStart = true;
}
if(System.currentTimeMillis() - startTime >= 1E3){
speedStart = false;
progress.setValue((int)((double)( carrier.getPos()+ carrier.getCurBlockLength())/(carrier.getTotalLength())*100));
speedLabel.setText("速度:"+(carrier.getPos() - startPos)/1024 + "KB/S");
}
progress.setValue((int)((double)(carrier.getPos()+carrier.getCurBlockLength())/carrier.getTotalLength()*100));
if ((carrier.getPos() + carrier.getCurBlockLength()) >= carrier.getTotalLength()) {
System.out.println("接收完毕");
break;
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
}
效果图: