`
shishui5271314
  • 浏览: 9389 次
  • 性别: 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
分享到:
评论

相关推荐

    Java网络文件传输

    Java网络文件传输是一种在计算机网络中通过Java编程语言实现的文件共享技术。它涉及网络通信协议、I/O流处理和多线程等核心概念。在这个主题中,我们将深入探讨Java如何实现这一功能,并通过源代码分析来理解其实现...

    用java代码编写的网络传输文件

    总的来说,这个“用java代码编写的网络传输文件”的程序深入涵盖了Java网络编程的核心概念,包括Socket通信、数据流操作以及可能的文件处理策略。对于理解网络编程和Java I/O系统有重要的实践意义。

    java网络文件传输(c/s)

    【Java网络文件传输(C/S)详解】 在网络开发中,文件传输是一项重要的功能,无论是文本文件还是图像文件,都需要能够高效、稳定地在网络之间传递。本文将深入探讨使用Java实现客户端/服务器(C/S)模式的文件传输...

    java文件传输工具

    Java文件传输工具是一种基于Java开发的应用程序,设计用于实现基本的点对点(P2P)文件传输功能。这个工具提供了简单易用的界面,让用户能够方便地在两台计算机之间共享和移动文件。以下是对该工具核心特性和技术...

    java实现网络文件传输

    总结来说,"java实现网络文件传输"项目涵盖了网络编程的基本原理和实际应用,通过学习和实践这个项目,开发者可以深入了解Java Socket通信,文件I/O,以及如何设计可靠的网络文件传输系统。同时,分析源码有助于提升...

    如何利用Java实现QQ文件传输功能

    传输文件时,通常会涉及到文件的读取、数据包的构造、发送、接收、数据重组和写入等步骤。 为了在Java中实现文件传输,可以采用UDP协议或者TCP协议。TCP协议提供可靠的数据传输服务,能够保证数据的有序、可靠和无...

    使用java实现网络文件的传输

    为了编译和运行Java网络文件传输程序,需要执行以下步骤: - 使用`javac`命令编译`.java`源文件,生成`.class`字节码文件。 - 在命令行中,分别使用`java SendFileSocket`启动服务器,和`java SendFileClient ...

    java文件传输源代码

    实现这个功能通常需要保存已传输文件的部分信息,如已传输的字节数,以便在连接恢复后继续从断点处传输。 七、安全性 Java提供了加密和解密功能,如`javax.crypto`包,可以用于文件传输的安全加密,防止数据在传输...

    Java网络编程-Socket-文件传输小案例

    FileInputStream和FileOutputStream分别用于读取和写入本地文件,而Socket提供了InputStream和OutputStream,可以将这些本地I/O流与网络I/O流关联起来,实现文件数据的网络传输。 5. **字节流与缓冲区**:为了提高...

    文件夹传输 java文件夹传输 文件传输

    根据提供的文件标题、描述、标签以及部分内容,我们可以总结出...通过客户端-服务器模型,使用Socket编程技术实现了文件夹的网络传输。该方案适用于小规模文件传输场景,并且可以通过进一步优化提高传输效率和稳定性。

    java多线程网络传输文件(非同步)

    总的来说,"java多线程网络传输文件(非同步)"这个主题涉及到Java多线程、Socket编程以及文件I/O等核心知识。通过多线程实现并发处理客户端请求,利用Socket进行网络通信,以及处理文件的读写操作,这些是构建一个...

    java文件传输程序 源码+jar文件

    9. **错误检测与校验**:通过计算和比较文件的MD5或SHA哈希值,可以验证传输文件的完整性和准确性。 开发者提供的源码中可能包含了上述部分或全部技术的实现,但需要注意的是,存在bug可能会影响程序的稳定性和效率...

    JAVA文件传输P2P源码

    使用JAVA进行P2P文件传输,首先需要掌握JAVA编程基础,包括类、对象、接口、多线程、网络编程等。JAVA的Socket编程是实现P2P通信的关键,它提供了在两台计算机之间建立TCP连接的能力,使得数据可以流经这个连接进行...

    基于java文件传输示例

    Java作为一种广泛应用的编程语言,提供了多种方式实现文件在网络间的传输,其中,基于Socket的文件传输因其高效、稳定的特点而备受青睐。本文将深入探讨基于Java和Socket技术的文件传输原理,并通过一个实际示例,...

    Java Socket传输文件

    Java Socket传输文件是一种基于TCP/IP协议的网络通信方式,它允许两台计算机通过网络进行双向通信,从而实现数据的交换。在这个场景中,我们利用Java的Socket API来实现在客户端(Client)和服务器端(Server)之间...

    java socket 大文件传输,快速传输(包的分片,组装)源码

    Java Socket 大文件传输是网络编程中的一个关键领域,它涉及到高效的数据传输、包的分片与组装,以及网络协议的选择。在这个场景下,我们通常会用到TCP和UDP这两种传输层协议,以及Java的非阻塞I/O(NIO)技术。下面...

    java实现文件传输(上传下载)

    在文件传输中,`FileInputStream`和`FileOutputStream`用于读写本地文件,而`Socket`的`getInputStream()`和`getOutputStream()`方法用于获取用于网络传输的输入/输出流。 - **多线程**:如果服务器需要同时处理多...

    java文件p2p传输

    每个线程负责传输文件的一个部分,这样可以同时处理多个数据块,显著提高传输速度。此外,线程池(ThreadPool)也可以用来优化线程的创建和管理,避免资源的过度消耗。 4. **文件分块与重组** 在P2P文件传输中,大...

    java局域网文件传输源码

    9. **安全性考虑**:在局域网中传输文件可能涉及安全问题,例如防止未经授权的访问。项目可能使用了加密技术对传输的数据进行保护,或者实施了身份验证机制。 10. **代码组织与设计模式**:良好的代码结构和设计...

    java 网络文件传输

    FTP是一个标准协议,提供文件上传、下载以及目录管理等功能,适合在服务器和客户端之间大量传输文件。 4. **NIO(非阻塞I/O)**:Java NIO(New Input/Output)提供了一种新的I/O模型,可以在多线程环境下更高效地...

Global site tag (gtag.js) - Google Analytics