u 上传注册部分:改为RobFtp上传程序。
1.原有的upload包中含有3个类,分别是knowledgeRegister,splitInfo,upload,。
其中knowledgeRegister类是主程序,负责启动upload类,并且做一些初始化工作。
splitInfo类是程序的核心,负责分片传输的功能。
upload类进行FTP连接和登录,也完成上传分片后的重新组合功能。
程序流程为:
2.吸取原有程序的思想:
从aes.ini文件中读取zip文件名esName和文件路径esPath,
写入哈希表中:
HashMap map;
map.put(esName,esPath);
用户注册上传时从下拉列表jComboBox中读取esName变量,
esName=(String)jComboBox.getSelectedItem();
esPath=(String)map.get(esName);
3. 将原有程序全部重写后的upload包中含有3个类,分别是RobFtp,RobFrame,RobHelp。
1.RobFtp:程序入口类,进行容器的布局,并且引出主程序 new RobFrame()
类图描述为:
2.RobFrame:类图为:主程序,
Ø Swing设计:菜单分为3部分:分别为“文件”,“风格”,“帮助”。
面板布局分为3部分:FTP设置,选择欲注册知识库,进行上传。
Ø 上传部分:采用两种方式,用户选择其一。
直接传输方式:传输速度快,但是如果网络不稳定,或是发生其他意外情况,传输将被中断,必须从头开始再传输。
断点续传方式:如果网络中断,或是用户自己进行中断,点击“注册”按钮后可以从中断处继续,适合于网络不稳定的地区。传输速度较慢。
Ø 用户使用方法:
进行FTP设置:填写IP地址,端口,用户名,密码,如果没有用户名和密码,请选择匿名方式。然后点击“连接”按钮,连接至服务器。
选择欲注册知识库:在下拉列表中选择想要注册的知识库。
传输方式选择:用户可以根据情况任选一种方式:直接传输方式或断点续传方式。
类图描述为:
3.RobHelp:程序帮助文档,网页形式,目前框架已经搭好,主页面可以显示,但其中文字部分显示不出,不知为何?下面将要解决
类图描述为:
4. 程序主要实现:
这里只简要说明断点续传部分:
将upload定义为一个线程,这样可以使得多个用户同时向服务器发出请求,并行处理。
Thread thread=new Thread(){
public void run(){
upload();}
};
thread.start();
连接至服务器之后,登录,然后在服务器的虚拟目录上建立目录:一级目录为用户名,二级目录为欲注册知识库名。
try{
String a=ftpClient.pwd();
System.out.println(a);
if(a.compareTo("/"+user+"/"+fileTitle)!=0&&a.compareTo("/"+user)!=0&&a.compareTo("//"+user+"/"+fileTitle)!=0)
{
try{ftpClient.chdir(user);}
catch(Exception e){
try{
ftpClient.mkdir(user);
ftpClient.chdir(user);
}catch(Exception e1){
uploadLabel.setText("创建目录失败!");
JOptionPane.showMessageDialog(this,"无法创建目录,请稍后再注册。");
return;
}
}
try{
ftpClient.chdir(fileTitle);
}catch(Exception e){
try{
ftpClient.mkdir(fileTitle) ;
ftpClient.chdir(fileTitle);
ftpClient.setType(FTPTransferType.BINARY);
}catch(Exception e1){
uploadLabel.setText("创建目录失败!");
JOptionPane.showMessageDialog(this,"无法创建目录,请稍后再注册。");
return;
}
}
}}catch(Exception e1){
uploadLabel.setText("无法创建目录,出错!");}
进行断点续传:分片大小为static final int rob=512;用变量start记录断点位置信息,可以进行用户中断和网络异常中断。点击“注册”按钮后,程序会自动读取断点信息,从上传断点处恢复,继续上传过程。
try{
f1=new RandomAccessFile(esPathFile,"r");
if(start==0)
{f1.seek(start*rob);System.out.println(start+"开始点1");}
else{f1.seek(start*rob);
System.out.println(start+"开始点2");}
byte[] buffer=new byte[rob];
bUpload=true;
int esPathFileSize=(int)esPathFile.length();
jProgressBar.setMaximum(esPathFileSize);
jProgressBar.setValue(0);
while(true) {
if(bUpload){
int bytes=f1.read(buffer);
if(bytes<0)
break;
ftpClient.put(buffer,remoteFile,true);//需要处理?等等
start++;
iStep+=bytes;
jProgressBar.setValue(iStep);
}else{
uploadLabel.setText("注册已被你中断!");
JOptionPane.showMessageDialog(this,"注册已被你中断,请继续完成注册!");
break;
}
}
f1.close();
}
catch(Exception el){
el.printStackTrace();
uploadLabel.setText("网络中断!");
JOptionPane.showMessageDialog(this,"网络中断,请稍后继续完成注册!");
try{
// f=new RandomAccessFile(esPathInfoFile,"rw");
// f.writeInt(start);
System.out.println(start+"网络中断!");
// f.close();
f1.close();
jButton3.setEnabled(true);
jButton4.setEnabled(false);
}
catch(Exception ew){ew.printStackTrace();}
}
其中进度条jProgressBar可以显示上传进度,中断亦可。
4. 软件screenshot:
5. 小结:
上传注册部分已基本完成。现在对java也只是刚刚入门,初步感觉内容太多,难点也太多,遇到问题自己很难解决或者要花很长时间摸索,要编出像样的程序还是困难。下面的计划是修改监控部分monitor,这部分因为不仅牵扯到网络,而且有数据库接口部分,难度可能较大。