Java程序設計基礎教程(慕課版)(第2版) 課件 第11單元 網絡編程_第1頁
Java程序設計基礎教程(慕課版)(第2版) 課件 第11單元 網絡編程_第2頁
Java程序設計基礎教程(慕課版)(第2版) 課件 第11單元 網絡編程_第3頁
Java程序設計基礎教程(慕課版)(第2版) 課件 第11單元 網絡編程_第4頁
Java程序設計基礎教程(慕課版)(第2版) 課件 第11單元 網絡編程_第5頁
已閱讀5頁,還剩22頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第11單元網絡編程Java程序設計基礎教程((慕課版)(第2版))目錄導航11.1網絡協議11.3

UDP通信11.2

TCP通信11.4項目實戰11.5單元小結11.1.1TCP及UDPTCP/IP(TransmissionControlProtocol/InternetProtocol)叫作傳輸控制協議/互聯網協議,又叫作網絡通信協議,是互特網中使用的基本通信協議。該協議包含兩個保證數據完整傳輸的重要協議,即TCP和IP,同時包含上百種其他功能的協議。UDP是UserDatagramProtocol的簡稱,中文名是用戶數據報協議,是OSI(OpenSystemInterconnection,開放系統互連)參考模型中一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。UDP無須三次握手確保連接雙方都已準備就緒就可以傳輸數據。因為免去了三次握手,所以其消耗的服務器負載要遠小于TCP/IP。套接字(Socket)是TCP/IP中的基本概念,負責將TCP/IP包發送到指定的IP地址。它可以看作兩個程序通信連接中的端點。數據被寫入套接字中后,該套接字將數據發送到另一個套接字中,使數據能夠傳送給其他程序。URL是對可以從互聯網上得到的資源位置和訪問方法的一種簡潔表示,是互聯網上資源的標準地址。互聯網上的每個文件都有一個唯一的URL,它包含的信息指出文件的位置以及瀏覽器應該怎么處理它。URL由Internet資源類型(http或ftp等)、服務器地址(host)、端口(port)和資源在服務器上的位置組成。任務11-1URL類和URLConnection類的使用文件URLDemo.javapublicclassURLDemo{publicstaticvoidmain(String[]args){try{URLurl=newURL("/index.html");System.out.println("默認端口是:"+url.getDefaultPort());//打開一個URLConnection類對象URLConnectionurlConn=url.openConnection();//獲取請求頭Map<String,List<String>>map=urlConn.getHeaderFields();for(Entry<String,List<String>>entry:map.entrySet()){System.out.println(entry.getKey()+":"+entry.getValue());}System.out.println("content-type:"+urlConn.getContentType());System.out.println("是否獲取用戶緩存:"+urlConn.getDefaultUseCaches());}catch(MalformedURLExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}}運行結果如圖11-1所示。11.1.2IP地址及端口號IP地址具有唯一性,用于唯一標識網絡中的一臺設備。IPv4

(InternetProtocolVesion4,網際協議版本4,現行的IP版本)地址由4個小于256的字節組成,這些字節通過以“.”連接的32位字符串來表示,如24;IPv6(InternetProtocolVersion6,網際協議版本6)

則使用8個16位的無符號整數,通過用冒號“∶”隔開表示,例如6dfe:3312:1123:12df:dfdd:123s:fed2:ss4e。Java網絡包中提供了Inet4Address類和Inet6Address類,分別對應IPv4和IPv6地址。由于IP地址是數字標識,難于記憶和書寫,所以在IP地址的基礎上又發展出一種符號化的地址方案,來代替數字型的IP地址,每一個符號化的地址與特定的IP地址對應。因為符號化的地址有其對應的意義和內容,所以記憶和書寫都非常方便。這些符號化的地址就是域名,例如人民郵電出版社的域名就是

。但域名不能直接被網絡設備所識別,需要域名服務器(DomainNameServer,DNS)對域名與IP地址做對應的轉換。計算機端口對應的英文是port。硬件中的端口也稱接口;在軟件中,端口一般是指網絡中面向連接服務和無連接服務的通信協議識別代碼,是一種抽象的軟件結構,包括一些數據結構和輸入輸出緩沖區。計算機在通信時需要指定端口,以傳遞信息。端口號可以是0~65535之間的任意一個整數。任務11-2IP類的使用文件IPDemo.javapublicclassIPDemo{publicstaticvoidmain(String[]args){try{InetAddressip=InetAddress.getByName("");System.out.println("主機名是:"+ip.getHostName()+",

地址是:"+ip.getHostAddress());System.out.println("地址是否可達:"+ip.isReachable(1000));InetAddress[]ads=InetAddress.getAllByName("");System.out.println("開始獲取當前域名對應的所有IP地址:");for(InetAddressad:ads){System.out.println(""+ad.getHostName()+":"+ad.getHostAddress());}System.out.println("結束獲取當前域名對應的所有IP地址。");System.out.println("當前主機的地址是:"+InetAddress.getLocalHost());}catch(UnknownHostExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}}運行結果如圖11-2所示目錄導航11.1網絡協議11.3

UDP通信11.2

TCP通信11.4項目實戰11.5單元小結11.2.1Socket類當兩個程序想要通信的時候,可以使用Socket類建立套接字連接,使呼叫的一方成為客戶端,接收的一方成為服務器端。服務器端使用的套接字是ServerSocket。Socket類和ServerSocket類使用的IP地址和端口號必須相同,端口號在服務器端和客戶端必須一致才能通信。③

服務器端接收到請求,進行處理并返回給客戶機處理結果。④

客戶端接收結果,進行后續處理。②

客戶端對指定的端口發起請求。①

服務器端開啟監聽功能,監聽指定端口。客戶端/服務器端對話過程11.2.1Socket類在Java中,Socket類的創建有兩種方式,一種是非阻塞式創建(這種方式可以設置超時時間):Socketso=newSocket();SocketAddresssaddr=newInetSocketAddress(InetAddress.getByName(""),80);so.connect(saddr,3000);另一種是阻塞式創建:Socketso=newSocket("",80);或者Socketso=newSocket(InetAddress.getByName(""),80);11.2.2ServerSocket類ServerSocket類是服務器端套接字,用于對指定的端口進行監聽。當監聽到請求之后,可以使用accept()方法接收客戶端發來的消息。該方法是阻塞的,直到有連接響應,才會返回一個Socket對象。服務器可以使用該Socket類與客戶端進行通信。圖11-3Socket類的通信模型任務11-3端到端通信文件SocketClientDemo.javapublicclassSocketClientDemo{publicstaticvoidmain(String[]args){try(Socketsocket=newSocket("localhost",8182);InputStreamis=socket.getInputStream();OutputStreamos=socket.getOutputStream()){System.out.println("已經連接上服務器,等待服務器端返回數據:");byte[]buf=newbyte[2048];inti=0;StringBuildersb=newStringBuilder();while((i=is.read(buf))!=-1){sb.append(newString(buf,"UTF-8"));}System.out.println("服務器端返回數據:"+sb);}catch(IOExceptione){e.printStackTrace();}}}任務11-3端到端通信文件SocketServerDemo.javapublicclassSocketServerDemo{

publicstaticvoidmain(String[]args)throwsIOException{try(ServerSocketss=newServerSocket(8182)){while(true){try(Socketso=ss.accept();OutputStreamos=so.getOutputStream();PrintWriterpw=newPrintWriter(os);InputStreamis=so.getInputStream()){System.out.println("客戶端地址【:"+so.getInetAddress()+",端口號:"+so.getPort()+"】已經連接到服務器!");pw.write("Hello,"+so.getInetAddress()+",非常感謝您的本次連接。");pw.write("連接成功!");pw.flush();System.out.println("服務器端數據返回成功!開始后續數據的交流步驟!");}}}}}運行結果如圖11-4所示。目錄導航11.1網絡協議11.3

UDP通信11.2

TCP通信11.4項目實戰11.5單元小結11.3.1DatagramPacket類與UDP通信相關的處理類是DatagramPacket類,該類位于

包下。該類在接收方和發送方創建的對象是不同的,當發送的時候,發送方不僅要將需要發送的數據告訴DatagramPacket對象,還需要將數據要發送的地址和端口號告訴DatagramPacket對象;接收方則只需聲明要獲取的數據即可。方法功能描述DatagramPacket(byte[]buf,intlength)創建時指定封裝的字節數據和長度大小,用于數據接收方DatagramPacket(byte[]buf,intoffset,int

length)創建時指定封裝的字節數據、數據的偏移量和讀取長度,用于數據接收方DatagramPacket(byte[]buf,intlength,

InetAddressaddr,intprot)創建時指定封裝的字節數據、封裝數據的大小、指定數據包的IP地址和端口號,用于數據發送方DatagramPacket(byte[]buf,intoffset,int

length,InetAddressaddr,intprot)創建時指定封裝的字節數據、數據的偏移量、封裝數據的大小、指定數據包的IP地址和端口號,用于數據發送方InetAddressgetAddress()返回DatagramPacket對象的IP地址。如果是發送方,則返回接收方的IP地址;如果是接收方,則返回發送方的IP地址intgetOffset()返回要發送數據的偏移量或要接收數據的偏移量intgetPort()同getAddress()方法類似,用于返回端口號voidsetPort()設置發送數據包的遠程主機端口號byte[]getData()用于返回將要發送或者接收的數據,發送方返回發送數據,接收方返回接收數據byte[]setData(byte[]buf)設置數據包的數據緩沖區intgetLength()返回將要發送或接收數據的長度表11-1DatagramPacket類中常用的方法11.3.2DatagramSocket類DatagramSocket類專用于發送和接收使用DatagramPacket類打包的數據。兩者分工明確,前者負責接收和發送經過后者打包的數據,后者則專門負責數據的打包工作。表11-2DatagramSocket類中常用的方法方法功能描述DatagramSocket(intport)構造數據包套接字并將其綁定到本地主機上的指定端口DatagramSocket(intport,InetAddressladdr)創建一個數據包套接字,綁定到指定的本地地址DatagramSocket(SocketAddressbindaddr)創建一個數據包套接字,綁定到指定的本地套接字地址voidconnect(InetAddressaddress,intport)將套接字連接到其遠程地址voiddisconnect()斷開連接intgetReceiveBufferSize()獲取DatagramSocket類的SO_RCVBUF參數的值,即平臺在DatagramSocket類上輸入的緩沖區大小intgetSendBufferSize()獲取DatagramSocket類的SO_SNDBUF參數的值,即平臺在DatagramSocket類上輸出的緩沖區大小intgetSoTimeout()檢索SO_TIMEOUT的設置voidsetSoTimeout(inttimeout)以指定的超時時間(以毫秒為單位)啟用/禁用SO_TIMEOUTvoidreceive(DatagramPacketp)從指定套接字接收數據包voidsend(DatagramPacketp)從指定套接字發送數據包任務11-4UDP通信模型文件UDPSendDemo.javapackagecom.lw.chapter11;importjava.io.IOException;import.DatagramPacket;import.DatagramSocket;import.InetAddress;import.SocketException;import.UnknownHostException;publicclassUDPSendDemo{publicstaticvoidmain(String[]args){//使用字符串創建一個數據字節數組byte[]b="你好,服務器,這是第一個數據包".getBytes();//聲明發送的DatagramSocket對象DatagramSocketds=null;try{//創建DatagramPacket對象,并初始化數據、長度、目標地址和端口號參數DatagramPacketdp=newDatagramPacket(b,b.length,InetAddress.getByName("localhost"),9900);//創建DatagramSocket對象ds=newDatagramSocket(9901);//發送數據ds.send(dp);任務11-4UDP通信模型//輸出信息System.out.println("發送信息:");System.out.println("數據:"+newString(dp.getData(),"UTF-8")+";發送到:"+dp.getAddress().getHostAddress()+";

端口號:"+dp.getPort());}catch(UnknownHostExceptione){e.printStackTrace();}catch(SocketExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}finally{//關閉DatagramSocket對象if(null!=ds){ds.close();}}}}文件UDPRecvDemo.javapackagecom.lw.chapter11;importjava.io.IOException;import.DatagramPacket;import.DatagramSocket;import.SocketException;任務11-4UDP通信模型publicclassUDPRecvDemo{publicstaticvoidmain(String[]args){//創建一個字節數組,用于存放數據byte[]b=newbyte[2048];//創建一個DatagramPacket對象DatagramPacketdp=newDatagramPacket(b,2048);//聲明DatagramSocket對象DatagramSocketds=null;try{//初始化DatagramSocket對象ds=newDatagramSocket(9900);//接收數據ds.receive(dp);//輸出信息System.out.println("接收數據:");System.out.println("數據:"+newString(dp.getData(),"UTF-8").trim()+";

來源:"+dp.getAddress().getHostAddress()+";

端口號:"+dp.getPort());}catch(SocketExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}finally{if(null!=ds){ds.close();}//關閉DatagramSocket對象}}}運行結果分別如圖11-5和圖11-6所示。圖11-5發送信息的運行結果圖11-6接收數據的運行結果目錄導航11.1網絡協議11.3

UDP通信11.2

TCP通信11.4項目實戰11.5單元小結項目11-1設計通信程序QQ和微信現在已經成了很多人無法離開的通信交流軟件,它們方便了人們的交流和溝通。通過對Java的學習,再結合多線程和UDP通信,聊天軟件的神秘面紗就可以揭開了,聊天軟件的核心也就非常好理解了。本項目結合已經學習的內容模仿編寫一個聊天室,實現聊天室消息的發送和接收功能,并將接收的數據顯示出來。

程序運行結果如圖所示。項目11-1設計通信程序文件ChatClientDemo.javapackagecom.lw.chapter11;importjava.io.IOException;import.DatagramPacket;import.DatagramSocket;import.InetAddress;import.SocketException;import.UnknownHostException;importjava.util.Scanner;publicclassChatClientDemo{publicstaticvoidmain(String[]args){@SuppressWarnings("resource")Scannerscan=newScanner(System.in);//用于獲取客戶端監聽的端口和發送的數據System.out.println("請輸入監聽端口:");StringportStr=scan.nextLine();//獲取用戶監聽端口intport=Integer.parseInt(portStr);//轉化成int類型的數值//定義一個線程對象,異步接收服務器端的廣播數據Runnabler=newRunnable(){@SuppressWarnings("resource")@Overridepublicvoidrun(){byte[]buf=newbyte[1024];//字節數據對象//初始化DatagramPacket對象DatagramPacketdp=newDatagramPacket(buf,buf.length);DatagramSocketds=null;try{ds=newDatagramSocket(port);//創建DatagramSocket對象}catch(SocketExceptione1){e1.printStackTrace();}//循環監聽數據while(true){try{//監聽并接收數據ds.receive(dp);//輸出數據System.out.println(newString(dp.getData(),"UTF-8"));}catch(SocketExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}}};項目11-1設計通信程序//啟動異步線程進行數據監聽Threadt=newThread(r);t.start();

//通過主線程進行數據發送DatagramSocketds=null;try{ds=newDatagramSocket();while(true){//獲取用戶輸入數據Stringline=scan.nextLine();//如果是非空數據,則發送消息,否則獲取下一行的輸入if(null!=line){//組裝數據,數據格式是port:messageline=port+":"+line;//創建數據包DatagramPacketdp=newDatagramPacket(line.getBytes(),line.getBytes().length,InetAddress.getByName("localhost"),9901);//發送數據包try{ds.send(dp);}catch(IOExceptione){e.printStackTrace();}}else{continue;}}}catch(SocketExceptione){e.printStackTrace();}catch(UnknownHostExceptione1){e1.printStackTrace();}finally{//關閉數據流if(null!=ds){ds.close();}}}}項目11-1設計通信程序服務器端實現代碼如下。packagecom.lw.chapter11;importjava.io.IOException;import.DatagramPacket;import.DatagramSocket;import.InetAddress;import.SocketException;importjava.util.HashSet;importjava.util.Set;publicclassChatServerDemo{publicstaticvoidmain(String[]args){//使用Set集合保存注冊用戶的信息Set<String>registerSet=newHashSet<>();byte[]buf=newbyte[1024];//初始化數據數組//不間斷監聽DatagramSocketds=null;try{ds=newDatagramSocket(9901);文件ChatServerDemo.javawhile(true){//初始化DatagramPacket對象DatagramPacketdp=newDatagramPacket(buf,buf.length);//接收數據ds.receive(dp);//處理客戶端數據Stringinfo=newString(dp.getData(),"UTF-8");//客戶端數據StringportStr=info.substring(0,info.indexOf(":"));//截取端口號StringhostName=dp.getAddress().getHostAddress();//組裝host地址信息Stringhost=hostName+"-"+portStr

溫馨提示

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

評論

0/150

提交評論