上次寫完(一)實現總體說明后,一直想把源碼放上來,但一直沒有時間,今天趁周末把這個寫完整,今天主要是附上實現源碼,供有需要的朋友參考,當然也希望大家多多指教。上篇文章講到了這個實現是基于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

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

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

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

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