版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
《TCP/IP協(xié)議分析》課程試驗(yàn)指導(dǎo)書(shū)1TCP套接字編程試驗(yàn)試驗(yàn)?zāi)康模荷杌趈ava的TCP套接字網(wǎng)絡(luò)編程方法;生疏TCPClient套接字編程流程;生疏TCPServer套接字編程流程;生疏javaTCPjava類(lèi);試驗(yàn)任務(wù):實(shí)現(xiàn)一個(gè)根本的TCP套接字Client/Sener模式的網(wǎng)絡(luò)應(yīng)用系統(tǒng),該系統(tǒng)中效勞器端監(jiān)聽(tīng)網(wǎng)個(gè)類(lèi)似于Echo效勞的效勞器程序。指導(dǎo)說(shuō)明:1TCP客戶(hù)端根本編程流程11TCP客戶(hù)端工作流程創(chuàng)立流套接字向遠(yuǎn)程效勞器發(fā)起連接懇求;獵取套接字字節(jié)流與遠(yuǎn)程效勞器進(jìn)展數(shù)據(jù)通信;通信完畢.關(guān)閉套接字;基于Java的TCP客戶(hù)端編寫(xiě)根本步驟說(shuō)明基于Java的TCP客戶(hù)端會(huì)使用下述類(lèi)或接口:Socket、InetAddress%InputStream%OutPutStream等.根本上這些可能在JavaTCP客戶(hù)端程序中使用的類(lèi)大致會(huì)包含于下述常用的Java庫(kù)文件中:.*、java.io.*、java.util.*等°因此編寫(xiě)該TCPjava類(lèi)文件的開(kāi)頭.固然也可以在事后添加。TCPJavaJava庫(kù)文件import.*;importjava.io.*;這里介紹的一個(gè)最根本的TCP客戶(hù)謊程序中根本就只會(huì)使用上述java庫(kù)文件中所包含的類(lèi)了。java厚文件。與遠(yuǎn)程效勞器端發(fā)起TCP連接懇求TCP客戶(hù)端要完成與遠(yuǎn)程效勞器的TCP連接的工作,需要做以下幾件事情:設(shè)定TCP效勞器程序所運(yùn)行的計(jì)算機(jī)網(wǎng)絡(luò)接□地址(IP地址):設(shè)定TCP效勞器程序所監(jiān)聽(tīng)的網(wǎng)絡(luò)端□號(hào);向遠(yuǎn)程TCPTCP連接懇求;看似很多事情,其實(shí)在java中編程完成這些事情,相當(dāng)簡(jiǎn)潔。通常狀況下,假設(shè)要連接某IP地址或者該主機(jī)名。IP或主機(jī)名來(lái)在TCP客戶(hù)端程序中構(gòu)造一個(gè)InetAddressIP=23;主機(jī)名=whpucomputerInetAddressserverIP=InetA(ldress.getBvName(u23,r);或InetAddressserverIP=InetAddress.getByNameC”whpucompiiter“);~~光知道遠(yuǎn)程效勞器程序所運(yùn)行的主機(jī)地址還不酸,TCP號(hào)為:8888O知道了遠(yuǎn)程效勞器程序所運(yùn)行于的主機(jī)地址和其所監(jiān)聽(tīng)的端□號(hào)后,就可以使用Socket類(lèi)發(fā)起與遠(yuǎn)程效勞器程序建立TCP連接的懇求了,具體代碼如下:Socketclientsock=newSocket(serverIP,8888);~~上直代碼復(fù)制符右端的Socket萬(wàn)法假設(shè)成功返回,那么就會(huì)返回一個(gè)Socket類(lèi)對(duì)象的引用給Socket類(lèi)對(duì)象引用來(lái)完成與遠(yuǎn)程效勞器程序的通信工作了。不過(guò),該段代碼有個(gè)比較明顯的問(wèn)題:8888(^0程習(xí)慣。具體如何跟好的設(shè)置端□號(hào).后面整體說(shuō)明旳進(jìn)展解釋。到此,TCP客戶(hù)謊編寫(xiě)發(fā)起向TCP效勞器程序的TCP連接懇求的代碼就完成了,整體代碼大致如下所示:InetAddressserverIP=InetAddress.getByName(“whpucompiiter””);Socketclientsock=newSocket(serverIP?8888);與遠(yuǎn)程TCP效勞器程序逬行通信基于java的TCP套接字程序中,與遠(yuǎn)程網(wǎng)絡(luò)程序逬行通信主要使用的是Socket類(lèi)中的兩個(gè)類(lèi)成員InputSteamOiHpinStrcamSocket類(lèi)的成員需要使用Socket類(lèi)供給的兩個(gè)方法:getlnputStream和getOutputStreamo在前面介紹的代碼中,假設(shè)己經(jīng)成功與遠(yuǎn)程效勞器程序建立了一個(gè)TCP連接,并獵取了一個(gè)SocketInputstreamOutputStrcam的對(duì)象的代碼如下:InputStreainin=clientsock.getlnputStreamO;Outputstreamout=clientsock.getOutputStreain;javaInputStreamOmputStrcam類(lèi)對(duì)象,一來(lái)直接InputStreamOutputStrcamI/O操作,這樣使用性能不高,特別是每次輸入或輸出的數(shù)據(jù)比較少的狀況下,會(huì)反復(fù)進(jìn)展I/O操作,由于每次I/O操作會(huì)消耗大量處理肘間,因此勢(shì)必帶來(lái)運(yùn)行效率不高的問(wèn)題。對(duì)InputStream的封裝InputStream流對(duì)象中的字節(jié)數(shù)據(jù),就可以對(duì)I叩utStrcam字節(jié)流對(duì)象進(jìn)展封裝,代碼如下所示:InputStreamReaderin=newInputStreainReader(clientsock.getInputStream);-上面的代碼只是將原來(lái)以字節(jié)訪(fǎng)問(wèn)方式的流轉(zhuǎn)換為以字符方式訪(fǎng)問(wèn)的流,并沒(méi)有轉(zhuǎn)變I/O操作的方式,為了提高訪(fǎng)冋信息,我們需要為流供給緩沖區(qū),以便不必每次操作流時(shí)都產(chǎn)生I/O操作。i(Outputstream),者顯式的調(diào)用流的flush方法時(shí),緩沖區(qū)中的數(shù)據(jù)才會(huì)真實(shí)的寫(xiě)入文件流,否則.不會(huì)執(zhí)行將緩沖^(InputStream),地輸入流傳送來(lái)的數(shù)據(jù),而在緩沖區(qū)己滿(mǎn)時(shí).表示外界向本地發(fā)送數(shù)據(jù)的速度快于本地處理輸入流BufferedReaderin=newBufferedReader(newInputStreamReader(clientsock.getlnputStreamO));對(duì)Outputstream的封裝對(duì)于Oinpu⑸reamInputStream。具體代碼如下:BufferedWriterout=newBufferedVVriter(newInputStreamWriter(clientsock.getOutputStream));為了更簡(jiǎn)潔的打印出緩沖區(qū)中的字符串,可以逬一步對(duì)BufferedWriter對(duì)象逬行封裝,例如:Printwriterout=newPrintWrite(newBufferedVVriter(newInputStreamWriter(clientsock.getOutputStreamO)));1.2.4Client業(yè)務(wù)規(guī)律實(shí)現(xiàn)這里需要實(shí)現(xiàn)的Client功能如下描述:10Server端發(fā)送字符串”HelloServer“+i(i0<=i<10),Server的反響信息,并將Server反響信息打印到屏幕上?!盨erverTCP連接的套接字對(duì)象:clientsockoClient功能描述,具體的代碼實(shí)現(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對(duì)象,調(diào)用PrintWriter對(duì)彖的printin方法,會(huì)將”HelloServeri”寫(xiě)入緩沖區(qū)中.然而,這并不意味著緩沖區(qū)的內(nèi)容會(huì)寫(xiě)入到套接字的輸出流對(duì)象中,只有調(diào)用0山的flush方法后,緩沖區(qū)的數(shù)據(jù)才會(huì)發(fā)送到套接字的輸出流對(duì)象,網(wǎng)路才有可能將數(shù)據(jù)發(fā)送出去。Server端回饋的信息,假設(shè),Server回饋信息到來(lái),那么該方法就會(huì)始終堵塞在哪里不會(huì)返回;而且就算Server端有數(shù)據(jù)返回,但是readLineServer端回饋的數(shù)據(jù)最后肯定要加上/血這兩個(gè)字符,這可以手動(dòng)添加到ServerPrintWriter對(duì)象的printin方法,該方法會(huì)自動(dòng)為字符串末尾添加/r/%提示:在實(shí)際的網(wǎng)絡(luò)應(yīng)用程序中,避開(kāi)使用Printin和readLine方法,雖然這些方法在處理字符串方面格外簡(jiǎn)潔好用,但是由于不⑥的操作系統(tǒng)的文本行完畢符各不一樣,這會(huì)導(dǎo)致跨12.5TCP 連接的關(guān)閉ClientServer?Socketclose方法來(lái)關(guān)閉套接字,此時(shí).假設(shè)系統(tǒng)套接字緩存中還有數(shù)據(jù)未發(fā)送.系統(tǒng)會(huì)嘗試連續(xù)發(fā)送數(shù)據(jù),TCP/IP協(xié)議棧也同時(shí)會(huì)向ServerFINServer.ServerACK確認(rèn)FINTCPServerTCP/IP協(xié)議棧也發(fā)過(guò)來(lái)FIN包.并且Client端的TCP/IP協(xié)議棧發(fā)送對(duì)此次FINACK包后,整個(gè)TCP連接才完整關(guān)閉。當(dāng)ClinetcloseServer-1或者null.通過(guò)這可以推斷出TCP連接的遠(yuǎn)端程序己經(jīng)關(guān)閉了套接字,本地也可以關(guān)閉TCP連接的套接字了。然而.這種靠底層TCP/IP協(xié)議機(jī)制來(lái)掌握的套接字關(guān)閉的時(shí)機(jī),不是特別抱負(fù)。最好的方式是在Client和Server端之間協(xié)商一種應(yīng)用層的連接完畢的機(jī)制。例如:out.println(*”END,”);out.flushO;~~在Client不想再保持連接時(shí).就事先向ServerTCP連接的意圖。如上面代碼所示,在Client發(fā)送完全部數(shù)據(jù)之后,向Server謊發(fā)送一個(gè)字符卑“END”Server端在Client種機(jī)制保證在ServerClientTCP/IP發(fā)送的HNClient己經(jīng)斷幵的狀態(tài),這種方法確定更好一些。在發(fā)送了“END“字符串后,Client就可以無(wú)需再去考慮Server的close方法關(guān)閉套按字。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效勞端工作流程通過(guò)指定端□創(chuàng)立效勞器套接字,調(diào)用accept方法監(jiān)聽(tīng)端口,接收將要到來(lái)的連接懇求;通過(guò)accept通信;本次通信完畢,關(guān)閉accept方法返回的流套接字;循環(huán)到第2步,連續(xù)監(jiān)聽(tīng);基于Java的TCP效勞端編寫(xiě)根本步驟說(shuō)明基于Java的TCP客戶(hù)瀟會(huì)使用下述類(lèi)或接口:ScrvcrSockct、Socket、InetAddress,Inputstream,OulPutStream等,根本上這些可能在JavaTCP客戶(hù)端程序中使用的類(lèi)大致會(huì)包含于下述常用的Java庫(kù)文件中:.*、java.io.*、java.util.*等。因此編寫(xiě)該TCP的java類(lèi)文件的開(kāi)頭.固然也可以在事后添加。TCPJavaJava庫(kù)文件import>*;importjava.io.*;這里介紹的一個(gè)最根本的TCP效勞謊程序中根本就只會(huì)使用上述java庫(kù)文件中所包含的類(lèi)了。大家可以依據(jù)編寫(xiě)的程序的需要.視狀況引入更多的java庫(kù)文件。創(chuàng)立ServerSocket效勞器端一般是被動(dòng)承受遠(yuǎn)程效勞懇求,因此必需要有一個(gè)事先商定好的固定監(jiān)聽(tīng)端口號(hào).并且效勞器不能只為一個(gè)客戶(hù)謊供給效勞,基于此特性,效勞器端應(yīng)當(dāng)在監(jiān)聽(tīng)到網(wǎng)絡(luò)上到來(lái)的效勞懇求后,利用一個(gè)的套接字與客戶(hù)端建立TCP連接,并逬行通信.而不能使用該監(jiān)聽(tīng)網(wǎng)絡(luò)的基于上述描述,java在構(gòu)建TCP效勞器程序肘,供給了一個(gè)名為ServerSocket的類(lèi),用來(lái)完成TCP效勞器端監(jiān)聽(tīng)網(wǎng)絡(luò)的工作。構(gòu)造ServerSocket端逬行連接肘,指定正確的連接端□號(hào)。構(gòu)造ServerSocketIP地址,這樣可以保證效勞器程序所運(yùn)行的計(jì)算機(jī)假設(shè)有多個(gè)網(wǎng)絡(luò)接□時(shí),不管是從那個(gè)網(wǎng)絡(luò)接□到來(lái)的數(shù)據(jù),只要指定的謊□號(hào)是該效勞器程序所期望的.那么數(shù)據(jù)都會(huì)被該效勞器程序所承受。1:該方法創(chuàng)立一個(gè)己8888之上的監(jiān)聽(tīng)套接字intlistenPort=8888;ServerSocketlistener=newServerSocket(listenPort);2:沒(méi)有綁定到特定端□號(hào)的監(jiān)聽(tīng)套接接字的bind方法.將套接字地址綁定intlistenPort=8888;InetAddresslocallP=InetAddress.getByName(null);InetSocketAddresslocalAddr=newInetSocketAddress(locallRlistenPort);ServerSocketlistener=newServerSocket;listener.bind(localAddr);到該套接字上。到該套接字上。223 監(jiān)聽(tīng)網(wǎng)絡(luò),承受連接懇求,并逬行通信調(diào)用Serversocketaccept方法,監(jiān)聽(tīng)網(wǎng)絡(luò),效勞懇求到來(lái)成功連接后返回連接套接字;獵取連接套接字的輸入字節(jié)流和輸出字節(jié)流;接收數(shù)據(jù)、處理數(shù)據(jù),發(fā)送數(shù)據(jù);關(guān)閉連接套接字;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務(wù)器反響:“+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;}思考題:認(rèn)真理解IP地址、域名、端□號(hào)這幾個(gè)槪念的實(shí)際所指,并結(jié)合實(shí)際應(yīng)用狀況的各種可能性思考它們之間的關(guān)系。試驗(yàn)要求:java的TCP套接字編寫(xiě)client/server模式網(wǎng)絡(luò)包含:試驗(yàn)?zāi)康模涸囼?yàn)任務(wù):試驗(yàn)結(jié)果截圖:思考題答復(fù):〔假設(shè)有的話(huà)〕試驗(yàn)總結(jié):試驗(yàn)2UDP 試驗(yàn)?zāi)康模荷杌趈ava的UDP套接字網(wǎng)絡(luò)編程方法;生疏UDPClient套接字編扌呈流程;生疏UDPServer套接字編程流程;生疏javaUDPjava類(lèi):試驗(yàn)任務(wù):實(shí)現(xiàn)一個(gè)根本的UDP套接字Clicnt/Scrvcr模式的網(wǎng)絡(luò)應(yīng)用系統(tǒng).該系統(tǒng)中客戶(hù)端通過(guò)鍵盤(pán)承受用戶(hù)輸入,并將用戶(hù)輸入內(nèi)容通過(guò)UDP協(xié)議發(fā)送給效勞器端;效勞器端監(jiān)聽(tīng)網(wǎng)絡(luò),承受Echo效勞的效勞器程序。指導(dǎo)說(shuō)明:1UDP客戶(hù)端根本編程流程UDP客戶(hù)端工作流程創(chuàng)立數(shù)據(jù)報(bào)套接字〔郵筒〕.用于發(fā)送和接收數(shù)據(jù)報(bào);創(chuàng)立發(fā)送型DatagramPacket對(duì)象〔信封〕,并發(fā)送給效勞器;創(chuàng)立接收型DatagramPacket對(duì)象〔信封〕,從網(wǎng)絡(luò)接收效勞器數(shù)據(jù);UDP客戶(hù)端完整程序源碼例如importjava.io.*;import.*;publicclassSiinpleUDPClient{publicstaticvoidmaiiKStringargs[]〕throwsException{〃基于系統(tǒng)輸入流構(gòu)造具有緩沖區(qū)的字符流劉象,用于接收鍵盤(pán)輸入BufferedReaderinFromUser=newBufferedReader(newInputStreamReader(System.in));〃構(gòu)造數(shù)據(jù)報(bào)套接字DatagramSocketclientsocket=newDatagramSocket;〃預(yù)備DatagramPacket對(duì)象的地址和數(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對(duì)象DatagrainPacketsendPacket=newDatagramPacket(sendData,sendData.length,IPAddress,9876);clientsocket.send(sendPacket);//發(fā)送數(shù)據(jù)報(bào)DatagramPacket對(duì)象DatagrainPacketreceivePacket=newDatagramPacket(receiveData,receiveData.length);clientSocket.receive(receivePacket)^/Jg收UDP協(xié)議發(fā)送來(lái)的數(shù)據(jù)DatagrainPacket對(duì)象緩沖區(qū),構(gòu)造字符串StringmodifiedSentence=newString(receivePacket.getDataO//^得緩沖區(qū)的字節(jié)數(shù)組首地址0〃從緩沖區(qū)中第一個(gè)要讀取的字節(jié)相對(duì)于首地址的偏移量receivePacket.getLength//^際從網(wǎng)絡(luò)上接收的字節(jié)數(shù));Systeni.out.println(1*FROMSERVER:”+modifiedSentence);UDP效勞端根本編程流程UDP效勞端工作流程創(chuàng)立具有固定端□號(hào)的數(shù)據(jù)報(bào)套接字〔覦筒〕.用于發(fā)送和接收數(shù)據(jù)報(bào);創(chuàng)立接收型DatagramPacket對(duì)彖〔信封〕,UDP協(xié)議傳送來(lái)的客戶(hù)端數(shù)據(jù);創(chuàng)立發(fā)送型DatagramPacket對(duì)彖〔信封〕,發(fā)送會(huì)送數(shù)據(jù)報(bào)文給客戶(hù)瀟;UDP效勞端完整程序源碼例如importjava.io.IOException;import.*;publicclassSimpleUDPServer{publicstaticvoidmain(String[]args)throwsIOException{〃構(gòu)造具有固定端□號(hào)的數(shù)據(jù)報(bào)套接字DatagramSocketserverSocket=newDatagramSocket(9876);〃定義緩沖區(qū)byte[]receiveData=newbyte[1024];byte[]sendData=newbyte[1024];while(true){ 〃構(gòu)造接收型緩沖區(qū)DatagramPacketreceivePacket=newDatagran)Packet(receiveData,receiveData.length);serverSocket.receive(receivePacket);//^收UDP協(xié)議發(fā)送來(lái)的數(shù)搖}思考題:
〃通過(guò)接收數(shù)據(jù)報(bào)的緩沖數(shù)據(jù)構(gòu)造字符串Stringsentence=newString(receivePacket.getData(),O,receivePacket.getLength);System.out.println(MRECEIVED:M+sentence);〃獵取該數(shù)據(jù)報(bào)的發(fā)送者IP地址InetAddressIPAddress=receivePacket?getAddress;〃獵取該數(shù)據(jù)報(bào)的發(fā)送者端□號(hào)intport=receivePacket.getPort;備字符串字符轉(zhuǎn)換為大寫(xiě)StringcapitalizedSentence=sentence.toUpperCase;sendData=capitalizedSentence.getBytes;〃構(gòu)造發(fā)送型DatagramPacket對(duì)象DatagramPacketsendPacket=newDatagramPacket(sendData,sendData.length,IPAddress^port);serverSocket.send(sendPacket) 在基于l:DP協(xié)議的網(wǎng)絡(luò)程序中,對(duì)于數(shù)據(jù)報(bào)文的緩沖區(qū)大小的設(shè)置,具體會(huì)有那些狀況〔可能性比較大的〕?選擇某種具體狀況下,分析會(huì)帶來(lái)哪些實(shí)際的編程問(wèn)題?假設(shè):Client端:接收緩沖為:c.recvbuff;發(fā)送緩沖為:c.sendbuff;
Server謝:接收緩沖為:s_recvbuff;發(fā)送緩沖為:s_sendbuff;例如:一種可能的狀況與發(fā)送數(shù)據(jù)大小的關(guān)系:c_recvbuff=c_sendbuff=s_recvbufT=s_sendbuff>data_size;crecvbuff=csenclbuff=srecvbuff=ssendbuff<datasize;試驗(yàn)要求:java的UDP套接字編寫(xiě)client/server模式網(wǎng)絡(luò)應(yīng)含:試驗(yàn)?zāi)康模涸囼?yàn)任務(wù):試驗(yàn)結(jié)果截圖:思考題◎答:〔假設(shè)有的話(huà)〕試驗(yàn)總、結(jié):3TCPEcho效勞器試驗(yàn)?zāi)康模簩W(xué)握java的多線(xiàn)程的編程萬(wàn)法;生疏多線(xiàn)程的網(wǎng)絡(luò)應(yīng)用程序的編程方法;試驗(yàn)任務(wù):11中所編寫(xiě)的TCPEcho效勞器程序,使之成為一個(gè)具有多通信效勞。指導(dǎo)說(shuō)明:Java線(xiàn)程的使用使用線(xiàn)程的步驟創(chuàng)立數(shù)據(jù)報(bào)套接字〔郵筒〕.用于發(fā)送和接收數(shù)據(jù)報(bào);創(chuàng)立發(fā)送型DatagramPacket對(duì)彖〔信封〕,并發(fā)送給效勞器;創(chuàng)立接收型DatagramPacket對(duì)彖〔信封〕,從網(wǎng)絡(luò)接收效勞器數(shù)據(jù):UDP客戶(hù)端完整程序源碼例如importjava.io.*;import.*;publicclassSimpleUDPClient{publicstaticvoidinain(Stringargs[])throwsException〃基于系統(tǒng)輸入流構(gòu)造具有緩沖區(qū)的字符流對(duì)象,用于接收鍵盤(pán)輸入BufferedReaderiiiFromUser=newBufferedReader(newInputStreaniReader(Systein.in));〃構(gòu)造數(shù)據(jù)報(bào)套接字DatagramSocketclientsocket=newDatagramSocket;〃預(yù)備DatagramPacket對(duì)象的地址和數(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ù)組中〃構(gòu)造發(fā)送型DatagramPacket對(duì)象DatagramPacketsendPacket=newDatagramPacket(sendData,sendData.length,IPAddress,9876);clientSocket.send(sendPacket);//^送數(shù)據(jù)報(bào)DatagramPacket劉象DatagramPacketreceivePacket=newDatagramPacket(receiveData,receiveData.length);clientSocket.receive(receivePacket);//^收UDP協(xié)議發(fā)送來(lái)的數(shù)據(jù)DatagramPacket對(duì)象緩沖區(qū),構(gòu)造字符串StringniodifiedSentence=newString(receivePacket.getData(得緩沖區(qū)的字節(jié)數(shù)組首地址0〃從緩沖區(qū)中第一個(gè)要讀取的字節(jié)相對(duì)于首地址的偏移■receivePacket.getLengthO//^際從網(wǎng)絡(luò)上接收的字節(jié)數(shù));System.out.println(MFROMSERVER:11+modifiedSentence);UDP效勞端根本編程流程UDP效勞端工作流程創(chuàng)立具有固定端□號(hào)的數(shù)據(jù)報(bào)套接字〔覦筒〕.用于發(fā)送和接收數(shù)據(jù)報(bào);創(chuàng)立接收型DatagramPacket對(duì)彖〔信封〕,UDP協(xié)議傳送來(lái)的客戶(hù)端數(shù)據(jù);創(chuàng)立發(fā)送型DatagramPacket對(duì)彖〔信封〕,發(fā)送會(huì)送數(shù)據(jù)報(bào)文給客戶(hù)瀟;UDP效勞端完整程序源碼例如importjava.io.IOException;import.*;publicclassSimpleUDPServer{publicstaticvoidmain(String[]args)throwsIOException{〃構(gòu)造具有固定端□號(hào)的數(shù)據(jù)報(bào)套接字DatagramSocketserverSocket=newDatagramSocket(9876);〃定義緩沖區(qū)byte[]receiveData=newbyte[1024];byte[]sendData=newbyte[1024];while(true){ 〃構(gòu)造接收型緩沖區(qū)DatagramPacketreceivePacket=newDatagran)Packet(receiveData,receiveData.length);serverSocket.receive(receivePacket);//^收UDP協(xié)議發(fā)送來(lái)的數(shù)搖〃通過(guò)接收數(shù)據(jù)報(bào)的緩沖數(shù)據(jù)構(gòu)造字符串Stringsentence=newString(receivePacket.getData(),O,receivePacket.getLength);System.out.println(MRECEIVED:M+sentence);〃獵取該數(shù)據(jù)報(bào)的發(fā)送者IP地址InetAddressIPAddress=receivePacket?getAddress;〃獵取該數(shù)據(jù)報(bào)的發(fā)送者端□號(hào)intport=receivePacketgetPortO;備字符串字符轉(zhuǎn)換為大寫(xiě)StringcapitalizedSentence=sentence.toUpperCase;sendData=capitalizedSentence.getBytes;DatagramPacket對(duì)象DatagramPacketsendPacket=newDatagramPacket(sendData,sendData.length,IPAddress^port);serverSocket.send(sendPacket) }思考題:在基于l:DP協(xié)議的網(wǎng)絡(luò)程序中,對(duì)于數(shù)據(jù)報(bào)文的緩沖區(qū)大小的設(shè)置,具體會(huì)有那些狀況〔可能性比較大的〕?選擇某種具體狀況下,分析合帶來(lái)哪些實(shí)際的編程問(wèn)題?假設(shè):Client端:接收緩沖為:c.recvbuff;發(fā)送緩沖為:c.sendbuff;data_size;
Server謝:接收緩沖為:s_recvbuff;發(fā)送緩沖為:s_sendbuff;例如:一種可能的狀況與發(fā)送數(shù)據(jù)大小的關(guān)系:c_recvbuff=c_sendbuff=s_recvbufT=s_sendbuff>data_size;crecvbuff=csenclbuff=srecvbuff=ssendbuff<datasize;試驗(yàn)要求:java的UDP套接字編寫(xiě)client/server模式網(wǎng)絡(luò)應(yīng)含:試驗(yàn)?zāi)康模涸囼?yàn)任務(wù):試驗(yàn)結(jié)果截圖:思考題◎答:〔假設(shè)有的話(huà)〕試驗(yàn)總、結(jié):4NIOTCPEcho客戶(hù)端及效勞器試驗(yàn)?zāi)康模荷杌趈ava的UDP套接字網(wǎng)絡(luò)編程萬(wàn)法;生疏UDPClient套接字編程流程;生疏UDPServer套接字編程流程;生疏javaUDPjava類(lèi);試驗(yàn)任務(wù):實(shí)現(xiàn)一個(gè)根本的UDP套接字Clicnt/Scrver模式的網(wǎng)絡(luò)應(yīng)用系統(tǒng).該系統(tǒng)中客戶(hù)端通過(guò)健盤(pán)承受用戶(hù)輸入,并將用戶(hù)輸入內(nèi)容通過(guò)UDP協(xié)議發(fā)送給效勞器端;效勞器端監(jiān)聽(tīng)網(wǎng)絡(luò),承受Echo效勞的效勞器程序。指導(dǎo)說(shuō)明:1UDP客戶(hù)端根本編程流程1.1UDP客戶(hù)端工作流程創(chuàng)立數(shù)據(jù)報(bào)套接字〔郵筒〕,用于發(fā)送和接嘆數(shù)據(jù)報(bào);創(chuàng)立發(fā)送型DatagramPacket對(duì)象〔信封〕,并發(fā)送給效勞器;創(chuàng)立接收型DatagramPacket對(duì)象〔信封〕,從網(wǎng)絡(luò)接收效勞器數(shù)據(jù):12UDP 客戶(hù)端完整程序源碼例如importjava.io.*;import.*;publicclassSimpleUDPClient{publicstaticvoidinain(Stringargs[])throwsException{〃基于系統(tǒng)輸入流構(gòu)造具有緩沖區(qū)的字符流對(duì)金,用于接收畫(huà)盤(pán)輸入BufferedReaderinFromUser=newBufferedRea(ler(newInputStreainReader(Systein.in));〃構(gòu)造數(shù)據(jù)報(bào)套接字DatagramSocketclientsocket=newDatagramSocket;〃預(yù)備DatagramPacket對(duì)象的地址和數(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ù)報(bào)DatagramPacket劉象DatagrainPacketreceivePacket=newDatagramPacket(receiveData,receiveData.Iength);clientsocket.receive(receivePacket);//接收UDP協(xié)議發(fā)送來(lái)的數(shù)據(jù)DatagrainPacket象緩沖區(qū),構(gòu)造字符串StringmodifiedSentence=newString(receivePacket君etData〃獲得緩沖區(qū)的字節(jié)數(shù)組首地址0〃從緩沖區(qū)中第一個(gè)要讀取的字節(jié)相對(duì)于首地址的偏移■receivePacket.getLength//^際從網(wǎng)絡(luò)上接收的字節(jié)數(shù)System.out.println(1*FROMSERVER:u+modifiedSentence);UDP
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度生態(tài)農(nóng)業(yè)地產(chǎn)合作開(kāi)發(fā)合同書(shū)
- 二零二五年度出租車(chē)座套定制與品牌推廣合同3篇
- 二零二五版電力設(shè)備質(zhì)檢員招聘與職責(zé)協(xié)議書(shū)3篇
- 個(gè)性化倉(cāng)儲(chǔ)解決方案服務(wù)外包協(xié)議范本版A版
- 2025年度企業(yè)員工心理健康培訓(xùn)服務(wù)合同范本8篇
- 中美洲2024年原材料供應(yīng)協(xié)議
- 養(yǎng)殖場(chǎng)動(dòng)物疫病防治服務(wù)合同(2025年度)3篇
- 2025版圍欄施工安全風(fēng)險(xiǎn)評(píng)估與應(yīng)急預(yù)案合同3篇
- 2025年度買(mǎi)賣(mài)合同擔(dān)保條款修訂版及風(fēng)險(xiǎn)防范策略
- 二零二五年度供暖設(shè)施安全檢測(cè)與暖氣安裝合同樣本
- 智慧校園信息化建設(shè)項(xiàng)目組織人員安排方案
- 浙教版七年級(jí)上冊(cè)數(shù)學(xué)第4章代數(shù)式單元測(cè)試卷(含答案)
- 一病一品成果護(hù)理匯報(bào)
- AQ-T 1009-2021礦山救護(hù)隊(duì)標(biāo)準(zhǔn)化考核規(guī)范
- 鹽酸??颂婺崤R床療效、不良反應(yīng)與藥代動(dòng)力學(xué)的相關(guān)性分析的開(kāi)題報(bào)告
- 消防設(shè)施安全檢查表
- 組合結(jié)構(gòu)設(shè)計(jì)原理 第2版 課件 第6、7章 鋼-混凝土組合梁、鋼-混凝土組合剪力墻
- 建筑公司資質(zhì)常識(shí)培訓(xùn)課件
- GB/T 26316-2023市場(chǎng)、民意和社會(huì)調(diào)查(包括洞察與數(shù)據(jù)分析)術(shù)語(yǔ)和服務(wù)要求
- 春節(jié)值班安全教育培訓(xùn)
- 帶狀皰疹護(hù)理查房
評(píng)論
0/150
提交評(píng)論