Java程序設(shè)計基礎(chǔ)與實踐課件第12章_第1頁
Java程序設(shè)計基礎(chǔ)與實踐課件第12章_第2頁
Java程序設(shè)計基礎(chǔ)與實踐課件第12章_第3頁
Java程序設(shè)計基礎(chǔ)與實踐課件第12章_第4頁
Java程序設(shè)計基礎(chǔ)與實踐課件第12章_第5頁
已閱讀5頁,還剩22頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第12章網(wǎng)絡(luò)編程TCP和UDP的概念基于TCP協(xié)議的網(wǎng)絡(luò)編程方法基于UDP協(xié)議的網(wǎng)絡(luò)編程方法InetAddress類和URL類12.1.1TCP和UDP⑴TCP

TCP的全稱為TransmissionControlProtocol,稱為網(wǎng)絡(luò)傳輸控制協(xié)議,主要負責(zé)數(shù)據(jù)的分組和重組,它與IP協(xié)議組合,稱為TCP/IP。⑵UDP

UDP的全稱為UserDatagramProtocol,稱為用戶數(shù)據(jù)報協(xié)議,和TCP不同,UDP是一種非持續(xù)連接的通信協(xié)議,它不能保證數(shù)據(jù)能夠正確抵達目標(biāo),而且多個數(shù)據(jù)包抵達目標(biāo)的順序可能與發(fā)送時的順序不同。12.1.2InetAddress類

IP地址是每個計算機在網(wǎng)絡(luò)中的唯一標(biāo)識,要想進行網(wǎng)路通信,必須獲得正確的IP地址。Java提供了IP地址的封裝類InetAddress。方法說明getByName(Strings)獲取指定主機的IP地址getLocalhost()返回本地主機的InetAddress對象getHostName()獲取此主機名getHostAddress()獲取此主機IP地址isReachable(inttimeout)在timeout指定的毫秒時間內(nèi),測試IP地址是否可達表12.1InetAddress類常用方法例如:獲取域名為“”的網(wǎng)絡(luò)IP地址等信息。import.*;publicclassTest{ publicstaticvoidmain(String[]args){ try{//使用InetAddress類要進行異常處理

InetAddressaddress=InetAddress.getByName(""); StringdomainName=address.getHostName(); StringipName=address.getHostAddress(); InetAddressmine=address.getLocalHost(); System.out.println(domainName); System.out.println(ipName); System.out.println(mine.toString()); } catch(UnknownHostExceptione){e.printStackTrace();}}}12.1.3基于TCP協(xié)議的網(wǎng)絡(luò)編程⑴創(chuàng)建服務(wù)器端套接字服務(wù)器端套接字是ServerSocket類的實例對象,用于實現(xiàn)服務(wù)器程序,ServerSocket類監(jiān)視指定的端口,并建立客戶端到服務(wù)器端套接字的連接,也就是負責(zé)客戶端的呼叫任務(wù)。 例如:

try{ ServerSocketss=newServerSocket(1880); }catch(IOExceptione){}⑵創(chuàng)建客戶端套接字 客戶端端套接字是Socket類的實例對象,用于實現(xiàn)客戶端程序。⑶服務(wù)器端接受客戶端請求 在服務(wù)器端利用其accept()方法接收客戶端的套接字連接請求。 例如,上面創(chuàng)建的服務(wù)器端套接字ss接受客戶端請求,代碼如下:

try{ mysocket=ss.accept(); }catch(IOExceptione){}⑷客戶端發(fā)送和接收服務(wù)器

Socket類提供了getInputStream()方法和getOutStream()方法來接收和發(fā)送數(shù)據(jù)。例如:一個簡單的聊天室客戶端程序:importjava.io.*;import.*;publicclassStudent{//學(xué)生類

publicstaticvoidmain(Stringargs[]){try{Socketsocket=newSocket("",4700);//向本機的4700端口發(fā)出客戶請求

BufferedReadersin=newBufferedReader(newInputStreamReader(System.in));//由系統(tǒng)標(biāo)準(zhǔn)輸入設(shè)備構(gòu)造BufferedReader對象

PrintWriteros=newPrintWriter(socket.getOutputStream());//由Socket對象得到輸出流,并構(gòu)造PrintWriter對象

BufferedReaderis=newBufferedReader(newInputStreamReader(socket.getInputStream()));//由Socket對象得到輸入流,并構(gòu)造相應(yīng)的BufferedReader對象

Stringreadline;readline=sin.readLine();//從系統(tǒng)標(biāo)準(zhǔn)輸入讀入一字符串

while(!readline.equals("bye")){//若從標(biāo)準(zhǔn)輸入讀入的字符串為"bye"則停止循環(huán)

os.println(readline);//將從系統(tǒng)標(biāo)準(zhǔn)輸入讀入的字符串輸出到Serveros.flush();//刷新輸出流,使Server馬上收到該字符串

System.out.println("學(xué)生:"+readline);//在系統(tǒng)標(biāo)準(zhǔn)輸出上打印讀入的字符串

System.out.println("老師:"+is.readLine());//從Server讀入一字符串,并打印到標(biāo)準(zhǔn)輸出上

readline=sin.readLine();//從系統(tǒng)標(biāo)準(zhǔn)輸入讀入一字符串

}//繼續(xù)循環(huán)

os.close();//關(guān)閉Socket輸出流

is.close();//關(guān)閉Socket輸入流

socket.close();//關(guān)閉Socket}catch(Exceptione){System.out.println("Error"+e);//出錯,則打印出錯信息

}}}服務(wù)器端程序:importjava.io.*;import.*;publicclassTeacher{//老師類

publicstaticvoidmain(Stringargs[]){try{ServerSocketserver=null;try{server=newServerSocket(4700);//創(chuàng)建一個ServerSocket在端口4700監(jiān)聽客戶請求

}catch(Exceptione){System.out.println("cannotlistento:"+e);//出錯,打印出錯信息

}Socketsocket=null;try{socket=server.accept();//使用accept()阻塞等待客戶請求,有客戶

//請求到來則產(chǎn)生一個Socket對象,并繼續(xù)執(zhí)行

}catch(Exceptione){System.out.println("Error."+e);//出錯,打印出錯信息

}Stringline;BufferedReaderis=newBufferedReader(newInputStreamReader(socket.getInputStream()));//由Socket對象得到輸入流,并構(gòu)造相應(yīng)的BufferedReader對象

PrintWriteros=newPrintWriter(socket.getOutputStream());//由Socket對象得到輸出流,并構(gòu)造PrintWriter對象

BufferedReadersin=newBufferedReader(newInputStreamReader(System.in));//由系統(tǒng)標(biāo)準(zhǔn)輸入設(shè)備構(gòu)造BufferedReader對象

System.out.println("學(xué)生:"+is.readLine());//在標(biāo)準(zhǔn)輸出上打印從客戶端讀入的字符串

line=sin.readLine();//從標(biāo)準(zhǔn)輸入讀入一字符串

while(!line.equals("bye")){//如果該字符串為"bye",則停止循環(huán)

os.println(line);//向客戶端輸出該字符串

os.flush();//刷新輸出流,使Client馬上收到該字符串

System.out.println("老師:"+line);//在系統(tǒng)標(biāo)準(zhǔn)輸出上打印讀入的字符串

System.out.println("學(xué)生:"+is.readLine());//從Client讀入一字符串,并打印到標(biāo)準(zhǔn)輸出上

line=sin.readLine();//從系統(tǒng)標(biāo)準(zhǔn)輸入讀入一字符串

}//繼續(xù)循環(huán)

os.close();//關(guān)閉Socket輸出流

is.close();//關(guān)閉Socket輸入流

socket.close();//關(guān)閉Socketserver.close();//關(guān)閉ServerSocket}catch(Exceptione){System.out.println("Error:"+e);//出錯,打印出錯信息

}}}⑸多客戶的Client/Server程序設(shè)計為了實現(xiàn)在服務(wù)器方給多個客戶提供服務(wù)的功能,需要對上面的程序進行改造,利用多線程實現(xiàn)多客戶機制。例如:多線程實現(xiàn)Socket套接字的示例??蛻舳硕顺绦颍篿mport.*;importjava.io.*;publicclassStudent1{publicstaticvoidmain(String[]args)throwsException{Socketserver=newSocket("localhost",4700);//向本機的4700端口發(fā)出客戶請求

BufferedReaderin=newBufferedReader(newInputStreamReader(server.getInputStream()));//由Socket對象得到輸入流,并構(gòu)造相應(yīng)的BufferedReader對象

PrintWriterout=newPrintWriter(server.getOutputStream());//由Socket對象得到輸出流,并構(gòu)造PrintWriter對象

BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));//由系統(tǒng)標(biāo)準(zhǔn)輸入設(shè)備構(gòu)造BufferedReader對象

while(true){Stringstr=br.readLine();//從系統(tǒng)標(biāo)準(zhǔn)輸入讀入一字符串

out.println(str);//將從系統(tǒng)標(biāo)準(zhǔn)輸入讀入的字符串輸出到Serverout.flush();//刷新輸出流,使Server馬上收到該字符串

if(str.equals("bye")){//若從標(biāo)準(zhǔn)輸入讀入的字符串為"bye"則停止循環(huán)

break;}System.out.println(in.readLine());//從Server讀入一字符串,并打印到標(biāo)準(zhǔn)輸出上

}server.close();//關(guān)閉Socket}}服務(wù)器端程序:import.*;importjava.io.*;publicclassTeacherextendsThread{//多線程

privateSocketsocket;publicTeacher(Socketsocket){this.socket=socket;}publicvoidrun(){//線程主體

try{BufferedReaderin=newBufferedReader(newInputStreamReader(socket.getInputStream()));//由Socket對象得到輸入流,并構(gòu)造相應(yīng)的BufferedReader對象

PrintWriterout=newPrintWriter(socket.getOutputStream());//由Socket對象得到輸出流,并構(gòu)造PrintWriter對象

while(true){Stringstr=in.readLine();System.out.println("學(xué)生說:"+str);//在標(biāo)準(zhǔn)輸出上打印從客戶端讀入的字符串

out.println("學(xué)生:"+str);//向客戶端輸出該字符串

out.flush();//刷新輸出流,使Client馬上收到該字符串

if(str.equals("bye"))break;}}catch(IOExceptione){System.out.println(e.getMessage());//出錯,打印出錯信息

}}publicstaticvoidmain(String[]args)throwsIOException{ServerSocketserver=newServerSocket(4700);//創(chuàng)建一個ServerSocket在端口4700監(jiān)聽客戶請求

while(true){Sockets=server.accept();//使用accept()阻塞等待客戶請求,有客戶請求到來則產(chǎn)生一個Socket對象,并繼續(xù)執(zhí)行

newTeacher(s).start();}}}12.1.4基于UDP協(xié)議的網(wǎng)絡(luò)編程⑴DatagramPacket類

DatagramPacket類是UDP所傳遞的數(shù)據(jù)包,即打包數(shù)據(jù)。⑵DatagramSocket類

DatagramSocket類是用于發(fā)送和接收數(shù)據(jù)的數(shù)據(jù)包套接字。例如:DatagramSocketreceivedata=newDatagramSocket(7312);bytedata[]=newbyte[100];intlength=60;DatagramPacketdata_pack=newDatagramPacket(data,length);receivedata.receive(data_pack);同學(xué)A:import.*;importjava.io.*;classStudentAextendsThread{//實現(xiàn)多線程

DatagramPacketpack=null; bytedata[]=newbyte[8192]; publicvoidrun(){//數(shù)據(jù)接收

DatagramSocketrecieve_data=null;try{recieve_data=newDatagramSocket(666);//接收端口666 pack=newDatagramPacket(data,data.length);

}catch(Exceptione){}while(true){if(recieve_data==null)break;else{try{recieve_data.receive(pack);//接收數(shù)據(jù)報packintlength=pack.getLength();Stringmessage=newString(pack.getData(),0,length);//將數(shù)據(jù)報轉(zhuǎn)換為字符串

System.out.println("接收到StudentB的數(shù)據(jù):"+message);//將字符串通過標(biāo)準(zhǔn)輸出打印在控制臺上

}catch(Exceptione){}}}}publicstaticvoidmain(Stringargs[])throwsException{ StudentAs=newStudentA(); s.start(); BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));//由系統(tǒng)標(biāo)準(zhǔn)輸入設(shè)備構(gòu)造BufferedReader對象

while(true){ Stringstr=br.readLine();//從系統(tǒng)標(biāo)準(zhǔn)輸入讀入一字符串

bytebuffer[]=str.getBytes(); InetAddressaddress=InetAddress.getByName("localhost"); DatagramPacketdata_pack=newDatagramPacket(buffer,buffer.length,address,888);

//將數(shù)據(jù)發(fā)送到本機888端口

DatagramSocketsent_data=newDatagramSocket(); sent_data.send(data_pack);//發(fā)送數(shù)據(jù)報

} }}同學(xué)B:import.*;importjava.io.*;classStudentBextendsThread{//實現(xiàn)多線程

DatagramPacketpack=null; bytedata[]=newbyte[8192]; publicvoidrun(){//數(shù)據(jù)接收

DatagramSocketrecieve_data=null;try{recieve_data=newDatagramSocket(888);//接收端口888 pack=newDatagramPacket(data,data.length);}catch(Exceptione){}while(true){if(recieve_data==null)break;else{try{recieve_data.receive(pack);//接收數(shù)據(jù)報packintlength=pack.getLength();Stringmessage=newString(pack.getData(),0,length);//將數(shù)據(jù)報轉(zhuǎn)換為字符串

System.out.println("接收到StudentA的數(shù)據(jù):"+message);//將字符串通過標(biāo)準(zhǔn)輸出打印在控制臺上

}

溫馨提示

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

評論

0/150

提交評論