分布式系統(tǒng)實(shí)驗(yàn)報(bào)告_第1頁
分布式系統(tǒng)實(shí)驗(yàn)報(bào)告_第2頁
分布式系統(tǒng)實(shí)驗(yàn)報(bào)告_第3頁
分布式系統(tǒng)實(shí)驗(yàn)報(bào)告_第4頁
分布式系統(tǒng)實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩46頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

中南大學(xué)分布式系統(tǒng)

實(shí)驗(yàn)報(bào)告目錄(我選做4題,按住Ctrl點(diǎn)擊目錄條可直達(dá),wps下有效)實(shí)驗(yàn)一數(shù)據(jù)包socket應(yīng)用. 4一、實(shí)驗(yàn)?zāi)康? 4二、預(yù)習(xí)與實(shí)驗(yàn)要求. 4三、實(shí)驗(yàn)環(huán)境. 4四、實(shí)驗(yàn)原理. 4五、實(shí)驗(yàn)內(nèi)容. 6六、實(shí)驗(yàn)報(bào)告. 7七、思考題. 7實(shí)驗(yàn)二流式soCket應(yīng)用8TOC\o"1-5"\h\z\o"CurrentDocument"一、實(shí)驗(yàn)?zāi)康? 8\o"CurrentDocument"二、預(yù)習(xí)與實(shí)驗(yàn)要求. 8\o"CurrentDocument"三、實(shí)驗(yàn)環(huán)境. 8\o"CurrentDocument"四、實(shí)驗(yàn)原理. 8\o"CurrentDocument"五、實(shí)驗(yàn)內(nèi)容. 9\o"CurrentDocument"六、實(shí)驗(yàn)報(bào)告. 9七、思考題. 11實(shí)驗(yàn)三客戶/實(shí)驗(yàn)三客戶/服務(wù)器應(yīng)用開發(fā) 11\o"CurrentDocument"一、實(shí)驗(yàn)?zāi)康? 11\o"CurrentDocument"二、預(yù)習(xí)與實(shí)驗(yàn)要求. 11\o"CurrentDocument"三、實(shí)驗(yàn)環(huán)境. 11\o"CurrentDocument"四、實(shí)驗(yàn)原理. 12\o"CurrentDocument"五、實(shí)驗(yàn)內(nèi)容. 12\o"CurrentDocument"六、實(shí)驗(yàn)報(bào)告. 13\o"CurrentDocument"實(shí)驗(yàn)九虛擬機(jī)的使用與Linux系統(tǒng)的安裝 37\o"CurrentDocument"、實(shí)驗(yàn)?zāi)康? 37\o"CurrentDocument"、實(shí)驗(yàn)內(nèi)容和步驟 . 38、實(shí)驗(yàn)結(jié)果. 40實(shí)驗(yàn)一數(shù)據(jù)包socket應(yīng)用實(shí)驗(yàn)一數(shù)據(jù)包socket應(yīng)用一、實(shí)驗(yàn)?zāi)康睦斫鈹?shù)據(jù)包socket的應(yīng)用2.實(shí)現(xiàn)數(shù)據(jù)包socket通信3.了解Java并行編程的基本方法二、預(yù)習(xí)與實(shí)驗(yàn)要求預(yù)習(xí)實(shí)驗(yàn)指導(dǎo)書及教材的有關(guān)內(nèi)容,了解數(shù)據(jù)包socket的通信原理2.熟悉一種javaIDE和程序開發(fā)過程;3.了解下列JavaAPI:Thread、Runnable;4.盡可能獨(dú)立思考并完成實(shí)驗(yàn)。三、實(shí)驗(yàn)環(huán)境a)獨(dú)立計(jì)算機(jī)或計(jì)算機(jī)網(wǎng)絡(luò);b)Windows操作系統(tǒng)。c)Jdk工具包d)JCreatororothers四、實(shí)驗(yàn)原理1.分布式計(jì)算的核心是進(jìn)程通信。操作系統(tǒng)、網(wǎng)卡驅(qū)動(dòng)程序等應(yīng)用從不同抽象層面提供了對(duì)進(jìn)程通信的支持,例如Winsock、*。SocketAPI是一種作為IPC提供對(duì)系統(tǒng)低層抽象的機(jī)制。盡管應(yīng)用人員很少需要在該層編寫代碼,但理解socketAPI非常重要,因?yàn)椋?,高層設(shè)施是構(gòu)建于socket或運(yùn)行于有限資源平臺(tái)上的應(yīng)用來說, socketAPI可能是最適合的。在Internet 網(wǎng)絡(luò)協(xié)議體系結(jié)構(gòu)中,傳輸層上有 UDP和TCP兩種主要協(xié)議,UDP允許在傳送層使用無連接通信傳送,被傳輸報(bào)文稱為數(shù)據(jù)包。(是否存在面向連接的數(shù)據(jù)包socket)因此數(shù)據(jù)包socket是基于UDP的不可靠IPC。Java為數(shù)據(jù)包socketAPI提供兩個(gè)類:(1) 針對(duì)socket的datagramSocket類(2) 針對(duì)數(shù)據(jù)包交換的datagramPacket類希望使用該API發(fā)送和接收數(shù)據(jù)的進(jìn)程須實(shí)例化一個(gè) datagramSocket對(duì)象,每個(gè)socekt被綁定到該進(jìn)程所在及其的某個(gè) UDP端口上。為了向其他進(jìn)程發(fā)送數(shù)據(jù)包,進(jìn)程必須創(chuàng)建一個(gè)代表數(shù)據(jù)包本身的對(duì)象。該對(duì)象通過實(shí)例化一個(gè)datagramsocket對(duì)象創(chuàng)建。在接收者進(jìn)程中,datagramPacket對(duì)象也必須被實(shí)例化并綁定到一個(gè)本地端口上,該端口必須與發(fā)送者數(shù)據(jù)包的定義一致。接收進(jìn)程創(chuàng)建一個(gè)指向字節(jié)數(shù)組的 DatagramPacket,并調(diào)用datagramSocket對(duì)象的receive方法,將DatagramPacket對(duì)象指針作為參數(shù)定義。并行編程(以Java為例1)一個(gè)線程是比進(jìn)程更小的執(zhí)行粒度。 Java虛擬機(jī)允許應(yīng)用程序有多個(gè)執(zhí)行線程同時(shí)運(yùn)行。有兩種方法來創(chuàng)建一個(gè)新線程的執(zhí)行。一個(gè)是聲明一個(gè)類是一個(gè)線程的子類。這個(gè)子類應(yīng)重寫Thread類的run方法。一個(gè)子類的實(shí)例可以被分配和啟動(dòng)。另一種方法創(chuàng)建一個(gè)線程,并同時(shí)聲明一個(gè)類實(shí)現(xiàn)了 Runnable接口(這個(gè)類要實(shí)現(xiàn)run方法)。一個(gè)類的實(shí)例可以被分配并作為參數(shù)傳遞給創(chuàng)建的線程,并啟動(dòng)線程。例如:創(chuàng)建一個(gè)類是Thread的子類:classSomeThreadextendsThread{SomeThread(){publicvoidrun(){}}SomeThreadp=newSomeThread();();創(chuàng)建一個(gè)實(shí)現(xiàn)Runnable接口的類并傳遞給線程:classSomeRunimplementsRunnable{SomeRun(){}publicvoidrun(){}}SomeRunp=newSomeRun(143);newThread(p).start();當(dāng)一個(gè)實(shí)現(xiàn)Runnable接口的類被執(zhí)行時(shí),可以沒有子類。實(shí)例化一個(gè) Thread實(shí)例,并通過自身作為目標(biāo)線程。在大多數(shù)情況下,如果你只打算重寫的run()方法,并沒有其它的線程方法,應(yīng)使用Runnable接口。因?yàn)轭惒粦?yīng)該被繼承,除非程序員有意修改或增強(qiáng)類的基本行為。五、實(shí)驗(yàn)內(nèi)容構(gòu)建客戶端程序(1)構(gòu)建datagramSocket對(duì)象實(shí)例(2)構(gòu)建DatagramPacket對(duì)象實(shí)例,并包含接收者主機(jī)地址、接收端口號(hào)等信息(3)調(diào)用datagramSocket對(duì)象實(shí)例的send方法,將DatagramPacket對(duì)象實(shí)例作為參數(shù)發(fā)送。(1)構(gòu)建datagramSocket對(duì)象實(shí)例,指定接收的端口號(hào)。(2)構(gòu)建DatagramPacket對(duì)象實(shí)例,用于重組接收到的消息。(3)調(diào)用datagramSocket 對(duì)象實(shí)例大家receive方法,進(jìn)行消息接收,并將構(gòu)建服務(wù)器端程序DatagramPacket對(duì)象實(shí)例作為參數(shù)。六、實(shí)驗(yàn)報(bào)告客戶端和服務(wù)器端程序的偽代碼;客戶端:importclassClient{publicstaticvoidmain(String[]args)throwsIOException{etBytes();r:!SflrificM[JM*OHUF)kaiwanxiao農(nóng)蟲n.MiMjiMi(30174MI911冃 [?KKUi■”*曰^-” ?r■1*砧?■匸整+四rcwiz亞冃聊i川“嚴(yán)油百e弘1an」oi.,b;jr4?霏滬*i汕"和冃口冃上牛n;丼:魏憫尊己經(jīng)戟到i□KHS'9 ■XJt[血甬陽Ja□St.申SI.諫了c-PrLHJ. duTtfl.lffll (zoi?'ffij3館息巳經(jīng)上到!如何避免數(shù)據(jù)包丟失而造成的無限等待問題答:我認(rèn)為可在發(fā)包時(shí)設(shè)定一個(gè)定時(shí)器,若發(fā)出去的包在一定時(shí)間內(nèi)沒有收到答應(yīng),則再發(fā)一次。為了避免接受者接到重復(fù)的包,可以給數(shù)據(jù)包加個(gè)序號(hào),接受者收包時(shí)查看序號(hào)即可。如何實(shí)現(xiàn)全雙工的數(shù)據(jù)包通信答:利用端口套接字之間的通信功能。實(shí)驗(yàn)二流式socket應(yīng)用一、實(shí)驗(yàn)?zāi)康?.理解流式socket的原理2.實(shí)現(xiàn)流式socket通信二、預(yù)習(xí)與實(shí)驗(yàn)要求1.預(yù)習(xí)實(shí)驗(yàn)指導(dǎo)書及教材的有關(guān)內(nèi)容,了解流式socket的通信原理;2.熟悉java環(huán)境和程序開發(fā)過程;盡可能獨(dú)立思考并完成實(shí)驗(yàn)。三、實(shí)驗(yàn)環(huán)境a)獨(dú)立計(jì)算機(jī);b)Windows操作系統(tǒng);c)Jdk工具包四、實(shí)驗(yàn)原理SocketAPI是一種作為IPC提供低層抽象的機(jī)制。盡管應(yīng)用人員很少需要在該層編寫代碼,但理解socketAPI非常重要,因?yàn)椋?,高層設(shè)施是構(gòu)建于socketAPI之上的,即他們是利用socketAPI提供的操作來實(shí)現(xiàn);2,對(duì)于以響應(yīng)時(shí)間要求較高或運(yùn)行于有限資源平上的應(yīng)用來說,socketAPI可能是最適合的。通信傳送,被傳輸報(bào)文稱為數(shù)據(jù)包。而TCP則允許面向連接的可靠通信,這種IPC稱為流式socket。Java為流式socketAPI 提供兩類socket⑴式用于連接的連接socket(2)式用于數(shù)據(jù)交換的數(shù)據(jù) socket。五、實(shí)驗(yàn)內(nèi)容構(gòu)建客戶端程序和服務(wù)器端程序都需要的 MystreamSocket類,定義繼承自javaSocket的sendMessage和receiveMessage方法構(gòu)建客戶端程序(1)創(chuàng)建一個(gè)MyStreamsocket的實(shí)例對(duì)象,并將其指定接收服務(wù)器和端口號(hào)(2)調(diào)用該socket的receiveMessage方法讀取從服務(wù)器端獲得的消息構(gòu)建服務(wù)器端程序(1)構(gòu)建連接socket實(shí)例,并與指定的端口號(hào)綁定,該連接socket隨時(shí)偵聽客戶端的連接請(qǐng)求(2) 創(chuàng)建一個(gè)MyStreamsocket的實(shí)例對(duì)象(3)調(diào)用MyStreamsocket的實(shí)例對(duì)象的sendMessage方法,進(jìn)行消息反饋。六、實(shí)驗(yàn)報(bào)告應(yīng)用程序的結(jié)構(gòu)圖,說明程序之間的關(guān)系;A*m><rlientw* |i.?《kformi*plib(■^111 pBiitikirl*ri?tt2■程序的偽代碼。公用服務(wù)功能import.*;import.*;publicclassMystreamSocketextendsSocket{privateSocketsocket;privateBufferedReaderinput;privatePrintWriteroutput;ava:importclassClient{publicstaticvoidmain(Stringargs[]){try{InetAddresshostname=("localhost");MystreamSocketmss=newMystreamSocket(hostname,12345);("我是客戶端,我請(qǐng)求連接!");();}catch(IOExceptione){tart();}}catch(IOExceptione){

答:服務(wù)端監(jiān)聽端口,每當(dāng)有一個(gè)連接請(qǐng)求發(fā)來時(shí),就與其建立新的連接,的功能進(jìn)行通信。2.如何實(shí)現(xiàn)安全socketAPI答:注意在通信過程中的各種異常情況的捕獲與處理如何實(shí)現(xiàn)1對(duì)多的并發(fā)答:在服務(wù)端使用多線程。實(shí)驗(yàn)三客戶/服務(wù)器應(yīng)用開發(fā)一、實(shí)驗(yàn)?zāi)康?.驗(yàn)證daytime和echo程序,2.實(shí)現(xiàn)包socket支撐的C/S模式IPC機(jī)制3.實(shí)現(xiàn)流式socket支撐的C/S模式IPC機(jī)制二、預(yù)習(xí)與實(shí)驗(yàn)要求1.預(yù)習(xí)實(shí)驗(yàn)指導(dǎo)書及教材的有關(guān)內(nèi)容,了解daytime和echo要提供的具體服務(wù)內(nèi)容2.復(fù)習(xí)包socket和流式socket的實(shí)現(xiàn)原理;實(shí)驗(yàn)前認(rèn)真聽講,服從安排。盡可能獨(dú)立思考并完成實(shí)驗(yàn)。三、實(shí)驗(yàn)環(huán)境a)獨(dú)立計(jì)算機(jī);b)Windows操作系統(tǒng)。c)Jdk工具包四、實(shí)驗(yàn)原理C/S模式是主要的分布式應(yīng)用范型,其設(shè)計(jì)的目的是提供網(wǎng)絡(luò)服務(wù)。網(wǎng)絡(luò)服務(wù)指如daytime、telnet、ftp和WWV之類的允許網(wǎng)絡(luò)用戶共享資源的服務(wù)。要構(gòu)建C/S范型的應(yīng)用就必須解決以下一些關(guān)鍵問題:(1) 如何通過會(huì)話實(shí)現(xiàn)多個(gè)用戶的并發(fā)問題(2) 如何定義客戶和服務(wù)器在服務(wù)會(huì)話期間必須遵守的協(xié)議(3) 服務(wù)定位問題(4) 進(jìn)程間通信和事件同步問題:語法、語義和響應(yīng)(5) 數(shù)據(jù)表示問題在解決了這些問題的基礎(chǔ)上,C/S范型必須遵從3層結(jié)構(gòu)的軟件體系結(jié)構(gòu):(1) 表示層,提供與客戶端進(jìn)行交互的界面(2) 應(yīng)用邏輯層,定義服務(wù)器和客戶端要處理的主要事務(wù)的業(yè)務(wù)邏輯(3) 服務(wù)層,定義應(yīng)用邏輯層所需要的底層支持技術(shù),例如定義其IPC機(jī)制里的receive方法和send方法等。五、實(shí)驗(yàn)內(nèi)容構(gòu)建用數(shù)據(jù)包socket實(shí)現(xiàn)的daytime客戶端程序(1)構(gòu)建表示層程序(2) 構(gòu)建應(yīng)用邏輯層程序(3) 構(gòu)建服務(wù)層程序構(gòu)建用數(shù)據(jù)包socket實(shí)現(xiàn)的daytime服務(wù)器端程序(1) 構(gòu)建表示層和應(yīng)用邏輯層程序(2) 構(gòu)建服務(wù)層程序(3) 構(gòu)建服務(wù)層程序所需要的下層程序(它封裝了客戶端的消息和地址)構(gòu)建用流式socket實(shí)現(xiàn)的daytime應(yīng)用程序包

4.構(gòu)建用數(shù)據(jù)包socket實(shí)現(xiàn)的echo應(yīng)用程序包5.構(gòu)建用流式socket實(shí)現(xiàn)的echo應(yīng)用程序包六、實(shí)驗(yàn)報(bào)告各戶端:1■用數(shù)據(jù)包socket實(shí)現(xiàn)的daytime應(yīng)用程序包的構(gòu)架,列明各程序之間的關(guān)系;各戶端:服務(wù)端:DayttncClicfttlf ■■?■IDavlimcCJleniHclpcrl !1 叫y%服務(wù)端:DayttncClicfttlf ■■?■IDavlimcCJleniHclpcrl !1 叫y%iMyChcntDuligramf#fII■1■1Socket11電IJa111IhTb*■■z*Frt3LVCMciMgc0-q 扌1Ditd^mmSucLct\T?ST\rrD:vpr;im^ndMesiaix1iJ:\T?ST\rrD:vpr;im^ndMesiaix1iJ:JL'tlVjMo-JLj/kllCSeokr()rjirSockjt代碼:客戶端:publicclassDaytimeClient1{publicstaticvoidmain(String[]args){InputStreamReaderis=newInputStreamReader;BufferedReaderbr=newBufferedReader(is);try{"WelcometotheDaytimeclient.\n"+"Whatisthenameoftheserverhost");StringhostName=();if()==0)hostName="localhost"; ;publicclassDaytimeClientHelper1{publicstaticStringgetTimestamp(StringhostName,StringportNum){Stringtimestamp=""try{InetAddressserverHost=(hostName);intserverPort=(portNum);import.*;publicclassMyClientDatagramSocketextendsDatagramSocket{staticfinalintMAX_LEN=100;MyClientDatagramSocket()throwsSocketException{super();}MyClientDatagramSocket(intportNo)throwsSocketException{super(portNo);}publicvoidsendMessage(InetAddressreceiverHost,intreceiverPort,Stringmessage)throwsIOException{byte[]sendBuffer();DatagramPacketdatagram=newDatagramPacket(sendBuffer,,receiverHost,receiverPort);(datagram);}publicStringreceiveMessage()throwsIOException{byte[]receiveBuffer=newbyte[MAX_LEN];DatagramPacketdatagram=newDatagramPacket(receiveBuffer,MAX_LEN);(datagram);Stringmessage=newString(receiveBuffer);returnmessage;}}服務(wù)端:import.*;importpublicclassDaytimeServer1{publicstaticvoidmain(String[]args){intserverPort=13;if==1)serverPort=(args[0]);try{MyServerDatagramSocketmySocket=newMyServerDatagramSocket(serverPort);"Daytimeserverready.");while(true){DatagramMessagerequest=();"Requestreceived");Datetimestamp=newDate();"timestampsent:"+());(),(),());}catch(Exceptionex){"Thereisaproblem:"+ex);import.*;import.*;publicclassMyServerDatagramSocketextendsDatagramSocket{staticfinalintMAX_LEN=100;MyServerDatagramSocket(intportNo)throwsSocketException{super(portNo);}publicvoidsendMessage(InetAddressreceiverHost,intreceiverPort,Stringmessage)throwsIOException{byte[]sendBuffer();DatagramPacketdatagram=newDatagramPacket(sendBuffer,,receiverHost,receiverPort);(datagram);publicStringreceiveMessage()throwsIOException{byte[]receiveBuffer=newbyte[MAX_LEN];DatagramPacketdatagram=newDatagramPacket(receiveBuffer,MAX_LEN);(datagram);Stringmessage=newString(receiveBuffer);returnmessage;}publicDatagramMessagereceiveMessageAndSender()throwsIOException{byte[]receiveBuffer=newbyte[MAX_LEN];DatagramPacketdatagram=newDatagramPacket(receiveBuffer,MAX_LEN);(datagram);DatagramMessagereturnVal=newDatagramMessage();(newString(receiveBuffer),(),());returnreturnVal;}}import.*;publicclassDatagramMessage{privateStringmessage;privateInetAddresssenderAddress;privateintsenderPort;publicvoidputVal(Stringmessage,InetAddressaddr,intport){=message;=addr;=port;}publicStringgetMessage(){return;}publicInetAddressgetAddress(){return;}publicintgetPort(){return;}}客戶端:2.用流式socket實(shí)現(xiàn)的daytime應(yīng)用程序包的構(gòu)架,列明各程序之間的關(guān)系客戶端:Ln*■fDaytimrCLicntHelpdAJ礎(chǔ)**71■Va?iFH 4 _r &rr.a*Cl尹_?33■ v襯」h3.A*■各u***?—二「()p.二nvkMNdgn(」"ccs.<r;Mcsb4gcAlMl尹=自二import.*;import.*;publicclassMyStreamSocketextendsSocket{privateSocketsocket;privateBufferedReaderinput;privatePrintWriteroutput;MyStreamSocket(InetAddressacceptorHost,intacceptorPort)throwsSocketException,IOException{socket=newSocket(acceptorHost,acceptorPort);setStreams();}MyStreamSocket(Socketsocket)throwsIOException{=socket;setStreams();}privatevoidsetStreams()throwsIOException{InputStreaminStream=();input=newBufferedReader(newInputStreamReader(inStream));OutputStreamoutStream=();output=newPrintWriter(newOutputStreamWriter(outStream));}publicvoidsendMessage(Stringmessage)throwsIOException{(message);();}publicStringreceiveMessage()throwsIOException{Stringmessage=();returnmessage;客戶端:import.*;publicclassDaytimeClient2{publicstaticvoidmain(String[]args){InputStreamReaderis=newInputStreamReader;BufferedReaderbr=newBufferedReader(is);try{"WelcometotheDaytimeclient.\n"+"Whatisthenameoftheserverhost");StringhostName=();if()==0)hostName="localhost";"Whatistheportnumberoftheserverhost");StringportNum=();if()==0)portNum="13";"Hereisthetimestampreceivedfromtheserver"+(hostName,portNum));}catch(Exceptionex){();import.*;publicclassDaytimeClientHelper2{publicstaticStringgetTimestamp(StringhostName,StringportNum)throwsException{Stringtimestamp="";InetAddressserverHost=(hostName);intserverPort=(portNum);"Connectionrequestmade");serverPort);MyStreamSocketmySocket=newMyStreamSocket(serverHost,serverPort);timestamp=();();returntimestamp;}}服務(wù)端:import.*;import.*;importpublicclassDaytimeServer2{publicstaticvoidmain(String[]args){intserverPort=13;if==1)serverPort=(args[0]);try{ServerSocketmyConnectionSocket=newServerSocket(serverPort);"Daytimeserverready.");while(true){"Waitingforaconnection.");MyStreamSocketmyDataSocket=newMyStreamSocket());"Aclienthasmadeconnection.");Datetimestamp=newDate();"timestampsent:"+());());();}}catch(Exceptionex){();}}}3.用數(shù)據(jù)包socket實(shí)現(xiàn)的echo應(yīng)用程序包的構(gòu)架,列明各程序之間的關(guān)系;客戶1口址a卻cvhomessage■ethomessage

客戶端:publicclassEchoClient1{staticfinalStringendMessage=".";publicstaticvoidmain(String[]args){InputStreamReaderis=newInputStreamReader;BufferedReaderbr=newBufferedReader(is);try{"WelcometotheEchoclient.\n"+"Whatisthenameoftheserverhost");StringhostName=();if()==0)hostName="localhost";"Whatistheportnumberoftheserverhost");StringportNum=();if()==0)portNum="7777";EchoClientHelper1helper=newEchoClientHelper1(hostName,portNum);booleandone=false;Stringmessage,echo;while(!done){

"Enteralinetoreceiveanechobackfromtheserver,"toquit.");+"orasingleperoidtoquit.");message=();if(()).equals(endMessage)){done=true;();}else{echo=(message);}}}catch(Exceptionex){();import.*;import.*;publicclassEchoClientHelper1{privateMyClientDatagramSocketmySocket;privateInetAddressserverHost;privateintserverPort;EchoClientHelper1(StringhostName,StringportNum)throwsSocketException,UnknownHostException{=(hostName);=(portNum);=newMyClientDatagramSocket();}publicStringgetEcho(Stringmessage)throwsSocketException,IOException{Stringecho="";(serverHost,serverPort,message);echo=();returnecho;}publicvoiddone()throwsSocketException{();}}import.*;import.*;publicclassMyClientDatagramSocketextendsDatagramSocket{staticfinalintMAX_LEN=100;MyClientDatagramSocket()throwsSocketException{super();}MyClientDatagramSocket(intportNo)throwsSocketException{super(portNo);}publicvoidsendMessage(InetAddressreceiverHost,intreceiverPort,Stringmessage)throwsIOException{byte[]sendBuffer();DatagramPacketdatagram=newDatagramPacket(sendBuffer,,receiverHost,receiverPort);(datagram);}publicStringreceiveMessage()

throwsIOException{byte[]receiveBuffer=newbyte[MAX_LEN];DatagramPacketdatagram=newDatagramPacket(receiveBuffer,MAX_LEN);(datagram);Stringmessage=newString(receiveBuffer);returnmessage;}服務(wù)端:import.*;publicclassEchoServer1{publicstaticvoidmain(String[]args){intserverPort=1117;if==1)serverPort=(args[0]);newtry{newMyServerDatagramSocketmySocketMyServerDatagramSocket(serverPort);"Echoserverready.");while(true){DatagramMessagerequest=();"Requestreceived");Stringmessage=();"messagereceived:"+message);(),(),message);catch(Exceptionex){();import.*;import.*;publicclassMyServerDatagramSocketextendsDatagramSocket{staticfinalintMAX_LEN=100;MyServerDatagramSocket(intportNo)throwsSocketException{super(portNo);}publicvoidsendMessage(InetAddressreceiverHost,intreceiverPort,Stringmessage)throwsIOException{byte[]sendBuffer();DatagramPacketdatagram=newDatagramPacket(sendBuffer,,receiverHost,receiverPort);(datagram);}publicStringreceiveMessage()throwsIOException{byte[]receiveBuffer=newbyte[MAX_LEN];DatagramPacketdatagram=newDatagramPacket(receiveBuffer,MAX_LEN);(datagram);Stringmessage=newString(receiveBuffer);returnmessage;}publicDatagramMessagereceiveMessageAndSender()throwsIOException{byte[]receiveBuffer=newbyte[MAX_LEN];DatagramPacketdatagram=newDatagramPacket(receiveBuffer,MAX_LEN);(datagram);DatagramMessagereturnVal=newDatagramMessage();(newString(receiveBuffer),(),());returnreturnVal;}}import.*;publicclassDatagramMessage{privateStringmessage;privateInetAddresssenderAddress;privateintsenderPort;publicvoidputVal(Stringmessage,InetAddressaddr,intport){=message;=addr;=port;}publicStringgetMessage(){return;publicInetAddressgetAddress(){return;}publicintgetPort(){return;}}4.用流式socket實(shí)現(xiàn)的echo應(yīng)用程序包的構(gòu)架,列明各程序之間的關(guān)系EchoScnrr?當(dāng)戶1窖戶2import.*;import.*;publicclassMyStreamSocketextendsSocket{privateSocketsocket;privateBufferedReaderinput;privatePrintWriteroutput;MyStreamSocket(InetAddressacceptorHost,intacceptorPort)throwsSocketException,IOException{socket=newSocket(acceptorHost,acceptorPort);setStreams();}MyStreamSocket(Socketsocket)throwsIOException{=socket;setStreams();}privatevoidsetStreams()throwsIOException{InputStreaminStream=();input=newBufferedReader(newInputStreamReader(inStream));OutputStreamoutStream=();output=newPrintWriter(newOutputStreamWriter(outStream));}publicvoidsendMessage(Stringmessage)throwsIOException{(message);();}publicStringreceiveMessage()throwsIOException{Stringmessage=();returnmessage;}}客戶端:import.*;publicclassEchoClient2{staticfinalStringendMessage=".";publicstaticvoidmain(String[]args){InputStreamReaderis=newInputStreamReader;BufferedReaderbr=newBufferedReader(is);try{"WelcometotheEchoclient.\n"+"Whatisthenameoftheserverhost");StringhostName=();if()==0)hostName="localhost";"Whatistheportnumberoftheserverhost");StringportNum=();if()==0)portNum="7";EchoClientHelper2helper=newEchoClientHelper2(hostName,portNum);booleandone=false;Stringmessage,echo;while(!done){"Enteralinetoreceiveanecho"+"fromtheserver,orasingleperiodtoquit.");message=();if(()).equals(endMessage)){done=true;();else{echo=(message);}catch(Exceptionex){();}}}import.*;import.*;publicclassEchoClientHelper2{staticfinalStringendMessage=".";privateMyStreamSocketmySocket;privateInetAddressserverHost;privateintserverPort;EchoClientHelper2(StringhostName,StringportN

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論