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开发的网络文件传输,包括了源代码和课程设计报告。
现在, 通过网络传输文件已经非常普遍, 各种传输工 具也很多, 最具有代表性的就是 QQ 提供的文件传输功能了, 它能让好友之间方便的把自己的文件传给对方。 仔细查看 QQ 的传输文件功能, 发现它没有文件类型的...
文档的功能在于实现文件的传输,是网络开发中的重点,无论是文本,还是图片都可传输……,很小,很实用
使用java实现网络文件的传输
本程序是用java来编的,基于socket编程方式
Java网络编程-Socket-文件传输小案例
java多线程网络传输文件
Java文件夹复制(远程复制(网络传输),用于远程备份文件)(支持文件夹,嵌套子文件夹) import java.io.*; import java.util.*; public class FileSelection { private File rootDirectory;//根目录 private ...
用java的NIO技术编写的 ...2. 拖拽文件可以实现文件传输功能,也可以是文件夹 3. 启动时可以选择server端或client端启动 4. 本人原创,学习NIO和java的网络通信一定会不错 5. 下载下来可以直接导致eclipse,然后运行
java 远程文件传输工具 MammothCopy
大二课程设计是用swing做的一个java网络传输,支持大文件传输,局域网传输速率很快,可以和飞鸽相比!不过那个进度条有点问题,timer没有深入研究,实现的基本上就形同虚设了!
java写的局域网文件传输,实现局域网内文件传输,很好用的代码,代码很详细
java 网络文件传输 有源代码 ~~~~~~~~~~~~~~
简单的java局域网文件传输 自己写的 仅用于学习
含服务器和客户端两端程序,设计socket编程,接口技术等
Java文件传输是指在客户端和服务器之间通过网络传输文件的过程,可以实现文件的上传、下载和共享功能。 该实现通常基于TCP/IP或UDP等网络协议,确保文件在传输过程中的可靠性和稳定性。 功能特点: 文件上传:...
java-socket传输文件-图片-源码 我试过本地和局域网传输文件。 按理说,网络传输也是可以的。 效率可以。还可以写成线程操作
计算机网络 作业实例 Java socket编程 文件传输