设为首页 加入收藏

TOP

Java断点续传(基于socket与RandomAccessFile的简单实现)(一)
2019-09-02 23:33:21 】 浏览:22
Tags:Java 断点 基于 socket RandomAccessFile 简单 实现

Java断点续传(基于socket与RandomAccessFile的简单实现)

  这是一个简单的C/S架构,基本实现思路是将服务器注册至某个空闲端口用来监视并处理每个客户端的传输请求。

  客户端先获得用户给予的需传输文件与目标路径,之后根据该文件实例化RandomAccessFile为只读,之后客户端向服务器发送需传输的文件名文件大小与目标路径,服务器没接收到一个客户端的请求就会建立一个新的线程去处理它,根据接收到的文件名到目标路径中去寻找目标路径中是否已经有该文件名的.temp临时文件(如果没有就创建它),之后服务器会将文件已经传输的大小(临时文件大小)返回给客户端(例如临时文件刚刚建立返回的便是0),客户端会将刚刚建立的RandomAccessFile对象的文件指针指向服务器返回的位置,之后以1kb为一组向服务器传输需传输文件的内容数据,服务器则接收数据并将其写入临时文件中,并根据现有数据画出进度条。在文件传输完毕后客户端会将临时文件重命名为最初接收到的文件名。

  服务器代码:

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
 
public class FileTransferServer extends ServerSocket {
 
    private static final int SERVER_PORT = 8899; // 服务端端口
 
    public FileTransferServer() throws Exception {
        super(SERVER_PORT);
    }
 
    public void load() throws Exception {
        while (true) {
            // server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的
            Socket socket = this.accept();
           
            // 每接收到一个Socket就建立一个新的线程来处理它
            new Thread(new Task(socket)).start();
        }
    }
     //处理客户端传输过来的文件线程类
    class Task implements Runnable {
 
        private Socket socket;
        private DataInputStream dis;
        private DataOutputStream dos;
        private RandomAccessFile rad;
        private JFrame frame;    //用来显示进度条
        private Container contentPanel;
        private JProgressBar progressbar;
        private JLabel label;
            
        public Task(Socket socket) {
            frame = new JFrame("文件传输");
            this.socket = socket;
        }
 
        @Override
        public void run() {
            try {
                dis = new DataInputStream(socket.getInputStream());
                dos = new DataOutputStream(socket.getOutputStream());
                String targetPath = dis.readUTF();    //接收目标路径
                String fileName = dis.readUTF();    //接收文件名
                //System.out.println("服务器:接收文件名");
                long fileLength = dis.readLong();    //接收文件长度
                //System.out.println("服务器:接收文件长度");
                File directory = new File(targetPath);    //目标地址
                if(!directory.exists()) {    //目标地址文件夹不存在则创建该文件夹
                    directory.mkdir();
                }
                File file = new File(directory.getAbsolutePath() + File.separatorChar + fileName + ".temp");    //建立临时数据文件.temp
                //System.out.println("服务器:加载temp文件");
                rad = new RandomAccessFile(directory.getAbsolutePath() + File.separatorChar + fileName + ".temp", "rw");
                long size = 0;
                if(file.exists() && file.isFile()){    //如果目标路径存在且是文件,则获取文件大小
                    size = file.length();
                }
                //System.out.println("服务器:获的当前已接收长度");
                dos.writeLong(size);    //向客户端发送当前数据文件大小
                dos.flush();
                //System.out.println("服务器:发送当前以接收文件长度");
                int barSize = (int)(fileLength / 1024);    //进度条当前进度
                int barOffset = (int)(size / 1024);        //进度条总长
                frame.setSize(300,120); //传输界面
                contentPanel = frame.getContentPane();
                contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS));
                progressbar = new JP
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Java基础学习-一切皆为对象 下一篇开发人员调度软件

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目