📄 duoxancheng.txt
字号:
先说下思路吧
主要类包括
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 + -