TCPIP協(xié)議分析實驗指導書_第1頁
TCPIP協(xié)議分析實驗指導書_第2頁
TCPIP協(xié)議分析實驗指導書_第3頁
TCPIP協(xié)議分析實驗指導書_第4頁
TCPIP協(xié)議分析實驗指導書_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

《TCP/IP協(xié)議分析》課程試驗指導書1TCP套接字編程試驗試驗目的:生疏基于java的TCP套接字網(wǎng)絡編程方法;生疏TCPClient套接字編程流程;生疏TCPServer套接字編程流程;生疏javaTCPjava類;試驗任務:實現(xiàn)一個根本的TCP套接字Client/Sener模式的網(wǎng)絡應用系統(tǒng),該系統(tǒng)中效勞器端監(jiān)聽網(wǎng)個類似于Echo效勞的效勞器程序。指導說明:1TCP客戶端根本編程流程11TCP客戶端工作流程創(chuàng)立流套接字向遠程效勞器發(fā)起連接懇求;獵取套接字字節(jié)流與遠程效勞器進展數(shù)據(jù)通信;通信完畢.關閉套接字;基于Java的TCP客戶端編寫根本步驟說明基于Java的TCP客戶端會使用下述類或接口:Socket、InetAddress%InputStream%OutPutStream等.根本上這些可能在JavaTCP客戶端程序中使用的類大致會包含于下述常用的Java庫文件中:.*、java.io.*、java.util.*等°因此編寫該TCPjava類文件的開頭.固然也可以在事后添加。TCPJavaJava庫文件import.*;importjava.io.*;這里介紹的一個最根本的TCP客戶謊程序中根本就只會使用上述java庫文件中所包含的類了。java厚文件。與遠程效勞器端發(fā)起TCP連接懇求TCP客戶端要完成與遠程效勞器的TCP連接的工作,需要做以下幾件事情:設定TCP效勞器程序所運行的計算機網(wǎng)絡接□地址(IP地址):設定TCP效勞器程序所監(jiān)聽的網(wǎng)絡端□號;向遠程TCPTCP連接懇求;看似很多事情,其實在java中編程完成這些事情,相當簡潔。通常狀況下,假設要連接某IP地址或者該主機名。IP或主機名來在TCP客戶端程序中構造一個InetAddressIP=23;主機名=whpucomputerInetAddressserverIP=InetA(ldress.getBvName(u23,r);或InetAddressserverIP=InetAddress.getByNameC”whpucompiiter“);~~光知道遠程效勞器程序所運行的主機地址還不酸,TCP號為:8888O知道了遠程效勞器程序所運行于的主機地址和其所監(jiān)聽的端□號后,就可以使用Socket類發(fā)起與遠程效勞器程序建立TCP連接的懇求了,具體代碼如下:Socketclientsock=newSocket(serverIP,8888);~~上直代碼復制符右端的Socket萬法假設成功返回,那么就會返回一個Socket類對象的引用給Socket類對象引用來完成與遠程效勞器程序的通信工作了。不過,該段代碼有個比較明顯的問題:8888(^0程習慣。具體如何跟好的設置端□號.后面整體說明旳進展解釋。到此,TCP客戶謊編寫發(fā)起向TCP效勞器程序的TCP連接懇求的代碼就完成了,整體代碼大致如下所示:InetAddressserverIP=InetAddress.getByName(“whpucompiiter””);Socketclientsock=newSocket(serverIP?8888);與遠程TCP效勞器程序逬行通信基于java的TCP套接字程序中,與遠程網(wǎng)絡程序逬行通信主要使用的是Socket類中的兩個類成員InputSteamOiHpinStrcamSocket類的成員需要使用Socket類供給的兩個方法:getlnputStream和getOutputStreamo在前面介紹的代碼中,假設己經(jīng)成功與遠程效勞器程序建立了一個TCP連接,并獵取了一個SocketInputstreamOutputStrcam的對象的代碼如下:InputStreainin=clientsock.getlnputStreamO;Outputstreamout=clientsock.getOutputStreain;javaInputStreamOmputStrcam類對象,一來直接InputStreamOutputStrcamI/O操作,這樣使用性能不高,特別是每次輸入或輸出的數(shù)據(jù)比較少的狀況下,會反復進展I/O操作,由于每次I/O操作會消耗大量處理肘間,因此勢必帶來運行效率不高的問題。對InputStream的封裝InputStream流對象中的字節(jié)數(shù)據(jù),就可以對I叩utStrcam字節(jié)流對象進展封裝,代碼如下所示:InputStreamReaderin=newInputStreainReader(clientsock.getInputStream);-上面的代碼只是將原來以字節(jié)訪問方式的流轉換為以字符方式訪問的流,并沒有轉變I/O操作的方式,為了提高訪冋信息,我們需要為流供給緩沖區(qū),以便不必每次操作流時都產(chǎn)生I/O操作。i(Outputstream),者顯式的調(diào)用流的flush方法時,緩沖區(qū)中的數(shù)據(jù)才會真實的寫入文件流,否則.不會執(zhí)行將緩沖^(InputStream),地輸入流傳送來的數(shù)據(jù),而在緩沖區(qū)己滿時.表示外界向本地發(fā)送數(shù)據(jù)的速度快于本地處理輸入流BufferedReaderin=newBufferedReader(newInputStreamReader(clientsock.getlnputStreamO));對Outputstream的封裝對于Oinpu⑸reamInputStream。具體代碼如下:BufferedWriterout=newBufferedVVriter(newInputStreamWriter(clientsock.getOutputStream));為了更簡潔的打印出緩沖區(qū)中的字符串,可以逬一步對BufferedWriter對象逬行封裝,例如:Printwriterout=newPrintWrite(newBufferedVVriter(newInputStreamWriter(clientsock.getOutputStreamO)));1.2.4Client業(yè)務規(guī)律實現(xiàn)這里需要實現(xiàn)的Client功能如下描述:10Server端發(fā)送字符串”HelloServer“+i(i0<=i<10),Server的反響信息,并將Server反響信息打印到屏幕上?!盨erverTCP連接的套接字對象:clientsockoClient功能描述,具體的代碼實現(xiàn)如下:for(inti=0;i<10;i++){outprintln(HhelloServer11+i);outflushO;Stringstr=in.rea(ILine;Systein.out.println(str);以上代碼中將循環(huán)執(zhí)行10次的代碼的工作內(nèi)容如下:out是封裝了套接字輸出流的Printwriter對象,調(diào)用PrintWriter對彖的printin方法,會將”HelloServeri”寫入緩沖區(qū)中.然而,這并不意味著緩沖區(qū)的內(nèi)容會寫入到套接字的輸出流對象中,只有調(diào)用0山的flush方法后,緩沖區(qū)的數(shù)據(jù)才會發(fā)送到套接字的輸出流對象,網(wǎng)路才有可能將數(shù)據(jù)發(fā)送出去。Server端回饋的信息,假設,Server回饋信息到來,那么該方法就會始終堵塞在哪里不會返回;而且就算Server端有數(shù)據(jù)返回,但是readLineServer端回饋的數(shù)據(jù)最后肯定要加上/血這兩個字符,這可以手動添加到ServerPrintWriter對象的printin方法,該方法會自動為字符串末尾添加/r/%提示:在實際的網(wǎng)絡應用程序中,避開使用Printin和readLine方法,雖然這些方法在處理字符串方面格外簡潔好用,但是由于不⑥的操作系統(tǒng)的文本行完畢符各不一樣,這會導致跨12.5TCP 連接的關閉ClientServer?Socketclose方法來關閉套接字,此時.假設系統(tǒng)套接字緩存中還有數(shù)據(jù)未發(fā)送.系統(tǒng)會嘗試連續(xù)發(fā)送數(shù)據(jù),TCP/IP協(xié)議棧也同時會向ServerFINServer.ServerACK確認FINTCPServerTCP/IP協(xié)議棧也發(fā)過來FIN包.并且Client端的TCP/IP協(xié)議棧發(fā)送對此次FINACK包后,整個TCP連接才完整關閉。當ClinetcloseServer-1或者null.通過這可以推斷出TCP連接的遠端程序己經(jīng)關閉了套接字,本地也可以關閉TCP連接的套接字了。然而.這種靠底層TCP/IP協(xié)議機制來掌握的套接字關閉的時機,不是特別抱負。最好的方式是在Client和Server端之間協(xié)商一種應用層的連接完畢的機制。例如:out.println(*”END,”);out.flushO;~~在Client不想再保持連接時.就事先向ServerTCP連接的意圖。如上面代碼所示,在Client發(fā)送完全部數(shù)據(jù)之后,向Server謊發(fā)送一個字符卑“END”Server端在Client種機制保證在ServerClientTCP/IP發(fā)送的HNClient己經(jīng)斷幵的狀態(tài),這種方法確定更好一些。在發(fā)送了“END“字符串后,Client就可以無需再去考慮Server的close方法關閉套按字。clientsock.close;13TCPClient 完整程序源碼例如importjava.io.*;import.*;publicclassClient{publicstaticvoidmain(String[]args)throwsIOException{InetAddressaddr=InetA(ldress.getByNaine(null);Socketsocket=newSocket(a(l(lr,8888);BufferedReaderin=newBufferedReader(newInputStreainReader(socket.getlnputStreamO));PrintWriterout=newPrintWriter(newBufferedVVriter(newOutputStreamWriter(socket.getOutputStreamO)));for(intI=0;i<10;i++){out.println(nhow(lyu+i);out.flushO;Stringstr=in.rea(ILine;Systein.out.println(str);}out.printlnC”EN”)out.flush;Systein.out.println(nclosing...H);socket.close;TCP效勞端根本編程流程TCP效勞端工作流程通過指定端□創(chuàng)立效勞器套接字,調(diào)用accept方法監(jiān)聽端口,接收將要到來的連接懇求;通過accept通信;本次通信完畢,關閉accept方法返回的流套接字;循環(huán)到第2步,連續(xù)監(jiān)聽;基于Java的TCP效勞端編寫根本步驟說明基于Java的TCP客戶瀟會使用下述類或接口:ScrvcrSockct、Socket、InetAddress,Inputstream,OulPutStream等,根本上這些可能在JavaTCP客戶端程序中使用的類大致會包含于下述常用的Java庫文件中:.*、java.io.*、java.util.*等。因此編寫該TCP的java類文件的開頭.固然也可以在事后添加。TCPJavaJava庫文件import>*;importjava.io.*;這里介紹的一個最根本的TCP效勞謊程序中根本就只會使用上述java庫文件中所包含的類了。大家可以依據(jù)編寫的程序的需要.視狀況引入更多的java庫文件。創(chuàng)立ServerSocket效勞器端一般是被動承受遠程效勞懇求,因此必需要有一個事先商定好的固定監(jiān)聽端口號.并且效勞器不能只為一個客戶謊供給效勞,基于此特性,效勞器端應當在監(jiān)聽到網(wǎng)絡上到來的效勞懇求后,利用一個的套接字與客戶端建立TCP連接,并逬行通信.而不能使用該監(jiān)聽網(wǎng)絡的基于上述描述,java在構建TCP效勞器程序肘,供給了一個名為ServerSocket的類,用來完成TCP效勞器端監(jiān)聽網(wǎng)絡的工作。構造ServerSocket端逬行連接肘,指定正確的連接端□號。構造ServerSocketIP地址,這樣可以保證效勞器程序所運行的計算機假設有多個網(wǎng)絡接□時,不管是從那個網(wǎng)絡接□到來的數(shù)據(jù),只要指定的謊□號是該效勞器程序所期望的.那么數(shù)據(jù)都會被該效勞器程序所承受。1:該方法創(chuàng)立一個己8888之上的監(jiān)聽套接字intlistenPort=8888;ServerSocketlistener=newServerSocket(listenPort);2:沒有綁定到特定端□號的監(jiān)聽套接接字的bind方法.將套接字地址綁定intlistenPort=8888;InetAddresslocallP=InetAddress.getByName(null);InetSocketAddresslocalAddr=newInetSocketAddress(locallRlistenPort);ServerSocketlistener=newServerSocket;listener.bind(localAddr);到該套接字上。到該套接字上。223 監(jiān)聽網(wǎng)絡,承受連接懇求,并逬行通信調(diào)用Serversocketaccept方法,監(jiān)聽網(wǎng)絡,效勞懇求到來成功連接后返回連接套接字;獵取連接套接字的輸入字節(jié)流和輸出字節(jié)流;接收數(shù)據(jù)、處理數(shù)據(jù),發(fā)送數(shù)據(jù);關閉連接套接字;while(true){Socketconnectsock=listener.accept;BufTeredReaderin=newBufferedReader(newInputStreainReader(connectsock.getlnputStreamO));PrintWriterout=newPrintWriter(newBufferedWriter(newOutputStreamWriter(connectsock.getOutputStreamO)));while(true){Stringstr=iikreadLineO;if(nENDn.equals(str))break;System.out.printIn(1*Echoing:H+str);out.printlnC”fig務器反響:“+str);out.flushO;}connectsockclose;TCPServer 完整程序源碼例如importjava.io.*;import*;publicclassServer{publicstaticvoidmain(String[]args)throwsIOException{intlistenPort=8888;ServerSocketlistener=newServerSocket(listenPort);while(true){Socketconnectsock=listener.accept;BufferedReaderin=newBufferedReader(newInputStreainReader(connectsockgetlnputStreamO));PrintWriterout=newPrintWriter(newBufferedWriter(newOutputStreamVVriter(connectsockgetOutputStreamO)));while(true){Stringstr=in.readLine;if(,tEND,t.equals(str))break;Systeni.out.println(MEchoing:H+str);out.printin(“效勞器反響:”+str);out.flushO;}connectsock.close;}思考題:認真理解IP地址、域名、端□號這幾個槪念的實際所指,并結合實際應用狀況的各種可能性思考它們之間的關系。試驗要求:java的TCP套接字編寫client/server模式網(wǎng)絡包含:試驗目的:試驗任務:試驗結果截圖:思考題答復:〔假設有的話〕試驗總結:試驗2UDP 試驗目的:生疏基于java的UDP套接字網(wǎng)絡編程方法;生疏UDPClient套接字編扌呈流程;生疏UDPServer套接字編程流程;生疏javaUDPjava類:試驗任務:實現(xiàn)一個根本的UDP套接字Clicnt/Scrvcr模式的網(wǎng)絡應用系統(tǒng).該系統(tǒng)中客戶端通過鍵盤承受用戶輸入,并將用戶輸入內(nèi)容通過UDP協(xié)議發(fā)送給效勞器端;效勞器端監(jiān)聽網(wǎng)絡,承受Echo效勞的效勞器程序。指導說明:1UDP客戶端根本編程流程UDP客戶端工作流程創(chuàng)立數(shù)據(jù)報套接字〔郵筒〕.用于發(fā)送和接收數(shù)據(jù)報;創(chuàng)立發(fā)送型DatagramPacket對象〔信封〕,并發(fā)送給效勞器;創(chuàng)立接收型DatagramPacket對象〔信封〕,從網(wǎng)絡接收效勞器數(shù)據(jù);UDP客戶端完整程序源碼例如importjava.io.*;import.*;publicclassSiinpleUDPClient{publicstaticvoidmaiiKStringargs[]〕throwsException{〃基于系統(tǒng)輸入流構造具有緩沖區(qū)的字符流劉象,用于接收鍵盤輸入BufferedReaderinFromUser=newBufferedReader(newInputStreamReader(System.in));〃構造數(shù)據(jù)報套接字DatagramSocketclientsocket=newDatagramSocket;〃預備DatagramPacket對象的地址和數(shù)搖緩沖區(qū)InetAddressIPAddress=InetAddress.getByName(Mlocalhostu);byte[]sendData=newbyte[1024];bvte[]receiveData=newbyte[1024];while(true){Stringsentence=inFromUser.readLine;〃從輸入終端接收字符串sendData=sentence.getBvtes;//將字符串以字節(jié)形式保存于字節(jié)數(shù)組中DatagramPacket對象DatagrainPacketsendPacket=newDatagramPacket(sendData,sendData.length,IPAddress,9876);clientsocket.send(sendPacket);//發(fā)送數(shù)據(jù)報DatagramPacket對象DatagrainPacketreceivePacket=newDatagramPacket(receiveData,receiveData.length);clientSocket.receive(receivePacket)^/Jg收UDP協(xié)議發(fā)送來的數(shù)據(jù)DatagrainPacket對象緩沖區(qū),構造字符串StringmodifiedSentence=newString(receivePacket.getDataO//^得緩沖區(qū)的字節(jié)數(shù)組首地址0〃從緩沖區(qū)中第一個要讀取的字節(jié)相對于首地址的偏移量receivePacket.getLength//^際從網(wǎng)絡上接收的字節(jié)數(shù));Systeni.out.println(1*FROMSERVER:”+modifiedSentence);UDP效勞端根本編程流程UDP效勞端工作流程創(chuàng)立具有固定端□號的數(shù)據(jù)報套接字〔覦筒〕.用于發(fā)送和接收數(shù)據(jù)報;創(chuàng)立接收型DatagramPacket對彖〔信封〕,UDP協(xié)議傳送來的客戶端數(shù)據(jù);創(chuàng)立發(fā)送型DatagramPacket對彖〔信封〕,發(fā)送會送數(shù)據(jù)報文給客戶瀟;UDP效勞端完整程序源碼例如importjava.io.IOException;import.*;publicclassSimpleUDPServer{publicstaticvoidmain(String[]args)throwsIOException{〃構造具有固定端□號的數(shù)據(jù)報套接字DatagramSocketserverSocket=newDatagramSocket(9876);〃定義緩沖區(qū)byte[]receiveData=newbyte[1024];byte[]sendData=newbyte[1024];while(true){ 〃構造接收型緩沖區(qū)DatagramPacketreceivePacket=newDatagran)Packet(receiveData,receiveData.length);serverSocket.receive(receivePacket);//^收UDP協(xié)議發(fā)送來的數(shù)搖}思考題:

〃通過接收數(shù)據(jù)報的緩沖數(shù)據(jù)構造字符串Stringsentence=newString(receivePacket.getData(),O,receivePacket.getLength);System.out.println(MRECEIVED:M+sentence);〃獵取該數(shù)據(jù)報的發(fā)送者IP地址InetAddressIPAddress=receivePacket?getAddress;〃獵取該數(shù)據(jù)報的發(fā)送者端□號intport=receivePacket.getPort;備字符串字符轉換為大寫StringcapitalizedSentence=sentence.toUpperCase;sendData=capitalizedSentence.getBytes;〃構造發(fā)送型DatagramPacket對象DatagramPacketsendPacket=newDatagramPacket(sendData,sendData.length,IPAddress^port);serverSocket.send(sendPacket) 在基于l:DP協(xié)議的網(wǎng)絡程序中,對于數(shù)據(jù)報文的緩沖區(qū)大小的設置,具體會有那些狀況〔可能性比較大的〕?選擇某種具體狀況下,分析會帶來哪些實際的編程問題?假設:Client端:接收緩沖為:c.recvbuff;發(fā)送緩沖為:c.sendbuff;

Server謝:接收緩沖為:s_recvbuff;發(fā)送緩沖為:s_sendbuff;例如:一種可能的狀況與發(fā)送數(shù)據(jù)大小的關系:c_recvbuff=c_sendbuff=s_recvbufT=s_sendbuff>data_size;crecvbuff=csenclbuff=srecvbuff=ssendbuff<datasize;試驗要求:java的UDP套接字編寫client/server模式網(wǎng)絡應含:試驗目的:試驗任務:試驗結果截圖:思考題◎答:〔假設有的話〕試驗總、結:3TCPEcho效勞器試驗目的:學握java的多線程的編程萬法;生疏多線程的網(wǎng)絡應用程序的編程方法;試驗任務:11中所編寫的TCPEcho效勞器程序,使之成為一個具有多通信效勞。指導說明:Java線程的使用使用線程的步驟創(chuàng)立數(shù)據(jù)報套接字〔郵筒〕.用于發(fā)送和接收數(shù)據(jù)報;創(chuàng)立發(fā)送型DatagramPacket對彖〔信封〕,并發(fā)送給效勞器;創(chuàng)立接收型DatagramPacket對彖〔信封〕,從網(wǎng)絡接收效勞器數(shù)據(jù):UDP客戶端完整程序源碼例如importjava.io.*;import.*;publicclassSimpleUDPClient{publicstaticvoidinain(Stringargs[])throwsException〃基于系統(tǒng)輸入流構造具有緩沖區(qū)的字符流對象,用于接收鍵盤輸入BufferedReaderiiiFromUser=newBufferedReader(newInputStreaniReader(Systein.in));〃構造數(shù)據(jù)報套接字DatagramSocketclientsocket=newDatagramSocket;〃預備DatagramPacket對象的地址和數(shù)據(jù)緩沖區(qū)InetAddressIPAddress=InetAddress.getByName(MlocalhostH);byte[]sendData=newbyte[1024);byte[]receiveData=newbyte[1024];while(true){Stringsentence=inFroinUser.readLine;〃從輸入終端接收字符卑sendData=sentence.getBvtesO;〃將字符串以字節(jié)形式保存于字節(jié)數(shù)組中〃構造發(fā)送型DatagramPacket對象DatagramPacketsendPacket=newDatagramPacket(sendData,sendData.length,IPAddress,9876);clientSocket.send(sendPacket);//^送數(shù)據(jù)報DatagramPacket劉象DatagramPacketreceivePacket=newDatagramPacket(receiveData,receiveData.length);clientSocket.receive(receivePacket);//^收UDP協(xié)議發(fā)送來的數(shù)據(jù)DatagramPacket對象緩沖區(qū),構造字符串StringniodifiedSentence=newString(receivePacket.getData(得緩沖區(qū)的字節(jié)數(shù)組首地址0〃從緩沖區(qū)中第一個要讀取的字節(jié)相對于首地址的偏移■receivePacket.getLengthO//^際從網(wǎng)絡上接收的字節(jié)數(shù));System.out.println(MFROMSERVER:11+modifiedSentence);UDP效勞端根本編程流程UDP效勞端工作流程創(chuàng)立具有固定端□號的數(shù)據(jù)報套接字〔覦筒〕.用于發(fā)送和接收數(shù)據(jù)報;創(chuàng)立接收型DatagramPacket對彖〔信封〕,UDP協(xié)議傳送來的客戶端數(shù)據(jù);創(chuàng)立發(fā)送型DatagramPacket對彖〔信封〕,發(fā)送會送數(shù)據(jù)報文給客戶瀟;UDP效勞端完整程序源碼例如importjava.io.IOException;import.*;publicclassSimpleUDPServer{publicstaticvoidmain(String[]args)throwsIOException{〃構造具有固定端□號的數(shù)據(jù)報套接字DatagramSocketserverSocket=newDatagramSocket(9876);〃定義緩沖區(qū)byte[]receiveData=newbyte[1024];byte[]sendData=newbyte[1024];while(true){ 〃構造接收型緩沖區(qū)DatagramPacketreceivePacket=newDatagran)Packet(receiveData,receiveData.length);serverSocket.receive(receivePacket);//^收UDP協(xié)議發(fā)送來的數(shù)搖〃通過接收數(shù)據(jù)報的緩沖數(shù)據(jù)構造字符串Stringsentence=newString(receivePacket.getData(),O,receivePacket.getLength);System.out.println(MRECEIVED:M+sentence);〃獵取該數(shù)據(jù)報的發(fā)送者IP地址InetAddressIPAddress=receivePacket?getAddress;〃獵取該數(shù)據(jù)報的發(fā)送者端□號intport=receivePacketgetPortO;備字符串字符轉換為大寫StringcapitalizedSentence=sentence.toUpperCase;sendData=capitalizedSentence.getBytes;DatagramPacket對象DatagramPacketsendPacket=newDatagramPacket(sendData,sendData.length,IPAddress^port);serverSocket.send(sendPacket) }思考題:在基于l:DP協(xié)議的網(wǎng)絡程序中,對于數(shù)據(jù)報文的緩沖區(qū)大小的設置,具體會有那些狀況〔可能性比較大的〕?選擇某種具體狀況下,分析合帶來哪些實際的編程問題?假設:Client端:接收緩沖為:c.recvbuff;發(fā)送緩沖為:c.sendbuff;data_size;

Server謝:接收緩沖為:s_recvbuff;發(fā)送緩沖為:s_sendbuff;例如:一種可能的狀況與發(fā)送數(shù)據(jù)大小的關系:c_recvbuff=c_sendbuff=s_recvbufT=s_sendbuff>data_size;crecvbuff=csenclbuff=srecvbuff=ssendbuff<datasize;試驗要求:java的UDP套接字編寫client/server模式網(wǎng)絡應含:試驗目的:試驗任務:試驗結果截圖:思考題◎答:〔假設有的話〕試驗總、結:4NIOTCPEcho客戶端及效勞器試驗目的:生疏基于java的UDP套接字網(wǎng)絡編程萬法;生疏UDPClient套接字編程流程;生疏UDPServer套接字編程流程;生疏javaUDPjava類;試驗任務:實現(xiàn)一個根本的UDP套接字Clicnt/Scrver模式的網(wǎng)絡應用系統(tǒng).該系統(tǒng)中客戶端通過健盤承受用戶輸入,并將用戶輸入內(nèi)容通過UDP協(xié)議發(fā)送給效勞器端;效勞器端監(jiān)聽網(wǎng)絡,承受Echo效勞的效勞器程序。指導說明:1UDP客戶端根本編程流程1.1UDP客戶端工作流程創(chuàng)立數(shù)據(jù)報套接字〔郵筒〕,用于發(fā)送和接嘆數(shù)據(jù)報;創(chuàng)立發(fā)送型DatagramPacket對象〔信封〕,并發(fā)送給效勞器;創(chuàng)立接收型DatagramPacket對象〔信封〕,從網(wǎng)絡接收效勞器數(shù)據(jù):12UDP 客戶端完整程序源碼例如importjava.io.*;import.*;publicclassSimpleUDPClient{publicstaticvoidinain(Stringargs[])throwsException{〃基于系統(tǒng)輸入流構造具有緩沖區(qū)的字符流對金,用于接收畫盤輸入BufferedReaderinFromUser=newBufferedRea(ler(newInputStreainReader(Systein.in));〃構造數(shù)據(jù)報套接字DatagramSocketclientsocket=newDatagramSocket;〃預備DatagramPacket對象的地址和數(shù)據(jù)緩沖區(qū)InetAddressIPAddress=InetAddress.getByNanie(Mlocalhostu);byte[]sendData=newbytefl024];bvte[]receiveData=newbyte[1024];while(true){Stringsentence=inFromUsenreadLine;〃從輸入終端接收字符卑sendData=sentence.getBytes;〃將字符串以字節(jié)形式保存于字節(jié)數(shù)組中DatagramPacket劉象DatagrainPacketsendPacket=newDatagramPacket(sendData,sendData.length,IPAddress,9876);clientsocket.send(sendPacket);//發(fā)送數(shù)據(jù)報DatagramPacket劉象DatagrainPacketreceivePacket=newDatagramPacket(receiveData,receiveData.Iength);clientsocket.receive(receivePacket);//接收UDP協(xié)議發(fā)送來的數(shù)據(jù)DatagrainPacket象緩沖區(qū),構造字符串StringmodifiedSentence=newString(receivePacket君etData〃獲得緩沖區(qū)的字節(jié)數(shù)組首地址0〃從緩沖區(qū)中第一個要讀取的字節(jié)相對于首地址的偏移■receivePacket.getLength//^際從網(wǎng)絡上接收的字節(jié)數(shù)System.out.println(1*FROMSERVER:u+modifiedSentence);UDP

溫馨提示

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

評論

0/150

提交評論