歡迎光臨! 閑聊 QQ:1074961813
注意:文章中使用的代碼沒有公用類,如直接使用會報錯。若想使用,請自己創(chuàng)建一個PUBLIC,如不知如何創(chuàng)建,建議回頭看看JAVA基礎部分,本文著重解釋原理。
原文作者:于洪斌、馬俊光、車雪松
一、java與網(wǎng)絡通信
java是一門適合于分布式計算環(huán)境、尤其是Internet程序設計的語言。這不僅僅在于java具有很好的安全性和可移植性,還在于java為Internet編程提供了豐富的網(wǎng)絡類庫支持。利用這些網(wǎng)絡類庫,可以輕松編寫多種類型的網(wǎng)絡通信程序。
?
TCP/IP協(xié)議是當今最流行的協(xié)議,也是Internet的基礎協(xié)議,它代表的是一個協(xié)議集合。除傳輸控制協(xié)議TCP和網(wǎng)際協(xié)議IP外,TCP/IP協(xié)議集還包括其他一些協(xié)議,如UDP、FTP、UUCP、ICMP等。
一般的TCP/IP網(wǎng)絡數(shù)據(jù)通信主要可分為兩種不同的通信協(xié)議,一種是面向連接的通信協(xié)議,這種傳輸方式在數(shù)據(jù)傳送前必須先在兩端建立連接,并且所傳送的數(shù)據(jù)不會丟失,這種方式稱為TCP,也稱為Stream;另一種方式則是面向非連接方式,即傳送數(shù)據(jù)前,并不必先建立連接,而是將所要傳送的數(shù)據(jù)包成一個分組再傳送,使用這種方式,由于沒有額外的控制,所以傳送的數(shù)據(jù)可能丟掉。這種方式稱為UDP,也稱為Datagram。
TCP和UDP都是傳輸層上的通信協(xié)議,也是一般TCP/IP網(wǎng)絡上最常使用的通信協(xié)議,且各有其用途,如TCP較可靠,所以用在不允許數(shù)據(jù)丟失的應用上。而UDP則較多應用于處理速度要求較快、數(shù)據(jù)傳輸可靠性要求不是很高的應用上,如數(shù)據(jù)廣播。在java中也支持這兩種不同的協(xié)議,對它們的支持是以類庫的形式提供的。通過Socket和ServerSocket類提供了對TCP通信的支持,對于UDP通信則提供了DatagramSocket和DatagramPacket類。它們都包含在java.net類庫中。本文中,我們主要探討TCP通信程序的寫法,而UDP通信程序的寫法與此類似。
二、通信程序的編寫
在進一步討論之前,我們先來看看Socket和ServerSocket類的定義(表1)和(表2),關于這兩個類的詳細內(nèi)容請見sun公司的JDK或microsoft公司VJ++ 1.1的聯(lián)機文檔。
要使用上面所提供的功能編寫網(wǎng)絡通信程序,我們可以將要通信的兩端分成服務器和客戶機端,即建立所謂的客戶機/服務器編程模式。在服務器端必須先建立一個ServerSocket對象,然后等待客戶機端的訪問。而在客戶機端,則是建立一個Socket對象直接跟服務器端連接,如果連接建立成功,則服務器端便會產(chǎn)生一個Socket對象,然后我們就可以利用這個Socket對象跟客戶機端的Socket對象溝通了。此時在服務器和客戶機之間建立了一條可靠連接,客戶機和服務器可以在這條連接上可靠的傳送數(shù)據(jù)。客戶機發(fā)出請求,服務器監(jiān)聽來自客戶機的請求,并為客戶機提供相應的服務。
基于上述原理,我們編寫了簡單的客戶機/服務器模式的網(wǎng)絡通信程序。在服務器端,服務器監(jiān)聽客戶機的請求,為每個客戶機請求建立Socket連接,從而為客戶機提供服務。而所提供的服務只是讀取來自客戶機的一行文本,并把它發(fā)回給客戶機。以下是服務器端的通信程序。
在上面的程序中,我們使用了多線程機制。javaserver和service對象本身都是一個線程。javaserver對象首先創(chuàng)建一個ServerSocket對象,并啟動線程的運行。它的run()方法用于監(jiān)聽來自客戶機的連接。每當有一個新的客戶機連接時,ServerSocket就會創(chuàng)建一個新的Socket類實例,并創(chuàng)建一個service對象,同時啟動這個對象的線程。每個service對象用于完成與客戶機通信、提供服務的任務。這樣服務器可以同時與多個客戶機連接,同時為多個客戶機提供服務。當從標準輸入中接收到quit字符串時,服務器退出運行。
在客戶機端,首先創(chuàng)建一個Socket對象,用于與服務器通信。它從標準輸入中讀取數(shù)據(jù),把這些數(shù)據(jù)傳給服務器,再從服務器讀取應答信息,然后把這些應答信息寫到標準輸出。當讀取了5行的數(shù)據(jù)后,客戶機程序?qū)⑼顺鲞\行。以下是客戶機端的通信程序。
三、結(jié)束語
通過以上的討論可知,用java語言編寫網(wǎng)絡通信程序非常簡單,這主要是因為java語言本身就是一門面向網(wǎng)絡編程的語言。java提供了多個可用于訪問標準Internet協(xié)議的類庫,從而支持多種Internet協(xié)議,包括:FTP,HTTP,NNTP和WWW等,這極大的簡化了網(wǎng)絡程序設計,可以比較方便的編寫出功能完善的應用程序。
以上只是我們對java語言進行網(wǎng)絡通信程序設計的粗淺討論。利用java語言進行程序設計的好處不一而論,愿我們能起到拋磚引玉的作用。