版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 八年級上冊歷史人教版同步聽課評課記錄第6課《戊戌變法》
- 新版湘教版秋八年級數(shù)學(xué)上冊第二章三角形課題三角形高線角平分線中線聽評課記錄
- 五年級上美術(shù)聽評課記錄
- 北師大版道德與法治七年級下冊3.1《情緒使生活更美》聽課評課記錄
- 人教版地理八年級下冊第九章第一節(jié)《自然特征與農(nóng)業(yè)》聽課評課記錄
- 人教部編版八年級道德與法治上冊:8.1《國家好 大家才會好》聽課評課記錄2
- 中考道德與法治一輪復(fù)習(xí)九年級上第4單元和諧與夢想 聽課評課記錄 人教版
- 小學(xué)二年級數(shù)學(xué)乘法口算測試題人教版
- 蘇教版小學(xué)數(shù)學(xué)五年級上冊口算試題全套
- 班組長個人工作計劃書
- 降水預(yù)報思路和方法
- 工程設(shè)計方案定案表
- 第一章-天氣圖基本分析方法課件
- 虛位移原理PPT
- 暖氣管道安裝施工計劃
- 初二物理彈力知識要點及練習(xí)
- QE工程師簡歷
- 輔音和輔音字母組合發(fā)音規(guī)則
- 2021年酒店餐飲傳菜員崗位職責(zé)與獎罰制度
- 最新船廠機艙綜合布置及生產(chǎn)設(shè)計指南
- 可降解塑料制品項目可行性研究報告-完整可修改版
評論
0/150
提交評論