版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Java語言程序設計第19章Java網絡編程
1網絡概述23主要內容
Java語言程序設計(第4版)清華大學出版社2023基于TCP的通信基于UDP的通信45基于HTTP編程案例:訪問Web應用程序Java語言程序設計19.1網絡概述Java語言作為最流行的網絡編程語言,提供了強大的網絡編程功能。使用Java語言可以編寫底層的網絡通信程序,這是通過包中提供的InetAddress類、Socket類、ServerSocket類、URL類以及URLConnection等類實現的。19.1.1網絡分層與協(xié)議最常用的是適用于Internet的TCP/IP四層模型,包括主機網絡層、網際層、傳輸層和應用層。應用層(HTTP,SMTP,FTP)傳輸層(TCP,UDP)網際層(IP)主機網絡層協(xié)議(protocol)是定義計算機之間如何通信的一組規(guī)則。網際層最重要的協(xié)議是IP,它是基于TCP/IP網絡協(xié)議的核心協(xié)議傳輸控制協(xié)議TCP(TransmissionControlProtocol)和用戶數據報協(xié)議UDP(UserDatagramProtocol)。TCP是面向連接的協(xié)議,是可靠的協(xié)議。UDP是面向無連接的協(xié)議,是不可靠協(xié)議。用于Web的HTTP,還有用于電子郵件的SMTP、POP3,用于文件傳輸的FTP。發(fā)出連接請求的計算機稱為客戶端,提供服務的計算機稱為服務器。在客戶端發(fā)出連接請求時,服務器必須正在等待客戶端的請求。19.1.2客戶/服務器結構Web是Internet上最流行的客戶/服務器(C/S)結構。Web服務器(如Apache)響應Web客戶端(如Firefox)的請求。數據被存儲在Web服務器上,在被請求時發(fā)送給客戶端。連接到Internet上的計算機使用IP地址或域名來唯一標識。一般來說,IP地址是由4個用點號分隔開的0~255之間的十進制數組成,如36。19.1.3IP地址和域名域名系統(tǒng)(DomainNameSystem),用來將人類易于記憶的主機名()轉換為數字Internet地址(4)。地址是一個比較特殊的IP地址,它被保留用作本機回路地址(loopback),該地址對應的主機名是localhost。當程序訪問網絡時,需要同時處理數字地址和相應的主機名。這些操作的方法由.InetAddress類提供。19.1.3IP地址和域名InetAddress類沒有提供構造方法,要得到一個InetAddress類對象,需要使用該類的靜態(tài)方法。staticInetAddressgetByName(Stringhost)staticInetAddressgetLocalHost()staticInetAddress[]getAllByName(Stringhost)下面是InetAddress類的其他方法:StringgetHostName()StringgetHostAddress()byte[]getAddress()19.1.3IP地址和域名包中還提供了Inet4Address類和Inet6Address,它們分別表示IPv4和IPv6地址,并提供了相應的方法對它們操作。Stringhostname="";try{InetAddressaddress=InetAddress.getByName(hostname);System.out.println(address);System.out.println("主機名:"+address.getHostName());System.out.println("IP地址:"+address.getHostAddress());}catch(UnknownHostExceptionex){System.out.println("給定的主機不存在");}程序19.1SearchIP.java實現網絡通信必須將兩臺機器連接起來建立一個雙向通信鏈路,這個雙向通信鏈路的每一端稱為一個套接字(socket)。19.1.4端口號與套接字通常使用一個整數來標識該機器上的某個服務,這個整數就是端口號(port)。端口號是用16位整數標識,共有65536個端口號。端口號分為兩類。一類是由因特網名字和號碼指派公司ICANN分配給一些常用的應用層程序固定使用的熟知端口(well-knownport),其值范圍為0~1023。例如,HTTP服務的端口號為80,FTP服務的端口號為21。19.1.4端口號與套接字另一類端口為一般端口,用來隨時分配給請求通信的客戶進程。為了在通信時不致發(fā)生混亂,必須把端口號和主機的IP地址結合在一起使用。一個TCP連接由它的兩個端點來標識,而每一個端點又是由IP地址和端口號決定的。TCP連接的端點稱為套接字,IP地址和端口號一起構成套接字,如圖所示。19.1.4端口號與套接字運行在一臺特定機器上的某個服務器(如HTTP服務器)都有一個套接字綁定到該服務器上。服務器只是等待、監(jiān)聽客戶的連接請求。
在客戶端,客戶機需要知道服務器的主機名和端口號。為了建立連接請求,客戶機試圖與服務器機上的指定端口號上的服務連接。服務器將接受連接請求。一旦接受了請求,服務器將創(chuàng)建一個新的綁定到另一個端口號的套接字.19.1.4端口號與套接字6.1.1課堂討論及訓練Java語言程序設計(第4版)
QQ群:288639486編寫一個JavaFX圖形界面程序,通過文本框輸入一個主機名,利用該主機名找到該主機的IP地址并通過標簽顯示出來。下圖是當輸入主機名后單擊“查找”按鈕顯示的IP地址。Java語言程序設計19.2基于TCP的通信編寫網絡程序時,有兩種通信可供選擇:基于TCP的通信和基于UDP的通信。19.2.1基于TCP和UDP通信的對比基于TCP的通信使用TCP協(xié)議,該協(xié)議是面向連接的協(xié)議。使用這種協(xié)議要求發(fā)送方和接收方都要建立套接字,一旦兩個套接字建立起來,它們就可以進行雙向通信,雙方都可以發(fā)送和接收數據。基于UDP的通信使用UDP協(xié)議,該協(xié)議是一種無連接的協(xié)議。使用這種協(xié)議通信,每個數據報都是一個獨立的信息單元,它包括完整的目的地址,數據報在網絡上以任何可能的路徑傳往目的地,因此數據能否到達目的地、到達的時間以及內容的正確性都不能保證,該協(xié)議提供的是不可靠的服務。(1)TCP是一個面向連接的協(xié)議,在通信之前必須建立雙方的連接,因此在TCP中多了一個建立連接的時間。使用UDP時,每個數據報都給出了完整的地址信息,因此無需建立發(fā)送方和接收方的連接。19.2.1基于TCP和UDP通信的對比(2)使用TCP沒有數據大小的限制,一旦建立起連接,就可以傳輸大量的數據。使用UDP傳輸數據時是有大小限制的,每個數據報必須不大于64KB。(3)TCP是可靠的協(xié)議,它確保接收方正確地獲取發(fā)送方所發(fā)送的數據。UDP是不可靠的協(xié)議,發(fā)送方發(fā)送的數據不一定以相同的次序到達接收方。19.2.1基于TCP和UDP通信的對比(4)TCP使用較廣泛,如TELNET遠程登錄、FTP文件傳輸都需要不定長度的數據可靠地傳輸,因此需要使用TCP協(xié)議。相比之下UDP比較簡單,因此常用于局域網分散系統(tǒng)中的客戶/服務器應用程序。為了實現基于TCP的通信,在包中提供了兩個類:ServerSocket和Socket。它們分別實現連接的服務器端和客戶端的套接字。19.2.2ServerSocket類和Socket類ServerSocket類用在服務器端??蛻襞c服務器通信,客戶向服務器提出請求,服務器監(jiān)聽請求,一旦監(jiān)聽到客戶請求,服務器要建立一個套接字。ServerSocket類的構造方法如下。ServerSocket(intport):創(chuàng)建綁定到指定端口port上的服務器套接字。注意,因為有些端口號已被特殊的服務占用,所以應該選擇大于1023的端口號。ServerSocket(intport,intbacklog):參數backlog指定最大的隊列數,即服務器所能支持的最大連接數。ServerSocket類提供的主要方法:publicSocketaccept():調用該方法將阻塞當前系統(tǒng)服務線程,直到有客戶連接。當有客戶連接時,方法返回一個Socket對象。正是通過該Socket對象,服務器才可與客戶通信。publicvoidclose():關閉ServerSocket對象。19.2.2ServerSocket類和Socket類Socket類是套接字類,它既用在服務器端,也用在客戶端??蛻艉头掌髦g就是用Socket對象通信的。Socket類的最常用構造方法如下。19.2.2ServerSocket類和Socket類publicSocket(Stringhost,intport):創(chuàng)建一個套接字對象并將其連接到服務器主機的指定端口上。host為服務器主機名,port為端口號。publicSocket(InetAddressaddress,intport):創(chuàng)建一個套接字對象并將其連接到指定IP地址的指定端口上。address為服務器主機的IP地址,port為端口號。Socket類提供的主要方法有:publicInputStreangetInputStream():獲得套接字上綁定的數據輸入流。publicOutputStreamgetOutputStream():獲得套接字上綁定的數據輸出流。publicInetAddressgetInetAddress():返回該套接字所連接的IP地址。publicintgetPort():返回該套接字所連接的遠程端口號。publicsynchronizedvoidclose()throwsIOException:關閉套接字對象。19.2.2ServerSocket類和Socket類(1)雙方創(chuàng)建套接字對象。(2)創(chuàng)建連接到套接字的輸入/輸出流。(3)按照一定協(xié)議對套接字進行讀寫操作。(4)關閉套接字對象。套接字通信基本步驟服務器端程序首先在端口號8080上創(chuàng)建一個ServerSocket對象,然后調用它的accept()方法等待客戶的連接。如果客戶端程序請求連接該服務器,accept()方法將返回一個Socket對象,通過socket對象的getInputStream()方法和getOutputStream()方法分別獲得輸入流和輸出流對象,使用它們與客戶端通信。程序中使用InputStreamReader類將字節(jié)輸入流轉換成字符輸入流。19.2.3簡單的TCP通信的例子TCPServer.java是服務器端程序。try(varserver=newServerSocket(8080);varsocket=server.accept();varis=newBufferedReader(newInputStreamReader(socket.getInputStream()));varos=newPrintWriter(socket.getOutputStream());varinput=newScanner(System.in);){System.out.println("客戶端:"+is.readLine());//顯示從客戶端讀的數據System.out.print("服務器端:");程序19.2TCPServer.javavarline=input.nextLine();//從鍵盤讀一行數據while(!line.equals("bye")){os.println(line);//將數據發(fā)送到客戶端os.flush();System.out.println("客戶端:"+is.readLine());//顯示從客戶端讀的數據System.out.print("服務器端:");line=input.nextLine();//從鍵盤讀一行數據}}catch(Exceptione){System.out.println("發(fā)生異常:"+e);}客戶程序首先建立一個Socket對象,這里需要指定服務器主機名和端口號。如果連接本地主機,可使用locahost主機名或地址。端口號是服務器使用的端口號8080。本例中服務器程序和客戶程序運行在同一臺機器上,如果客戶程序和服務器程序不在一臺計算機上,客戶程序創(chuàng)建Socket時應該指定主機名或IP地址。19.2.3簡單的TCP通信的例子TCPClient.java是客戶端程序。try(varsocket=newSocket("",8080);varis=newBufferedReader(newInputStreamReader(socket.getInputStream()));varos=newPrintWriter(socket.getOutputStream());varinput=newScanner(System.in);){System.out.print("客戶端:");varline=input.nextLine();//從鍵盤讀一行數據程序19.3TCPClient.javawhile(!line.equals("bye")){os.println(line);//將數據發(fā)送到服務器os.flush();//輸出從服務器端讀的一行數據System.out.println("服務器端:"+is.readLine());System.out.print("客戶端:");line=input.nextLine();//從鍵盤讀一行數據}}catch(Exceptione){System.out.println("發(fā)生異常:"+e);}要測試該程序,啟動兩個命令行窗口并且先運行服務器程序,后運行客戶程序,客戶程序先向服務器發(fā)送消息。該程序的運行效果如圖19-6和19-7所示。19.2.3簡單的TCP通信的例子6.1.1課堂討論及訓練Java語言程序設計(第4版)
QQ群:288639486編寫程序,使用ServerSocket類和Socket類編寫一個GUI程序,實現一個簡單的聊天程序,界面如圖所示。Java語言程序設計19.3基于UDP的通信用UDP編寫客戶/服務器程序時,無論是客戶方還是服務器方,首先都要建立一個DatagramSocket對象用來接收或發(fā)送數據報,然后使用DatagramPacket類對象作為傳輸數據的載體。19.3.1DatagramSocket類和DatagramPacket類1.DatagramSocket類DatagramSocket類用于在通信的兩端建立數據報套接字,它的構造方法有:publicDatagramSocket(intport)throwsSocketException:創(chuàng)建數據報套接字,并將它綁定在本地主機指定的端口上。publicDatagramSocket()throwsSocketException:創(chuàng)建數據報套接字,并將它綁定在本地主機一個可用的端口上。DatagramSocket類的常用方法有:publicvoidreceive(DatagramPacketp)throwsIOException:接收一個報文,參數p用來保存接收的報文。publicvoidsend(DatagramPacketp)throwsIOException:發(fā)送一個報文,參數p保存了要發(fā)送的報文。報文包括數據、接收者的IP地址及其端口。publicInetAddressgetInetAddress():返回該套接字連接的IP地址,如果套接字沒有連接返回null。publicInetAddressgetLocalAddress():返回套接字綁定的本地IP地址。19.3.1DatagramSocket類和DatagramPacket類2.DatagramPacket類DatagramPacket類用于創(chuàng)建一個數據報,它的構造方法有:publicDatagramPacket(byte[]buf,intlength):該構造方法創(chuàng)建的對象用于接收數據報。參數buf為數據報文緩沖區(qū),length為緩沖區(qū)的長度。publicDatagramPacket(byte[]buf,intlength,InetAddressaddress,intport):該構造方法創(chuàng)建的對象用于發(fā)送數據報。參數buf為數據報文緩沖區(qū),length為緩沖區(qū)的長度,address為接收方的地址,port為接收方數據報套接字綁定的端口號。19.3.1DatagramSocket類和DatagramPacket類在接收數據之前,應該創(chuàng)建一個DatagramPacket對象,給出接收數據的緩沖區(qū)及長度。然后調用DatagramSocket的receive()方法等待數據報的到來,receive()方法將一直等待,直到有一個數據報到來。19.3.1DatagramSocket類和DatagramPacket類byte[]buf=newbyte[1024];DatagramPacketpacket=newDatagramPacket(buf,1024);socket.receive(packet);//接收數據在發(fā)送數據前,也要生成一個DatagramPacket對象,在給出發(fā)送方的數據緩沖區(qū)及長度的同時,還要給出完整的目標地址,包括IP地址和端口號。發(fā)送數據通過DatagramSocket的send()方法實現的,send()方法根據目的地址選擇路徑。19.3.1DatagramSocket類和DatagramPacket類DatagramPacketpacket=newDatagramPacket(msg,send.length(),clientIP,clientPort);socket.send(packet);//發(fā)送數據下面的實例通過UDP實現通信。該實例實現的功能是客戶端向服務器端發(fā)送一個字符串,服務器端接收該字符串,然后將其轉換成大寫字母,再發(fā)送回客戶端。UDPServer.java是服務器端程序,UDPClient.java是客戶端程序。19.3.2簡單的UDP通信例子 byte[]buf=newbyte[1024]; try{ varsocket=newDatagramSocket(8888); System.out.println("服務器等待..."); while(true){ //用于接收數據的數據報 varpacket=newDatagramPacket(buf,1024); socket.receive(packet); vardata=newString(buf,0,packet.getLength()); if(data.toLowerCase().equals("bye")) break; System.out.println("客戶數據:"+data);程序19.4UDPServer.java varsend=data.toUpperCase(); varclientIP=packet.getAddress();//返回客戶端的IP地址 intclientPort=packet.getPort();//返回客戶端的端口號 byte[]msg=send.getBytes(); //用于發(fā)送數據的數據報 varsendPacket=newDatagramPacket( msg,send.length(),clientIP,clientPort); socket.send(sendPacket); } socket.close(); System.out.println("Serverisclosed."); }catch(Exceptione){ e.printStackTrace(); }程序在端口號8888上創(chuàng)建一個數據報套接字socket,然后創(chuàng)建一個接收數據的數據報對象packet,并調用套接字的receive()方法接收數據報。在接收到數據報后,將其轉換成字符串并轉換成大寫字母。接下來創(chuàng)建一個發(fā)送數據的數據報對象sendPacket,然后使用數據報套接字的send()方法將其發(fā)送給客戶端。19.3.2簡單的UDP通信例子byte[]bufsend=newbyte[1024];try{varsocket=newDatagramSocket();varinput=newScanner(System.in);while(true){System.out.print("請輸入字符串:");varmessage=input.nextLine();bufsend=message.getBytes();//用于發(fā)送數據的數據報varpacket=newDatagramPacket( bufsend,message.length(),InetAddress.getLocalHost(),8888);程序19.5UDPClient.java//InetAddress.getByName("")socket.send(packet);if(message.equals("bye"))break;//用于接收數據的數據報byte[]bufrec=newbyte[1024];varreceivePacket= newDatagramPacket(bufrec,bufrec.length);socket.receive(receivePacket);varreceived=newString(bufrec,0,receivePacket.getLength());System.out.println("從服務器返回的字符串:"+received);}socket.close();首先啟動服務器,它將等待客戶的請求。啟動客戶端程序,提交一個字符串,服務器返回轉換后的字符串。服務器端程序的運行結果如圖19-8,客戶端程序運行結果如圖19-9所示。Java語言程序設計19.4基于HTTP的通信HTTP是指允許Web服務器和瀏覽器在互聯網上發(fā)送和接收數據的協(xié)議。它是一個基于請求和響應的協(xié)議。客戶端向服務器請求一個資源,服務器對該請求做出響應。HTTP使用可靠的TCP連接,默認端口號是80。19.4.1理解HTTP在HTTP中,先由客戶端建立與服務器的連接并發(fā)送HTTP請求。Web服務器無權聯系客戶端。客戶端和服務器都可以提前終止連接。例如,在使用Web瀏覽器時,可以單擊瀏覽器“停止”按鈕來終止下載文件,關閉與Web服務器的HTTP連接。由客戶向服務器發(fā)出的消息叫HTTP請求。HTTP請求通常包括請求行、請求頭、空行和請求的數據。圖19-10是一個典型的POST請求。HTTP的請求行由三部分組成:方法名、請求資源的URI和HTTP版本。這三部分由空格分隔。圖18.12的請求行中,方法為POST。HTTP1.1版支持7種請求,其中最常用的是GET和POST請求。1.HTTP請求結構URI指定一個Web資源,它通常解釋為相對于服務器的根目錄。因此,它始終以一個正斜杠(/)開頭。圖中的URI為/helloweb/selectProduct.do,使用的協(xié)議與版本為HTTP/1.1。1.HTTP請求結構由服務器向客戶發(fā)送的HTTP消息稱為HTTP響應,HTTP響應也由三部分組成:狀態(tài)行、響應頭和響應的數據。圖19-11所示為一個典型的HTTP響應消息。HTTP響應的狀態(tài)行由三部分組成,各部分由空格分隔:HTTP版本、說明請求結果的狀態(tài)碼以及描述狀態(tài)碼的短語。HTTP定義了許多狀態(tài)碼,常見的狀態(tài)碼是200,它表示請求被正常處理。狀態(tài)行之后的頭行稱為響應頭(responseheader)。響應頭是服務器向客戶端發(fā)送的消息。圖19-11的響應消息中包含三個響應頭。Date響應頭表示消息發(fā)送的日期,Content-Type響應頭指定響應的內容類型,Content-Length指示響應內容的長度。響應頭后面是一空行,空行的后面是響應的數據2.HTTP響應結構2.HTTP響應結構URL稱為統(tǒng)一資源定位器(UniformResourceLocator),它是Web中資源定位的方法。Web資源包括Web頁面、文本文件、圖形文件以及音頻和視頻片段等。19.4.2URL和URL類URL的基本格式為:
<協(xié)議名://><主機名>[<:端口號>]</資源URI名>:80/en/index.htmlhttp://localhost:8080/webstore/selectProduct.do/包中提供了URL類和URLConnection類。使用這兩個類,可以讀寫網絡資源。19.4.2URL和URL類URL類的常用構造方法:
URL(Stringspec)URL(Stringprotocol,Stringhost,Stringfile)URL(Stringprotocol,Stringhost,intport,Stringfile)URL構造方法拋出MalformedURLException異常,當構造方法參數無效就會拋出該異常。因此,當創(chuàng)建URL對象時需要捕獲并處理這個異常。try{URLexampleURL=newURL("");}catch(MalformedURLExceptione){//異常處理代碼}19.4.2URL和URL類URL類提供的常用方法對URL對象的特征查詢和對URL對象的讀操作。StringgetProtocol()StringgetHost()intgetPort()InputStreamopenStream()URLConnectionopenConnection()19.4.2URL和URL類try{varaURL=newURL("/javase/tutorial/"+"/index.html?name=networking#DOWNLOADING");System.out.println("protocol="+aURL.getProtocol());System.out.println("authority="+aURL.getAuthority());System.out.println("host="+aURL.getHost());System.out.println("port="+aURL.getPort());System.out.println("path="+aURL.getPath());System.out.println("query="+aURL.getQuery());System.out.println("filename="+aURL.getFile());System.out.println("ref="+aURL.getRef());}catch(MalformedURLExceptione){System.out.println("URL不合法");}程序19.6ParseURL.java在創(chuàng)建一個URL對象后,可以使用其openStream()方法建立一個連接并返回一個InputStream對象,然后就可以從這個對象上讀取數據。下面的例子說明了該方法的使用,它通過URL對象讀取一個Web頁面信息。讀取Web資源try{varurl=newURL("");varin=newBufferedReader(newInputStreamReader(url.openStream()));varout=newFileWriter("index.html");StringinputLine;while((inputLine=in.readLine())!=null){out.write(inputLine);}in.close();out.close();}catch(MalformedURLExceptionme)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 水產公司人事經理招聘協(xié)議
- 建筑保溫三方施工合同范本
- 魚塘養(yǎng)殖企業(yè)安全生產承包合同
- 天津二手房合同簽訂避坑指南
- 食品加工廢水沼氣項目協(xié)議
- 高速公路養(yǎng)護施工合同范本
- 2025施工合同標準版模板
- 鐵路道岔區(qū)路基改造協(xié)議
- 鋁單板安裝協(xié)議健身中心室內設計
- 挖掘機建筑安裝工程合作協(xié)議
- 【基于抖音短視頻的營銷策略分析文獻綜述2800字(論文)】
- 2021-2022學年度西城區(qū)五年級上冊英語期末考試試題
- 《組織行為學》(本)形考任務1-4
- 廣東省廣州市白云區(qū)2022-2023學年九年級上學期期末語文試題
- 劇本-進入黑夜的漫長旅程
- DB43-T 958.3-2023 實驗用小型豬 第3部分:配合飼料
- 化肥購銷合同范本正規(guī)范本(通用版)
- 健康管理專業(yè)職業(yè)生涯規(guī)劃書
- 外墻巖棉板施工方案
- 吊裝葫蘆施工方案
- 自動化設備調試規(guī)范
評論
0/150
提交評論