Java Web 開發(fā)課件:協(xié)議_第1頁
Java Web 開發(fā)課件:協(xié)議_第2頁
Java Web 開發(fā)課件:協(xié)議_第3頁
Java Web 開發(fā)課件:協(xié)議_第4頁
Java Web 開發(fā)課件:協(xié)議_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

付費下載

下載本文檔

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

文檔簡介

協(xié)議回顧使用多線程可以使程序同時執(zhí)行多個任務(wù),從而使得CPU的閑置時間減至最少;既可以通過繼承Thread類的方式來實現(xiàn)線程,也可以通過實現(xiàn)Runnable接口的方式;在線程的整個生命周期中,它會分別處于不同的狀態(tài);也可以將某些為前臺線程服務(wù)的線程設(shè)置成后臺線程;線程如果處理不當,也會造成死鎖。2本章目標使用Socket發(fā)送文本文件以及超文本文件了解HTTP協(xié)議了解客戶端瀏覽器的基本運行原理了解Web服務(wù)器的基本運行原理3本章相關(guān)詞匯4單詞說明protocol協(xié)議HyperTextTransferProtocol(HTTP)超文本傳輸協(xié)議content內(nèi)容split劈開,分離使用Socket發(fā)送文件內(nèi)容在前面的章節(jié)中,我們已經(jīng)基本了解如何使用套接字進行網(wǎng)絡(luò)通信;我們甚至使用Socket實現(xiàn)了簡單的對話聊天功能;那么,我們是不是也可以利用Socket來實現(xiàn)發(fā)送文件的功能呢?5案例1(服務(wù)端)public

classMyServer{

private

static

final

intSERVER_PORT=9001;//服務(wù)端偵聽的端口

privateServerSocketss;//服務(wù)套接字

privateSockets;//與客戶端進行通信的套接字

privateBufferedReaderin;//從套接字輸入數(shù)據(jù)的字符流

privatePrintWriterout;//往套接字發(fā)送數(shù)據(jù)的字符流

publicMyServer(){……}//構(gòu)造方法

public

voidsend(){……}//與客戶端通信,并發(fā)送數(shù)據(jù)的方法

public

voidcloseAll(){//關(guān)閉所有資源的方法

try{out.close();in.close();s.close();ss.close();System.out.println("服務(wù)器端已關(guān)閉。");}catch(IOExceptionioe){ioe.printStackTrace();}}

public

static

voidmain(String[]args){MyServerms=newMyServer();ms.send();ms.closeAll(); }}publicMyServer(){//構(gòu)造方法

try{ss=newServerSocket(SERVER_PORT);System.out.println("服務(wù)端已經(jīng)啟動,正在等待客戶端的請求...");s=ss.accept();System.out.println("已收到客戶端的請求,并正確連接到客戶端。");

//獲取通信套接字的輸入流,并轉(zhuǎn)化成字符流

in=newBufferedReader(newInputStreamReader(s.getInputStream()));

//獲取通信套接字的輸出流,并轉(zhuǎn)化成字符流

out=newPrintWriter(s.getOutputStream(),true);}catch(IOExceptionioe){ioe.printStackTrace();}}public

voidsend(){//與客戶端通信,并發(fā)送數(shù)據(jù)的方法

StringstrFile=null;

try{strFile=in.readLine();//獲得客戶端想要的文件的名稱

Filefile=newFile(strFile);

//打開客戶端指定的文件

FileReaderfr=newFileReader(file);BufferedReaderbr=newBufferedReader(fr);

//讀取文件內(nèi)容并發(fā)送到客戶端

System.out.println("開始發(fā)送文件內(nèi)容...");out.println("您請求的"+strFile+"文件內(nèi)容如下:");StringstrContent=br.readLine();

while(strContent!=null){out.println(strContent);strContent=br.readLine();}

//關(guān)閉文件讀取流

br.close();fr.close();System.out.println("文件發(fā)送完畢。");}catch(FileNotFoundExceptionfnfe){out.println("您請求的"+strFile+"文件不存在。");}catch(IOExceptionioe){ioe.printStackTrace();}}完整代碼請參見隨課件一起提供的源文件案例1(客戶端)public

classMyClient{

private

static

final

intSERVER_PORT=9001;//服務(wù)端偵聽的端口

privateSockets;//與服務(wù)端進行通信的套接字

privateBufferedReaderin;//從套接字輸入數(shù)據(jù)的字符流

privatePrintWriterout;//網(wǎng)套接字發(fā)送數(shù)據(jù)的字符流

privateBufferedReadercin;//從鍵盤接收輸入的字符流

publicMyClient(StringhostName){……}//構(gòu)造方法

public

voidincept(){……}//與服務(wù)器通信,并接收數(shù)據(jù)的方法

public

voidcloseAll(){//關(guān)閉所有資源的方法

try{cin.close();out.close();in.close();s.close();System.out.println("客戶端已關(guān)閉。");}catch(IOExceptionioe){ioe.printStackTrace();}}

public

static

voidmain(String[]args){MyClientmc=newMyClient("localhost");mc.incept();mc.closeAll(); }}publicMyClient(StringhostName){//構(gòu)造方法

try{

//獲得服務(wù)器的地址

InetAddressaddress=InetAddress.getByName(hostName);s=newSocket(address,SERVER_PORT);//向服務(wù)器發(fā)出請求

System.out.println("客戶端已連接到服務(wù)器。");in=newBufferedReader(newInputStreamReader(s.getInputStream()));out=newPrintWriter(s.getOutputStream(),true);

//從鍵盤接收輸入的字符流

cin=newBufferedReader(newInputStreamReader(System.in));}catch(UnknownHostExceptionuhe){System.out.println("您要訪問的服務(wù)器不存在。");}catch(IOExceptionioe){ioe.printStackTrace();}}public

voidincept(){//與服務(wù)器通信,并接收數(shù)據(jù)的方法

try{

//接收從鍵盤輸入的文件名,并發(fā)送到服務(wù)器

System.out.println("請輸入您想要的文件名稱:");StringstrFile=cin.readLine();out.println(strFile);

//接收從服務(wù)器傳回的數(shù)據(jù),并打印到控制臺

StringstrContent=in.readLine();

while(strContent!=null){System.out.println(strContent);strContent=in.readLine();}}catch(IOExceptionioe){ioe.printStackTrace();}}完整代碼請參見隨課件一起提供的源文件運行效果協(xié)議為了方便人與人之間的溝通和交流,人們總是會制定一些各式各樣的規(guī)則,如借款要打欠條,購物要開發(fā)票,寫信要使用標準格式的信封等等;這些規(guī)則有的是約定俗成的,有的是用條文書面規(guī)定的,不論是哪種方式,其實都是協(xié)議;欠條,發(fā)票,信件的書寫都要遵循特定的格式,同樣的道理,網(wǎng)絡(luò)上的兩臺主機(客戶機和服務(wù)器)之間為了確保通信,也必須要遵照特定的協(xié)議要求,使用標準的格式;如果不形成國際化的標準協(xié)議,那么就無法實現(xiàn)在全球范圍內(nèi)的通信。9協(xié)議(續(xù))協(xié)議其實就是指:通信雙方必須共同遵守的規(guī)則和約定;協(xié)議必須具備如下三個要素:語法:數(shù)據(jù)與控制信息的結(jié)構(gòu)或格式;語義:控制信息的含義,需要做出的動作及回應(yīng);時序:規(guī)定的操作的執(zhí)行順序。10HiHi幾點呢?9:00兩個人之間的通信協(xié)議對等層各實體之間有虛擬連接;上層實現(xiàn)是通過下層所提供的服務(wù)完成的;實際通信在最底層完成。11發(fā)信人對信件內(nèi)容的共識對貨物如何運輸?shù)墓沧RP3公路,鐵路,航空郵局運輸系統(tǒng)發(fā)信人運輸系統(tǒng)郵局貨物地址郵件地址信件內(nèi)容貨物地址郵件地址信件內(nèi)容對信件如何傳遞的共識P2P1HTTP協(xié)議簡介HTTP(HyperTextTransferProtocol)協(xié)議即超文本傳輸協(xié)議,是基于網(wǎng)絡(luò)應(yīng)用層的協(xié)議,它建立在TCP/IP協(xié)議的基礎(chǔ)上;該協(xié)議使用可靠的TCP連接,默認端口是80;HTTP協(xié)議基于客戶端/服務(wù)器模式,客戶端主動發(fā)出HTTP請求,服務(wù)器接收HTTP請求,返回HTTP響應(yīng)結(jié)果。12HTTP客戶程序(如IE瀏覽器)HTTP服務(wù)器(如Web服務(wù)器)HTTP請求(要求訪問hello.html)HTTP響應(yīng)(返回hello.html內(nèi)容)HTTP協(xié)議簡介(續(xù))HTTP客戶端程序和HTTP服務(wù)器程序可能分別使用不同的編程語言編寫,也可能位于不同的地域,使用不同的語言;為了使它們之間能夠準確通信,HTTP協(xié)議嚴格規(guī)定了HTTP請求報文和HTTP響應(yīng)報文的數(shù)據(jù)格式;只要雙方都遵守HTTP協(xié)議,就能彼此看懂對方發(fā)送的信息。13HTTP協(xié)議請求報文請求報文是指客戶端瀏覽器向網(wǎng)絡(luò)服務(wù)器請求頁面時,發(fā)送到服務(wù)器端的字符串,必須符合HTTP協(xié)議的格式要求,它可能包含如下組成部分:

GET/index.htmlHTTP/1.1 Accept:image/gif,image/x-xbitmap,image/jpeg,…,*/* Accept-Language:zh-cn UA-CPU:x86 Accept-Encoding:gzip,deflate User-Agent:Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1) Host::80 Connection:Keep-Alive <空行>14表示客戶端可以接收的文件類型,包括圖片文件,F(xiàn)lash文件等等。表示客戶端默認的語言,zh-cn指中國大陸。表示客戶端主機使用的處理器類型。表示客戶端是否支持以壓縮格式傳輸。表示客戶端的瀏覽器類型。表示客戶端是否與服務(wù)器持續(xù)連接。HTTP協(xié)議請求報文(續(xù))請求報文中的大部分項目是可選的,只有GET和Host部分是必需的;GET部分的格式是:

GET<空格>/[請求的URL]<空格>HTTP/協(xié)議版本號 如:GET/index.htmlHTTP/1.1Host部分的格式是:

Host:<空格>服務(wù)器域名或IP地址:端口號 如:Host::80換言之,請求報文中只要包含以上兩部分,就可以向網(wǎng)絡(luò)站點服務(wù)器請求到頁面。15HTTP協(xié)議請求報文(截圖)16模擬IE瀏覽器的通信原理17

/*關(guān)鍵代碼片段*/……

//拼湊請求報文

StringstrHttp="GET/HTTP/1.1\r\n";strHttp+="Host:"+hostName+":"+WEB_PORT+"\r\n";

//向服務(wù)器發(fā)送HTTP協(xié)議請求報文

out.println(strHttp);……

//循環(huán)從套接字中讀取數(shù)據(jù),并不斷地拼接成字符串

StringstrIncept="";Stringstr=null;

do{str=in.readLine();strIncept+=str+"\r\n";}while(!str.toLowerCase().endsWith("</html>"));……

//獲得服務(wù)端返回的網(wǎng)頁內(nèi)容,顯示到文本域中

txaContent.setText(strIncept);……完整代碼請參見隨課件一起提供的源文件運行效果圖HTTP協(xié)議響應(yīng)報文從網(wǎng)絡(luò)站點服務(wù)器請求到的HTML文件內(nèi)容HTTP協(xié)議響應(yīng)報文響應(yīng)報文是指網(wǎng)絡(luò)服務(wù)器收到來自客戶端的請求后,發(fā)回到客戶端的字符串,它用來告訴客服端:服務(wù)器已經(jīng)接受請求,隨后跟隨的是被請求的網(wǎng)頁內(nèi)容;響應(yīng)報文可能包含如下組成部分:

HTTP/1.1200OK Date:Sat,11Aug200711:58:37GMT Server:Apache/1.3.37(Unix) Accept-Ranges:bytes Content-Length:11503 Content-Type:text/html <空行>19表示服務(wù)器接收請求,發(fā)送回應(yīng)的時間。表示服務(wù)器的類型。表示服務(wù)器是以何種方式將數(shù)據(jù)發(fā)回給客戶端。表示服務(wù)器發(fā)回給客戶端的數(shù)據(jù)的長度。HTTP協(xié)議響應(yīng)報文(續(xù))響應(yīng)報文中也有兩部分是必需的:HTTP/協(xié)議版本號<空格>狀態(tài)碼<空格>OK

狀態(tài)碼是一個3位整數(shù),用來表示不同的狀態(tài),200表示響應(yīng)成功, 如:HTTP/1.1200OK

狀態(tài)碼的具體描述請參閱本課件最后的附表。Content-Type:<空格>text/html;<空格>charset=字符集編碼 用來描述服務(wù)器發(fā)回響應(yīng)的文件類型以及字符集編碼,text/html說明是文本文件或超文本文件, 如:Content-Type:text/html;charset=GB2312

20模擬網(wǎng)絡(luò)服務(wù)器的通信原理21

/*關(guān)鍵代碼片段*/……

//向客戶端瀏覽器發(fā)送響應(yīng)報文

out.println("Http/1.1200OK");out.println("Content-Type:text/html;charset=GB2312")

溫馨提示

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

最新文檔

評論

0/150

提交評論