`
shishui5271314
  • 浏览: 9068 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java网络传输文件

阅读更多
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();
			}

		}

	}

}

 效果图:



 
 

  • 大小: 32.9 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics