⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 duoxancheng.txt

📁 次JAVA程序支持多线程下载
💻 TXT
📖 第 1 页 / 共 2 页
字号:
先说下思路吧

主要类包括

DownInfo.java 线程下载信息类
DownloadFrame.java 下载界面
DownloadHis.java 下载历史记录,定时记录下载信息,为断点续传提供基础
DownloadMain.java 下载主线程
DownloadStat.java 下载信息统计类
DownThread.java 下载子线程
ResponseCode.java response响应编码
UpdateService.java 更新服务类,用于读取本地版本信息,服务器更新信息,该类需要自己实现

1 从客户端读取版本及服务器地址等信息

2 通过webservice将本地版本号与服务器版本号进行比对,如果服务器发布的版本号大于客户端版本号,则从服务器查找要更新的文件。

3 启动主线程,根据线程个数划分每个线程的下载范围。

4启动下载子线程开始下载,子线程将下载的数据量调用统计类进行累计。

4 通过下载统计类得到下载信息,包括下载速度、下载量、剩余时间估计、完成百分比等等。

5 通过下载信息存档类定时将下载信息写入磁盘,作为断点续传的基础。

源码如下:

1 从客户端读取版本及服务器地址等信息

2 通过webservice将本地版本号与服务器版本号进行比对,如果服务器发布的版本号大于客户端版本号,则从服务器查找要更新的文件。

3 启动主线程,根据线程个数划分每个线程的下载范围。

4启动下载子线程开始下载,子线程将下载的数据量调用统计类进行累计。

4 通过下载统计类得到下载信息,包括下载速度、下载量、剩余时间估计、完成百分比等等。

5 通过下载信息存档类定时将下载信息写入磁盘,作为断点续传的基础。

源码如下:

1 从客户端读取版本及服务器地址等信息

2 通过webservice将本地版本号与服务器版本号进行比对,如果服务器发布的版本号大于客户端版本号,则从服务器查找要更新的文件。

3 启动主线程,根据线程个数划分每个线程的下载范围。

4启动下载子线程开始下载,子线程将下载的数据量调用统计类进行累计。

4 通过下载统计类得到下载信息,包括下载速度、下载量、剩余时间估计、完成百分比等等。

5 通过下载信息存档类定时将下载信息写入磁盘,作为断点续传的基础。

源码如下:

/**

* 线程下载信息

* @author zean

*/

public class DownInfo

{

    private String threadId;//线程id

    private BigDecimal startPos=new BigDecimal(0);//开始位置,随着下载增长

    private BigDecimal endPos=new BigDecimal(0);//结束位置


    public DownInfo(String threadId, long startPos, long endPos)

    {

       this.threadId=threadId;

       this.startPos = new BigDecimal(startPos);

       this.endPos = new BigDecimal(endPos);

    }


    public long getStartPos()

    {

       return startPos.longValue();

    }


    public long getEndPos()

    {

       return endPos.longValue();

    }


    public void updateStartPos(long size)

    {

       this.startPos =startPos.add(new BigDecimal(size));

    }


    public String getThreadId()

    {

       return threadId;

    }


    public void setThreadId(String threadId)

    {

       this.threadId = threadId;

    }

}








/**

* 下载界面类

* @author zean

* @create date 2008-06-28

*/


public class DownloadFrame extends JFrame

{

    protected JTextField addressField = new JTextField();

    protected JTextField totalFileField = new JTextField();

    protected JTextField currentFileField = new JTextField();

    protected JTextField localFilePathField = new JTextField();

    protected JTextField threadNumField = new JTextField("3",2);

    protected JTextField speedField = new JTextField();

    protected JTextArea textArea = new JTextArea();

    protected JProgressBar progressBar = new JProgressBar(0,10000);

    protected JButton run= new JButton("开始下载");


    private DownloadHis downloadHis;

    private UpdateService updateService;

    private DownloadMain dm;

    private boolean isDownloadedAll=true;

    protected JButton stop;

    public DownloadFrame()

    {

       init();

    }

    /**

     * 初始化

     */

    private void init()

    {

       WindowHandler.launch(this,"更新程序",600,400);

       setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

       try

       {

           this.updateService=new UpdateService();

       }

       catch (GeneralFailureException e)

       {

           WindowHandler.alerm(this,"启动更新程序出错:"+e.getMessage(),"出错");

           run.setEnabled(true);

           e.printStackTrace();

           return;

       }

        if(updateService.getVersionInfo()==null||updateService.getUpdateFiles()==null||updateService.getUpdateFiles().size()<1)

       {

           WindowHandler.showMsg(this,"没有需要更新的文件");

           this.dispose();

           return;

       }

       createFace();

       List files=updateService.getUpdateFiles();

       if(files==null||files.size()<1)

       {

           return;

       }

       /**

        * 定位需要下载的文件

        */

       downloadHis=new DownloadHis();

       DataRecord file=null;

       for(int i=0;i<files.size();i++)

       {

           file=(DataRecord)files.get(i);

           downloadHis.initDownloadedInfo(file.getString("FILE_NAME"));

           if(downloadHis.getHisPercent()!=10000)

           {

              isDownloadedAll=false;

              break;

           }

       }

       if(isDownloadedAll)

       {

           this.textArea.setText("更新程序已经下载完毕!");

           this.run.setEnabled(false);

           this.stop.setEnabled(false);

           return;

       }

       else

       {

           progressBar.setValue(downloadHis.getHisPercent());

           totalFileField.setText(String.valueOf(files.size()));

       }

    }

    /**

     * 创建界面

     */

    private void createFace()

    {

        addressField.setPreferredSize(new Dimension(280,20));

       localFilePathField.setPreferredSize(new Dimension(280,20));

       totalFileField.setPreferredSize(new Dimension(280,20));

       currentFileField.setPreferredSize(new Dimension(280,20));

       speedField.setPreferredSize(new Dimension(280,20));

       progressBar.setPreferredSize(new Dimension(280, 18));

       progressBar.setBackground(Color.white);

       progressBar.setForeground(Color.GRAY);

       progressBar.setStringPainted(true);

       progressBar.setStringPainted(true);

       WindowHandler.launch(this, "下载", 380, 360);

       ContentTemplet templet = new ContentTemplet();

       templet.addCompnent(getInfoPanel(), 2);

       templet.nextRow();

       templet.addCompnent(new JLabel(" "), 2);

       templet.nextRow();

       templet.addComplex("更新文件数", totalFileField, "address");

       templet.nextRow();

       templet.addComplex("当前文件", currentFileField, "address");

       templet.nextRow();

       templet.addComplex("下载地址", addressField, "address");

       templet.nextRow();

       templet.addComplex("保存路径", localFilePathField, "localFilePathField");

       templet.nextRow();

       templet.addComplex("线程数", threadNumField, "threadNum");

       templet.nextRow();

       templet.addComplex("下载速度", speedField, "threadNum");

       templet.nextRow();

       templet.addLabel(new JLabel("完成百分比"));

       templet.addCompnent(progressBar, 1);

       run.addActionListener(new ActionListener()

        {

            public void actionPerformed(ActionEvent e)

            {

              download();

            }

        });

       stop = new JButton("暂停下载");

       stop.addActionListener(new ActionListener()

        {

           public void actionPerformed(ActionEvent e)

           {

              stopDown();

           }

       });

       templet.addButton(run);

       templet.addButton(stop);

       this.getContentPane().add(templet.getFace());

       this.getContentPane().setVisible(true);

    }

    private JScrollPane getInfoPanel()

    {

       JScrollPane content = new JScrollPane(this.textArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

       content.setPreferredSize(new Dimension(360, 100));

       return content;

    }

    /**

     * 停止下载

     */

    public void stopDown()

    {

       run.setEnabled(true);

       dm.stopDown();

    }

    /**

     * 响应下载按钮事件,启动下载主线程

     */

    public void download()

    {

       dm=new DownloadMain(this,Integer.parseInt(threadNumField.getText()),updateService);

       dm.start();

       run.setEnabled(false);

    }

    public static void main(String[] args)

    {

       new DownloadFrame().setVisible(true);

    }

}






















/**
* 下载线程
* @author zean
* @create date 2008-06-25
*/
public class DownThread extends Thread

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -