CS结构软件自动升级实现(二)
上次写完(一)实现总体说明后,一直想把源码放上来,但一直没有时间,今天趁周末把这个写完整,今天主要是附上实现源码,供有需要的朋友参考,当然也希望大家多多指教。上篇文章讲到了这个实现是基于SOCKET实现的,当然通讯协议是自定义,上一篇也有朋友说采用http协议比较简单,当然这个也是一种方法,但要使用http协议,则服务端要有http服务这样会导致服务端过于庞大。
本实现包括:
1、AUPD.java 服务端和客户端之间的通讯协议
2、AutoUpdateServer.java 服务端的监听进程
3、AUpdSrvProc.java服务端的服务线程,用于处理客户端的自动升级请求
4、ClientVerParser.java服务端服务线程用于解决客户端版本信息的类
5、AutoUpdateClient.java客户端的自动升级请求进程
6、Config.java用于服务端和客户端读取本地配制文件的类
7、UpdFile.java用于文件传输的文件对像
本实现用dom4j作为解释xml的引擎
AUPD.java :
AutoUpdateServer.java :
避免太大,其他源码见(三)
运行服务端:
java -cp .;.\bin;.\lib\dom4j-1.6.1.jar;.\lib\jaxen-1.1-beta-4.jar com.icbc.autoupdate.AutoUpdateServer
运行客户端:
java -cp ./bin;./lib/jaxen-1.1-beta-4.jar;./lib/dom4j-1.6.1.jar; com.icbc.autoupdate.AutoUpdateClient
本实现包括:
1、AUPD.java 服务端和客户端之间的通讯协议
2、AutoUpdateServer.java 服务端的监听进程
3、AUpdSrvProc.java服务端的服务线程,用于处理客户端的自动升级请求
4、ClientVerParser.java服务端服务线程用于解决客户端版本信息的类
5、AutoUpdateClient.java客户端的自动升级请求进程
6、Config.java用于服务端和客户端读取本地配制文件的类
7、UpdFile.java用于文件传输的文件对像
本实现用dom4j作为解释xml的引擎
AUPD.java :
1
/** */
/********************************************************************
2 * 项目名称 :rochoc<p>
3 * 包名称 :com.rochoc.autoupdate<p>
4 * 文件名称 :AutoUpdProtocol.java<p>
5 * 编写者 :kfzx-luoc<p>
6 * 编写日期 :2008-12-22<p>
7 * 程序功能(类)描述 :<p>
8 * 定义自动升级客户端与服务端的通讯协议
9 * 程序变更日期 :
10 * 变更作者 :
11 * 变更说明 :
12********************************************************************/
13 package com.rochoc.autoupdate;
14
15 /** */ /**
16 * @author kfzx-luoc
17 *
18 * TODO To change the template for this generated type comment go to
19 * Window - Preferences - Java - Code Style - Code Templates
20 */
21 public class AUPD
22 {
23 /** *//**
24 * 无意义操作
25 */
26 public static final String NONE = "NONE ";
27
28 /** *//**
29 * 发送客户端版本信息
30 */
31 public static final String SEND_CLIENT_VERSION = "SENDCVER";
32
33 /** *//**
34 * 接收客户端版本信息
35 */
36 public static final String RECEIVED_CLIENT_VERSION = "RECDCVER";
37
38 /** *//**
39 * 发送文件全路径
40 */
41 public static final String SEND_FILE_ABSOULT = "SENDFILE";
42
43 /** *//**
44 * 接收文件全路径
45 */
46 public static final String RECEIVED_FILE_ABSOULT = "RECDFILE";
47
48 /** *//**
49 * 开始文件传输
50 */
51 public static final String START_TRANSMIT = "STARTTSM";
52
53 /** *//**
54 * 结束文件传输
55 */
56 public static final String TERMINATE_TRANSMIT = "TERMTSMT";
57
58 /** *//**
59 * 更新失败
60 */
61 public static final String UPDATED_FAILURE = "UPDEFAIL";
62
63 /** *//**
64 * 更新成功
65 */
66 public static final String UPDATED_SUCCESSFUL = "UPDESUCC";
67
68 /** *//**
69 * 无需更新
70 */
71 public static final String NOTNEED_UPDATED = "NNEEDUPD";
72
73 /** *//**
74 * 已经准备好接收更新文件
75 */
76 public static final String READY_TO_UPDATE = "READYTUP";
77
78 /** *//**
79 * 结束链接
80 */
81 public static final String BYE = "BYEBYEOK";
82
83 /** *//**
84 * 数据区OFFSET
85 */
86 public static final int DATA_OFFSET = 5;
87
88 /** *//**
89 * 文件数据块大小
90 */
91 public static final int DATA_SIZE = 1024;
92
93 /** *//**
94 * 发送缓冲区大小
95 */
96 public static final int BUFFER_SIZE = DATA_SIZE + 1 + 4; // [0]位是标志位,区分数据和命令 + 4位长度
97
98 /** *//**
99 * 数据段标识
100 */
101 public static final int MARK_DATA_SECT = 0;
102 /** *//**
103 * 命令段标识
104 */
105 public static final int CMD_DATA_SECT = 1;
106
107 /** *//**
108 * 数据段结束标识
109 */
110 public static final int MARK_DATA_END = 127;
111}
112
2 * 项目名称 :rochoc<p>
3 * 包名称 :com.rochoc.autoupdate<p>
4 * 文件名称 :AutoUpdProtocol.java<p>
5 * 编写者 :kfzx-luoc<p>
6 * 编写日期 :2008-12-22<p>
7 * 程序功能(类)描述 :<p>
8 * 定义自动升级客户端与服务端的通讯协议
9 * 程序变更日期 :
10 * 变更作者 :
11 * 变更说明 :
12********************************************************************/
13 package com.rochoc.autoupdate;
14
15 /** */ /**
16 * @author kfzx-luoc
17 *
18 * TODO To change the template for this generated type comment go to
19 * Window - Preferences - Java - Code Style - Code Templates
20 */
21 public class AUPD
22 {
23 /** *//**
24 * 无意义操作
25 */
26 public static final String NONE = "NONE ";
27
28 /** *//**
29 * 发送客户端版本信息
30 */
31 public static final String SEND_CLIENT_VERSION = "SENDCVER";
32
33 /** *//**
34 * 接收客户端版本信息
35 */
36 public static final String RECEIVED_CLIENT_VERSION = "RECDCVER";
37
38 /** *//**
39 * 发送文件全路径
40 */
41 public static final String SEND_FILE_ABSOULT = "SENDFILE";
42
43 /** *//**
44 * 接收文件全路径
45 */
46 public static final String RECEIVED_FILE_ABSOULT = "RECDFILE";
47
48 /** *//**
49 * 开始文件传输
50 */
51 public static final String START_TRANSMIT = "STARTTSM";
52
53 /** *//**
54 * 结束文件传输
55 */
56 public static final String TERMINATE_TRANSMIT = "TERMTSMT";
57
58 /** *//**
59 * 更新失败
60 */
61 public static final String UPDATED_FAILURE = "UPDEFAIL";
62
63 /** *//**
64 * 更新成功
65 */
66 public static final String UPDATED_SUCCESSFUL = "UPDESUCC";
67
68 /** *//**
69 * 无需更新
70 */
71 public static final String NOTNEED_UPDATED = "NNEEDUPD";
72
73 /** *//**
74 * 已经准备好接收更新文件
75 */
76 public static final String READY_TO_UPDATE = "READYTUP";
77
78 /** *//**
79 * 结束链接
80 */
81 public static final String BYE = "BYEBYEOK";
82
83 /** *//**
84 * 数据区OFFSET
85 */
86 public static final int DATA_OFFSET = 5;
87
88 /** *//**
89 * 文件数据块大小
90 */
91 public static final int DATA_SIZE = 1024;
92
93 /** *//**
94 * 发送缓冲区大小
95 */
96 public static final int BUFFER_SIZE = DATA_SIZE + 1 + 4; // [0]位是标志位,区分数据和命令 + 4位长度
97
98 /** *//**
99 * 数据段标识
100 */
101 public static final int MARK_DATA_SECT = 0;
102 /** *//**
103 * 命令段标识
104 */
105 public static final int CMD_DATA_SECT = 1;
106
107 /** *//**
108 * 数据段结束标识
109 */
110 public static final int MARK_DATA_END = 127;
111}
112
AutoUpdateServer.java :
1
/** */
/********************************************************************
2 * 项目名称 :rochoc<p>
3 * 包名称 :com.rochoc.autoupdate<p>
4 * 文件名称 :AutoUpdateServer.java<p>
5 * 编写者 :kfzx-luoc<p>
6 * 编写日期 :2008-12-22<p>
7 * 程序功能(类)描述 :<p>
8 * 自动更新服务端
9 * 程序变更日期 :
10 * 变更作者 :
11 * 变更说明 :
12********************************************************************/
13 package com.rochoc.autoupdate;
14
15 import java.io.IOException;
16 import java.net.ServerSocket;
17 import java.net.Socket;
18
19 /** */ /**
20 * @author kfzx-luoc
21 *
22 * TODO To change the template for this generated type comment go to
23 * Window - Preferences - Java - Code Style - Code Templates
24 */
25 public class AutoUpdateServer extends Thread
26 {
27 private int port = 0;//服务端口号
28 private Config config = Config.getInstance();//配置文件对像
29 private ServerSocket srvSocket = null;
30 public AutoUpdateServer()
31 {
32 port = Integer.parseInt(config.getServerPort());
33 try
34 {
35 srvSocket = new ServerSocket(port);
36 //setTimeout(60000);
37 this.start();
38 Config.print("自动更新服务器在端口'"+port+"'监听");
39 } catch (IOException e)
40 {
41 e.printStackTrace();
42 }
43 }
44 void setTimeout(int millis) throws IOException
45 {
46 if (srvSocket != null)
47 {
48 srvSocket.setSoTimeout(millis);
49 }
50 }
51 void close() throws IOException
52 {
53 if (srvSocket != null)
54 {
55 srvSocket.close();
56 }
57 }
58 /** *//**
59 * @author kfzx-luoc
60 *
61 * 执行监听处理,如果有客户端连接上来,则判断是否需要更新,
62 * 如果需要更新,则给客户端传送最新版本文件
63 */
64 public void run()
65 {
66 try
67 {
68 while (true)
69 {
70 Socket clSocket = null;
71 try
72 {
73 clSocket = srvSocket.accept();
74 Config.print("客户端‘"+clSocket.getInetAddress()+"’连接成功");
75 //进行处理
76 AUpdSrvProc srvP = new AUpdSrvProc(clSocket);
77 srvP.start();
78 } catch (IOException ioe)
79 {
80 try
81 {
82 clSocket.close();
83 } catch (IOException e1)
84 {
85 }
86 Config.print("AutoUpdateServer proc client:"+clSocket.getInetAddress().getHostAddress()+" error,"+ioe);
87 ioe.printStackTrace();
88 }
89 }
90 }catch(Exception e)
91 {
92 Config.print("AutoUpdateServer running error,"+e);
93 e.printStackTrace();
94 } finally
95 {
96 try
97 {
98 srvSocket.close();
99 } catch (IOException e)
100 {
101 }
102 }
103 }
104 //测试主函数
105 public static void main(String args[])
106 {
107 AutoUpdateServer server = new AutoUpdateServer();
108 server.run();
109 }
110}
111
2 * 项目名称 :rochoc<p>
3 * 包名称 :com.rochoc.autoupdate<p>
4 * 文件名称 :AutoUpdateServer.java<p>
5 * 编写者 :kfzx-luoc<p>
6 * 编写日期 :2008-12-22<p>
7 * 程序功能(类)描述 :<p>
8 * 自动更新服务端
9 * 程序变更日期 :
10 * 变更作者 :
11 * 变更说明 :
12********************************************************************/
13 package com.rochoc.autoupdate;
14
15 import java.io.IOException;
16 import java.net.ServerSocket;
17 import java.net.Socket;
18
19 /** */ /**
20 * @author kfzx-luoc
21 *
22 * TODO To change the template for this generated type comment go to
23 * Window - Preferences - Java - Code Style - Code Templates
24 */
25 public class AutoUpdateServer extends Thread
26 {
27 private int port = 0;//服务端口号
28 private Config config = Config.getInstance();//配置文件对像
29 private ServerSocket srvSocket = null;
30 public AutoUpdateServer()
31 {
32 port = Integer.parseInt(config.getServerPort());
33 try
34 {
35 srvSocket = new ServerSocket(port);
36 //setTimeout(60000);
37 this.start();
38 Config.print("自动更新服务器在端口'"+port+"'监听");
39 } catch (IOException e)
40 {
41 e.printStackTrace();
42 }
43 }
44 void setTimeout(int millis) throws IOException
45 {
46 if (srvSocket != null)
47 {
48 srvSocket.setSoTimeout(millis);
49 }
50 }
51 void close() throws IOException
52 {
53 if (srvSocket != null)
54 {
55 srvSocket.close();
56 }
57 }
58 /** *//**
59 * @author kfzx-luoc
60 *
61 * 执行监听处理,如果有客户端连接上来,则判断是否需要更新,
62 * 如果需要更新,则给客户端传送最新版本文件
63 */
64 public void run()
65 {
66 try
67 {
68 while (true)
69 {
70 Socket clSocket = null;
71 try
72 {
73 clSocket = srvSocket.accept();
74 Config.print("客户端‘"+clSocket.getInetAddress()+"’连接成功");
75 //进行处理
76 AUpdSrvProc srvP = new AUpdSrvProc(clSocket);
77 srvP.start();
78 } catch (IOException ioe)
79 {
80 try
81 {
82 clSocket.close();
83 } catch (IOException e1)
84 {
85 }
86 Config.print("AutoUpdateServer proc client:"+clSocket.getInetAddress().getHostAddress()+" error,"+ioe);
87 ioe.printStackTrace();
88 }
89 }
90 }catch(Exception e)
91 {
92 Config.print("AutoUpdateServer running error,"+e);
93 e.printStackTrace();
94 } finally
95 {
96 try
97 {
98 srvSocket.close();
99 } catch (IOException e)
100 {
101 }
102 }
103 }
104 //测试主函数
105 public static void main(String args[])
106 {
107 AutoUpdateServer server = new AutoUpdateServer();
108 server.run();
109 }
110}
111
避免太大,其他源码见(三)
运行服务端:
java -cp .;.\bin;.\lib\dom4j-1.6.1.jar;.\lib\jaxen-1.1-beta-4.jar com.icbc.autoupdate.AutoUpdateServer
运行客户端:
java -cp ./bin;./lib/jaxen-1.1-beta-4.jar;./lib/dom4j-1.6.1.jar; com.icbc.autoupdate.AutoUpdateClient