編寫網(wǎng)絡通信程序論文

時間:2022-07-14 09:08:00

導語:編寫網(wǎng)絡通信程序論文一文來源于網(wǎng)友上傳,不代表本站觀點,若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。

編寫網(wǎng)絡通信程序論文

摘要本文闡述了使用JAVA編程語言對基于客戶/服務器模式的應用編寫網(wǎng)絡通信程序,討論了SOCKET機制、輸入輸出流以及程序實現(xiàn)代碼。

關鍵詞JAVA,網(wǎng)絡,SOCKET,APPLET

網(wǎng)絡上的系統(tǒng)結構多為客戶/服務器模式,服務器端負責數(shù)據(jù)和圖像等的存儲、維護、管理以及傳遞,客戶端則負責人機界面的操作、送出需求及顯示收回的數(shù)據(jù)。

下面介紹一下如何使用JAVA來進行網(wǎng)絡編程:

1)由于客戶端通過IE同服務器建立聯(lián)系,所以客戶端使用Applet,服務器端使用Application;

2)服務器應設置成多線程,應答多個客戶的請求;

3)兩端通信使用SOCKET機制。

1Java中輸入/輸出流概念:

過濾流DataInputStream和DataOutputStream除了分別作為FilterInputStream和FilterOutputStream的子類外,還分別實現(xiàn)了接口DataInput和DataOutput。接口DataInput中定義的方法主要包括從流中讀取基本類型的數(shù)據(jù)、讀取一行數(shù)據(jù)、或者讀取指定長度的字節(jié)數(shù),如readBoolean()readInt()、readLine()、readFully()等。接口DataOutput中定義的方法主要是向流中寫入基本類型的數(shù)據(jù)或者寫入一定長度的字節(jié)數(shù)組,如writeChar()、writeDouble()DataInputStream可以從所連接的輸入流中讀取與機器無關的基本類型數(shù)據(jù),用以實現(xiàn)一種獨立于具體平臺的輸入方式;DataInputStream可以向所連接的輸出流寫入基本類型的數(shù)據(jù)。

2Socket機制

Socket是面向客戶/服務器模型設計的,網(wǎng)絡上的兩個程序通過一個雙向的通訊連接實現(xiàn)數(shù)據(jù)的交換,這個雙向鏈路的一端稱為一個Socket。Socket通常用來實現(xiàn)客戶方和服務方的連接。客戶程序可以向Socket寫請求,服務器將處理此請求,然后通過Socket將結果返回給用戶。

Socket通信機制提供了兩種通訊方式:有聯(lián)接和無聯(lián)接方式,分別面向不同的應用需求。使用有聯(lián)接方式時,通信鏈路提供了可靠的,全雙工的字節(jié)流服務。在該方式下,通信雙方必須創(chuàng)建一個聯(lián)接過程并建立一條通訊鏈路,以后的網(wǎng)絡通信操作完全在這一對進程之間進行,通信完畢關閉此聯(lián)接過程。使用無聯(lián)接方式時其系統(tǒng)開銷比無聯(lián)接方式小,但通信鏈路提供了不可靠的數(shù)據(jù)報服務,不能保證信源所傳輸?shù)臄?shù)據(jù)一定能夠到達信宿。在該方式下,通信雙方不必創(chuàng)建一個聯(lián)接過程和建立一條通訊鏈路,網(wǎng)絡通信操作在不同的主機和進程之間轉發(fā)進行。

3Java語言

Java語言的優(yōu)點主要表現(xiàn)在:簡單、面向對象、多線程、分布性、體系結構中立、安全性等方面。

(1)簡單性

Java與C++語言非常相近,但Java比C++簡單,它拋棄了C++中的一些不是絕對必要的功能,如頭文件、預處理文件、指針、結構、運算符重載、多重繼承以及自動強迫同型。Java實現(xiàn)了自動的垃圾收集,簡化了內存管理的工作。這使程序設計更加簡便,同時減少了出錯的可能。

(2)面向對象

Java提供了簡單的類機制和動態(tài)的構架模型。對象中封裝了它的狀態(tài)變量和方法,很好地實現(xiàn)了模塊化和信息隱藏;而類則提供了一類對象的原型,通過繼承和重載機制,子類可以使用或重新定義父類或超類所提供的方法,從而既實現(xiàn)了代碼的復用,又提供了一種動態(tài)的解決方案。

Java是一種完全面向對象的程序設計語言,它除了數(shù)組、布爾和字符三個基本數(shù)據(jù)類型外的其它類都是對象,它不再支持全局變量。在Java中,如果不創(chuàng)建新類就無法創(chuàng)建程序,Java程序在運行時必須先創(chuàng)建一個類的實例,然后才能提交運行。

Java同樣支持繼承特性,Java的類可以從其它類中繼承行為,但Java只支持類的單重繼承,即每個類只能從一個類中繼承。

Java支持界面,界面允許程序員定義方法但又不立即實現(xiàn),一個類可以實現(xiàn)多個界面,利用界面可以得到多重繼承的許多優(yōu)點而又沒有多重繼承的問題。

(3)多線程

多線程使應用程序可以同時進行不同的操作,處理不同的事件。在多線程機制中,不同的線程處理不同的任務,他們之間互不干涉,不會由于一處等待影響其他部分,這樣容易實現(xiàn)網(wǎng)絡上的實時交互操作。

Java程序可以有多個執(zhí)行線程,如可以讓一個線程進行復雜的計算,而讓另一個線程與用戶進行交互,這樣用戶可以在不中斷計算線程的前提下與系統(tǒng)進行交互。多線程保證了較高的執(zhí)行效率。

(4)分布性

Java是面向網(wǎng)絡的語言。通過它提供的類庫可以處理TCP/IP協(xié)議,用戶可以通過URL地址在網(wǎng)絡上很方便的訪問其他對象。

(5)體系結構中立

Java是一種網(wǎng)絡語言,為使Java程序能在網(wǎng)絡的任何地方運行,Java解釋器生成與體系結構無關的字節(jié)碼結構的文件格式。Java為了做到結構中立,除生成機器無關的字節(jié)碼外,還制定了完全統(tǒng)一的語言文本,如Java的基本數(shù)據(jù)類型不會隨目標機的變化而變化,一個整型總是32位,一個長整型總是64位。

為了使Java的應用程序能不依賴于具體的系統(tǒng),Java語言環(huán)境還提供了用于訪問底層操作系統(tǒng)功能的類組成的包,當程序使用這些包時,可以確保它能運行在各種支持Java的平臺上。

java.lang:一般的語言包。其中包括用于字符串處理、多線程、異常處理和數(shù)字函數(shù)等的類,該包是實現(xiàn)Java程序運行平臺的基本包

java.util:實用工具包。其中包括哈希表、堆棧、時間和日期等

java.io:基于流模型的輸入/輸出包。該包用統(tǒng)一的流模型實現(xiàn)了各種格式的輸入/輸出,包括文件系統(tǒng)、網(wǎng)絡和設備的輸入/輸出等

:網(wǎng)絡包。該包支持TCP/IP協(xié)議,其中提供了socket、URL和WWW的編程接口

java.awt:抽象窗口工具集。其中實現(xiàn)了可以跨平臺的圖形用戶界面組件,包括窗口、菜單、滾動條和對話框等

java.applet:支持applet程序設計的基本包

(6)安全性

用于網(wǎng)絡、分布環(huán)境下的Java必須要防止病毒的入侵,Java不支持指針,一切對內存的訪問都必須通過對象的實例變量來實現(xiàn),這樣就防止了程序員使用欺騙手段訪問對象的私有成員,同時也避免了指針操作中容易產(chǎn)生的錯誤。

4JAVA工具

(1)JDK

1)Java編譯器

Java編譯器將Java源代碼文件編譯成可執(zhí)行的Java字節(jié)碼。Java源代碼文件的擴展名為.java,Java編譯器把這種擴展名的文件編譯成擴展名為.class的文件。源文件中的每個類在編譯后都將產(chǎn)生一個class文件,這意味一個Java源代碼文件可能編譯生成多個class文件。

2)Java解釋器

Java解釋器對編譯生成的字節(jié)碼格式的可執(zhí)行程序的運行提供支持,它是運行非圖形Java程序的命令行工具。

3)Appletviewer

它是JavaApplet的簡單測試工具,可使用它來測試JavaApplet程序,而不需要WWW瀏覽器的支持。

(2)VisualJ++

VisualJ++集成了可視化界面設計、交互式調試、代碼編輯、聯(lián)機幫助信息和介紹如何快速掌握該開發(fā)環(huán)境的實用向導等多項功能,同時具有能充分利用ActiveX和COM新技術的優(yōu)勢。利用VisualJ++可創(chuàng)建交互性很強的Internet應用程序,是難得的Java開發(fā)系統(tǒng)。

5客戶機/服務器通信的實現(xiàn):

(1)Application同Applet的通信

兩端通過Socket機制進行連接:

1)客戶端的編程流程:

?打開Socket,新建一個套接字;

?為套接字建立一個輸入和輸出流;

?根據(jù)服務器協(xié)議從套接字讀入或向套接字寫入;

?清除套接字和輸入/輸出流;

2)服務器端的編程流程:

?打開ServerSocket,創(chuàng)建一個服務器型套接字和一個普通套接字,服務器型套接字在指定端口為客戶端請求的Socket服務;

?使用ServerSocket類的accept()方法使服務器型套接字處于監(jiān)聽狀態(tài)并把監(jiān)聽結果返回給普通套接字;

?為該普通套接字創(chuàng)建輸入和輸出流;

?從輸入和輸出流中讀入或寫入字節(jié)流,進行相應的處理,并將結果返回給客戶端;

?在客戶端和服務器工作結束后關閉所有的對象,如服務器型的套接字,普通套接字,輸入和輸出流。

正是由于Java系統(tǒng)具有基于Socket的靈活通信機制,因而其應用程序能自由地打開和訪問網(wǎng)絡上的對象,就象在本地文件系統(tǒng)中一樣。

(2)Applet之間的通信:

Applet之間的通信使用AppletContext類的getApplet()方法。

<appletcode=applet1.classwidth=200height=200name=first>

只要在程序中加入

Appletoneapplet=getAppletContext().getApplet(“first”);便可使用name為first的Applet中的方法了。

在該課題中大量使用了該種通信方法,因為專門同服務器端通信的Applet中包含接收信息方法和發(fā)送信息方法,所有客戶端的Applet都要使用負責通信的Applet中的方法,所以客戶端的Applet同負責通信的Applet必須進行通信。

6程序

//服務器端程序S.java負責與客戶端通信

importjava.io.*;

.*;

importjava.lang.*;

importT2;

classThreadEchoHandlerextendsThread//創(chuàng)建線程

{

T2theT2=newT2();

Socketincoming;

intcounter;

ThreadEchoHandler(Socketi,intc)

{incoming=i;

counter=c;}

publicvoidrun()

{

try

{

DataInputStreamin=newDataInputStream(incoming.getInputStream());

DataOutputStreamout=newDataOutputStream(incoming.getOutputStream());

System.out.println("hello");

booleandone=false;

while(!done)

{Stringaa="";

Stringstr=in.readUTF();//從客戶端得到字符串

//在此加入各自的服務程序

System.out.println(str);

theT2.pass(str);//解碼

theT2.tongji();//修改監(jiān)控庫中的信息

aa=theT2.guan();//操縱數(shù)據(jù)庫

System.out.println("stringzis:"+aa);

if(pareTo("null")!=0)

//若是查詢數(shù)據(jù)庫,返回查詢后的結果

{//若不是查詢數(shù)據(jù)庫,不向客戶端輸出信息

out.writeUTF(aa);

out.flush();}

}//while

incoming.close();//線程關閉

}//try

catch(IOExceptione)

{System.out.println(e);}

}//endrun

}

//----------------------------------------

classS

{

publicstaticvoidmain(String[]args)

{

inti=1;

try

{

ServerSockets=newServerSocket(1111);

for(;;)

{

Socketincoming=s.accept();

System.out.println("connect:"+i);

newThreadEchoHandler(incoming,i).start();

i++;

}

}

catch(Exceptione)

{System.out.println(e);}

}

}

//客戶端通信小應用程序Echo.java

importjava.io.*;

.*;

importjava.awt.*;

importjava.applet.*;

publicclassEchoextendsApplet

{

TextAreata;

SocketechoSocket;

DataOutputStreamos;

DataInputStreamis;

StringLine;

publicvoidinit()

{

setBackground(Color.white);

ta=newTextArea(5,80);

ta.setEditable(false);

add(ta);

try

{echoSocket=newSocket("10.102.4.41",1111);}//與服務器建立連接

catch(IOExceptione)

{System.out.println("error");}

}

publicvoidst(Stringstri)//發(fā)送字符串的方法

{

try

{DataOutputStreamos=newDataOutputStream(echoSocket.getOutputStream());

DataInputStreamis=newDataInputStream(echoSocket.getInputStream());

os.writeUTF(""+stri);//向服務器輸送string

os.flush();

}

catch(IOExceptione)

{System.out.println("error:"+e);}

}

publicStringst1()//接收字符串的方法

{

StringLine="";

try

{DataOutputStreamos=newDataOutputStream(echoSocket.getOutputStream());

DataInputStreamis=newDataInputStream(echoSocket.getInputStream());

Line=is.readUTF();//從服務器讀來的信息

ta.appendText(""+Line);//在文本域中輸出信息

}

catch(IOExceptione)

{System.out.println("error:"+e);}

returnLine;

}

}

7程序調試心得:

1)在建立Socket連接時,兩端的端口號必須設為一致,否則建立不了連接。服務器端必須有主機IP地址或主機名參數(shù)。

2)連接建立好之后應確定輸入和輸出流。起初程序中用的是DataInputStream和PrintStream,結果只能傳輸英文,傳輸中文時產(chǎn)生亂碼,將PrintStream改為DataOutputStream,使用readUTF()和writeUTF()方法后,中文傳輸問題得到解決。

3)如果一個使用某端口的程序沒有關閉,另一個程序就不能使用這個端口。

4)開始進行通信的程序均為Application,因不符合客戶機/服務器機制,應將客戶端的Application改為Applet。其轉化的主要步驟如下:

?創(chuàng)建一個包含APPLET標簽的HTML文件;

?去掉應用程序中的main()方法;

?類名應繼承Applet類,而不是Frame類,并在程序開頭加入

importjava.applet.*;語句;

?用init()方法代替Application程序中的構造方法,當瀏覽器創(chuàng)建Applet類對象的時候,它自動執(zhí)行init()方法;

?如Application中缺省使用了BorderLayout布局管理器,應在Applet的init()方法中重新設定;

?如果Application中有setTitle()方法,必須將其去掉,如Application中使用了菜單,在Applet中用按鈕來替換。

5)懂得了在一程序中如何引用自定義的類中的方法和變量,在程序開頭加入import類名;在程序中加入類名實例=new類名();然后使用

實例.方法(),實例.變量即可。

參考文獻:

[1]廖雷等,Java程序設計教程,中國電力出版社,2003

[2]Warton,Java多線程編程初步,電腦報,2004.4.10

[3]張立等,基于Client/Server模式的數(shù)據(jù)庫應用軟件的設計與實現(xiàn),計算機應用研究,1999(4)