注意:文章中使用的代碼沒有公用類,如直接使用會報錯。若想使用,請自己創建一個PUBLIC,如不知如何創建,建議回頭看看JAVA基礎部分,本文著重解釋原理。
原文作者:于洪斌、馬俊光、車雪松
一、java與網絡通信
java是一門適合于分布式計算環境、尤其是Internet程序設計的語言。這不僅僅在于java具有很好的安全性和可移植性,還在于java為Internet編程提供了豐富的網絡類庫支持。利用這些網絡類庫,可以輕松編寫多種類型的網絡通信程序。
?
TCP/IP協議是當今最流行的協議,也是Internet的基礎協議,它代表的是一個協議集合。除傳輸控制協議TCP和網際協議IP外,TCP/IP協議集還包括其他一些協議,如UDP、FTP、UUCP、ICMP等。
一般的TCP/IP網絡數據通信主要可分為兩種不同的通信協議,一種是面向連接的通信協議,這種傳輸方式在數據傳送前必須先在兩端建立連接,并且所傳送的數據不會丟失,這種方式稱為TCP,也稱為Stream;另一種方式則是面向非連接方式,即傳送數據前,并不必先建立連接,而是將所要傳送的數據包成一個分組再傳送,使用這種方式,由于沒有額外的控制,所以傳送的數據可能丟掉。這種方式稱為UDP,也稱為Datagram。
?
TCP和UDP都是傳輸層上的通信協議,也是一般TCP/IP網絡上最常使用的通信協議,且各有其用途,如TCP較可靠,所以用在不允許數據丟失的應用上。而UDP則較多應用于處理速度要求較快、數據傳輸可靠性要求不是很高的應用上,如數據廣播。在java中也支持這兩種不同的協議,對它們的支持是以類庫的形式提供的。通過Socket和ServerSocket類提供了對TCP通信的支持,對于UDP通信則提供了DatagramSocket和DatagramPacket類。它們都包含在java.net類庫中。本文中,我們主要探討TCP通信程序的寫法,而UDP通信程序的寫法與此類似。
?
二、通信程序的編寫
在進一步討論之前,我們先來看看Socket和ServerSocket類的定義(表1)和(表2),關于這兩個類的詳細內容請見sun公司的JDK或microsoft公司VJ++ 1.1的聯機文檔。
要使用上面所提供的功能編寫網絡通信程序,我們可以將要通信的兩端分成服務器和客戶機端,即建立所謂的客戶機/服務器編程模式。在服務器端必須先建立一個ServerSocket對象,然后等待客戶機端的訪問。而在客戶機端,則是建立一個Socket對象直接跟服務器端連接,如果連接建立成功,則服務器端便會產生一個Socket對象,然后我們就可以利用這個Socket對象跟客戶機端的Socket對象溝通了。此時在服務器和客戶機之間建立了一條可靠連接,客戶機和服務器可以在這條連接上可靠的傳送數據。客戶機發出請求,服務器監聽來自客戶機的請求,并為客戶機提供相應的服務。
?
基于上述原理,我們編寫了簡單的客戶機/服務器模式的網絡通信程序。在服務器端,服務器監聽客戶機的請求,為每個客戶機請求建立Socket連接,從而為客戶機提供服務。而所提供的服務只是讀取來自客戶機的一行文本,并把它發回給客戶機。以下是服務器端的通信程序。

??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

113

114

115

116

117

118



119

120



121

122



123

124

125

126

127

128



129

130

131

132

133

134

135

136

137

138

139

140



141

142

143

144

145

146



147

148

149

150

151

152



153

154

155

156

157

158

159

160

161

162

?
在上面的程序中,我們使用了多線程機制。javaserver和service對象本身都是一個線程。javaserver對象首先創建一個ServerSocket對象,并啟動線程的運行。它的run()方法用于監聽來自客戶機的連接。每當有一個新的客戶機連接時,ServerSocket就會創建一個新的Socket類實例,并創建一個service對象,同時啟動這個對象的線程。每個service對象用于完成與客戶機通信、提供服務的任務。這樣服務器可以同時與多個客戶機連接,同時為多個客戶機提供服務。當從標準輸入中接收到quit字符串時,服務器退出運行。
在客戶機端,首先創建一個Socket對象,用于與服務器通信。它從標準輸入中讀取數據,把這些數據傳給服務器,再從服務器讀取應答信息,然后把這些應答信息寫到標準輸出。當讀取了5行的數據后,客戶機程序將退出運行。以下是客戶機端的通信程序。

?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

三、結束語
通過以上的討論可知,用java語言編寫網絡通信程序非常簡單,這主要是因為java語言本身就是一門面向網絡編程的語言。java提供了多個可用于訪問標準Internet協議的類庫,從而支持多種Internet協議,包括:FTP,HTTP,NNTP和WWW等,這極大的簡化了網絡程序設計,可以比較方便的編寫出功能完善的應用程序。
以上只是我們對java語言進行網絡通信程序設計的粗淺討論。利用java語言進行程序設計的好處不一而論,愿我們能起到拋磚引玉的作用。
地震讓大伙知道:居安思危,才是生存之道。
