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(); } } } }
效果图:
相关推荐
Java网络文件传输是一种在计算机网络中通过Java编程语言实现的文件共享技术。它涉及网络通信协议、I/O流处理和多线程等核心概念。在这个主题中,我们将深入探讨Java如何实现这一功能,并通过源代码分析来理解其实现...
总的来说,这个“用java代码编写的网络传输文件”的程序深入涵盖了Java网络编程的核心概念,包括Socket通信、数据流操作以及可能的文件处理策略。对于理解网络编程和Java I/O系统有重要的实践意义。
【Java网络文件传输(C/S)详解】 在网络开发中,文件传输是一项重要的功能,无论是文本文件还是图像文件,都需要能够高效、稳定地在网络之间传递。本文将深入探讨使用Java实现客户端/服务器(C/S)模式的文件传输...
Java文件传输工具是一种基于Java开发的应用程序,设计用于实现基本的点对点(P2P)文件传输功能。这个工具提供了简单易用的界面,让用户能够方便地在两台计算机之间共享和移动文件。以下是对该工具核心特性和技术...
总结来说,"java实现网络文件传输"项目涵盖了网络编程的基本原理和实际应用,通过学习和实践这个项目,开发者可以深入了解Java Socket通信,文件I/O,以及如何设计可靠的网络文件传输系统。同时,分析源码有助于提升...
传输文件时,通常会涉及到文件的读取、数据包的构造、发送、接收、数据重组和写入等步骤。 为了在Java中实现文件传输,可以采用UDP协议或者TCP协议。TCP协议提供可靠的数据传输服务,能够保证数据的有序、可靠和无...
为了编译和运行Java网络文件传输程序,需要执行以下步骤: - 使用`javac`命令编译`.java`源文件,生成`.class`字节码文件。 - 在命令行中,分别使用`java SendFileSocket`启动服务器,和`java SendFileClient ...
实现这个功能通常需要保存已传输文件的部分信息,如已传输的字节数,以便在连接恢复后继续从断点处传输。 七、安全性 Java提供了加密和解密功能,如`javax.crypto`包,可以用于文件传输的安全加密,防止数据在传输...
FileInputStream和FileOutputStream分别用于读取和写入本地文件,而Socket提供了InputStream和OutputStream,可以将这些本地I/O流与网络I/O流关联起来,实现文件数据的网络传输。 5. **字节流与缓冲区**:为了提高...
根据提供的文件标题、描述、标签以及部分内容,我们可以总结出...通过客户端-服务器模型,使用Socket编程技术实现了文件夹的网络传输。该方案适用于小规模文件传输场景,并且可以通过进一步优化提高传输效率和稳定性。
总的来说,"java多线程网络传输文件(非同步)"这个主题涉及到Java多线程、Socket编程以及文件I/O等核心知识。通过多线程实现并发处理客户端请求,利用Socket进行网络通信,以及处理文件的读写操作,这些是构建一个...
9. **错误检测与校验**:通过计算和比较文件的MD5或SHA哈希值,可以验证传输文件的完整性和准确性。 开发者提供的源码中可能包含了上述部分或全部技术的实现,但需要注意的是,存在bug可能会影响程序的稳定性和效率...
使用JAVA进行P2P文件传输,首先需要掌握JAVA编程基础,包括类、对象、接口、多线程、网络编程等。JAVA的Socket编程是实现P2P通信的关键,它提供了在两台计算机之间建立TCP连接的能力,使得数据可以流经这个连接进行...
Java作为一种广泛应用的编程语言,提供了多种方式实现文件在网络间的传输,其中,基于Socket的文件传输因其高效、稳定的特点而备受青睐。本文将深入探讨基于Java和Socket技术的文件传输原理,并通过一个实际示例,...
Java Socket传输文件是一种基于TCP/IP协议的网络通信方式,它允许两台计算机通过网络进行双向通信,从而实现数据的交换。在这个场景中,我们利用Java的Socket API来实现在客户端(Client)和服务器端(Server)之间...
Java Socket 大文件传输是网络编程中的一个关键领域,它涉及到高效的数据传输、包的分片与组装,以及网络协议的选择。在这个场景下,我们通常会用到TCP和UDP这两种传输层协议,以及Java的非阻塞I/O(NIO)技术。下面...
在文件传输中,`FileInputStream`和`FileOutputStream`用于读写本地文件,而`Socket`的`getInputStream()`和`getOutputStream()`方法用于获取用于网络传输的输入/输出流。 - **多线程**:如果服务器需要同时处理多...
每个线程负责传输文件的一个部分,这样可以同时处理多个数据块,显著提高传输速度。此外,线程池(ThreadPool)也可以用来优化线程的创建和管理,避免资源的过度消耗。 4. **文件分块与重组** 在P2P文件传输中,大...
9. **安全性考虑**:在局域网中传输文件可能涉及安全问题,例如防止未经授权的访问。项目可能使用了加密技术对传输的数据进行保护,或者实施了身份验证机制。 10. **代码组织与设计模式**:良好的代码结构和设计...
FTP是一个标准协议,提供文件上传、下载以及目录管理等功能,适合在服务器和客户端之间大量传输文件。 4. **NIO(非阻塞I/O)**:Java NIO(New Input/Output)提供了一种新的I/O模型,可以在多线程环境下更高效地...