亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java Socket編程

瀏覽:81日期:2024-06-07 10:03:11
內(nèi)容: Java Socket編程1.Socket傳輸模式Sockets有兩種主要的操作方式:面向連接的和無(wú)連接的.面向連接的sockets操作就像一部電話,他們必須建立一個(gè)連接和一人呼叫.所有的事情在到達(dá)時(shí)的順序與它們出發(fā)時(shí)的順序時(shí)一樣.無(wú)連接的sockets操作就像是一個(gè)郵件投遞,,沒(méi)有什么保證,多個(gè)郵件可能在到達(dá)時(shí)的順序與出發(fā)時(shí)的順序不一樣. 到底用哪種模式是郵應(yīng)用程序的需要決定的.如果可靠性更重要的話,用面向連接的操作會(huì)好一些.比如文件服務(wù)器需要他們的數(shù)據(jù)的正確性和有序性.如果一些數(shù)據(jù)丟失了,系統(tǒng)的有效性將會(huì)失去.一些服務(wù)器,比如間歇性地發(fā)送一些數(shù)據(jù)塊.如果數(shù)據(jù)丟了的話,服務(wù)器并不想要再重新發(fā)過(guò)一次.因?yàn)楫?dāng)數(shù)據(jù)到達(dá)的時(shí)候,它可能已經(jīng)過(guò)時(shí)了.確保數(shù)據(jù)的有序性和正確性需要額外的操作的內(nèi)存消耗,額外的費(fèi)用將會(huì)降低系統(tǒng)的回應(yīng)速率. 無(wú)連接的操作使用數(shù)據(jù)報(bào)協(xié)議.一個(gè)數(shù)據(jù)報(bào)是一個(gè)獨(dú)立的單元,它包含了所有的這次投遞的信息.把它想象成一個(gè)信封吧,它有目的地址和要發(fā)送的內(nèi)容.這個(gè)模式下的socket不需要連接一個(gè)目的的socket,它只是簡(jiǎn)單地投出數(shù)據(jù)報(bào).無(wú)連接的操作是快速的和高效的,但是數(shù)據(jù)安全性不佳. 面向連接的操作使用TCP協(xié)議.一個(gè)這個(gè)模式下的socket必須在發(fā)送數(shù)據(jù)之前與目的地的socket取得一個(gè)連接.一旦連接建立了,sockets就可以使用一個(gè)流接口:打開(kāi)-讀-寫(xiě)-關(guān)閉.所有的發(fā)送的信息都會(huì)在另一端以同樣的順序被接收.面向連接的操作比無(wú)連接的操作效率更低,但是數(shù)據(jù)的安全性更高. SUN一直是網(wǎng)絡(luò)建設(shè)的支持者,所以在Java中支持sockets就不足為奇了.實(shí)際上,Java降低了建立一個(gè)sockets程序的難度.每一個(gè)傳輸模式都被封裝到了不同的類中.面向連接的類將會(huì)首先被我們討論. Sockets有兩種主要的操作方式:面向連接的和無(wú)連接的.面向連接的sockets操作就像一部電話,他們必須建立一個(gè)連接和一人呼叫.所有的事情在到達(dá)時(shí)的順序與它們出發(fā)時(shí)的順序時(shí)一樣.無(wú)連接的sockets操作就像是一個(gè)郵件投遞,,沒(méi)有什么保證,多個(gè)郵件可能在到達(dá)時(shí)的順序與出發(fā)時(shí)的順序不一樣. 到底用哪種模式是郵應(yīng)用程序的需要決定的.如果可靠性更重要的話,用面向連接的操作會(huì)好一些.比如文件服務(wù)器需要他們的數(shù)據(jù)的正確性和有序性.如果一些數(shù)據(jù)丟失了,系統(tǒng)的有效性將會(huì)失去.一些服務(wù)器,比如間歇性地發(fā)送一些數(shù)據(jù)塊.如果數(shù)據(jù)丟了的話,服務(wù)器并不想要再重新發(fā)過(guò)一次.因?yàn)楫?dāng)數(shù)據(jù)到達(dá)的時(shí)候,它可能已經(jīng)過(guò)時(shí)了.確保數(shù)據(jù)的有序性和正確性需要額外的操作的內(nèi)存消耗,額外的費(fèi)用將會(huì)降低系統(tǒng)的回應(yīng)速率. 無(wú)連接的操作使用數(shù)據(jù)報(bào)協(xié)議.一個(gè)數(shù)據(jù)報(bào)是一個(gè)獨(dú)立的單元,它包含了所有的這次投遞的信息.把它想象成一個(gè)信封吧,它有目的地址和要發(fā)送的內(nèi)容.這個(gè)模式下的socket不需要連接一個(gè)目的的socket,它只是簡(jiǎn)單地投出數(shù)據(jù)報(bào).無(wú)連接的操作是快速的和高效的,但是數(shù)據(jù)安全性不佳. 面向連接的操作使用TCP協(xié)議.一個(gè)這個(gè)模式下的socket必須在發(fā)送數(shù)據(jù)之前與目的地的socket取得一個(gè)連接.一旦連接建立了,sockets就可以使用一個(gè)流接口:打開(kāi)-讀-寫(xiě)-關(guān)閉.所有的發(fā)送的信息都會(huì)在另一端以同樣的順序被接收.面向連接的操作比無(wú)連接的操作效率更低,但是數(shù)據(jù)的安全性更高. SUN一直是網(wǎng)絡(luò)建設(shè)的支持者,所以在Java中支持sockets就不足為奇了.實(shí)際上,Java降低了建立一個(gè)sockets程序的難度.每一個(gè)傳輸模式都被封裝到了不同的類中.面向連接的類將會(huì)首先被我們討論2.Java面向連接的類Sockets有兩種主要的操作方式:面向連接的和無(wú)連接的.面向連接的sockets操作就像一部電話,他們必須建立一個(gè)連接和一人呼叫.所有的事情在到達(dá)時(shí)的順序與它們出發(fā)時(shí)的順序時(shí)一樣.無(wú)連接的sockets操作就像是一個(gè)郵件投遞,,沒(méi)有什么保證,多個(gè)郵件可能在到達(dá)時(shí)的順序與出發(fā)時(shí)的順序不一樣. 到底用哪種模式是郵應(yīng)用程序的需要決定的.如果可靠性更重要的話,用面向連接的操作會(huì)好一些.比如文件服務(wù)器需要他們的數(shù)據(jù)的正確性和有序性.如果一些數(shù)據(jù)丟失了,系統(tǒng)的有效性將會(huì)失去.一些服務(wù)器,比如間歇性地發(fā)送一些數(shù)據(jù)塊.如果數(shù)據(jù)丟了的話,服務(wù)器并不想要再重新發(fā)過(guò)一次.因?yàn)楫?dāng)數(shù)據(jù)到達(dá)的時(shí)候,它可能已經(jīng)過(guò)時(shí)了.確保數(shù)據(jù)的有序性和正確性需要額外的操作的內(nèi)存消耗,額外的費(fèi)用將會(huì)降低系統(tǒng)的回應(yīng)速率. 無(wú)連接的操作使用數(shù)據(jù)報(bào)協(xié)議.一個(gè)數(shù)據(jù)報(bào)是一個(gè)獨(dú)立的單元,它包含了所有的這次投遞的信息.把它想象成一個(gè)信封吧,它有目的地址和要發(fā)送的內(nèi)容.這個(gè)模式下的socket不需要連接一個(gè)目的的socket,它只是簡(jiǎn)單地投出數(shù)據(jù)報(bào).無(wú)連接的操作是快速的和高效的,但是數(shù)據(jù)安全性不佳. 面向連接的操作使用TCP協(xié)議.一個(gè)這個(gè)模式下的socket必須在發(fā)送數(shù)據(jù)之前與目的地的socket取得一個(gè)連接.一旦連接建立了,sockets就可以使用一個(gè)流接口:打開(kāi)-讀-寫(xiě)-關(guān)閉.所有的發(fā)送的信息都會(huì)在另一端以同樣的順序被接收.面向連接的操作比無(wú)連接的操作效率更低,但是數(shù)據(jù)的安全性更高. SUN一直是網(wǎng)絡(luò)建設(shè)的支持者,所以在Java中支持sockets就不足為奇了.實(shí)際上,Java降低了建立一個(gè)sockets程序的難度.每一個(gè)傳輸模式都被封裝到了不同的類中.面向連接的類將會(huì)首先被我們討論在Java中面向連接的類有兩種形式,它們分別是客戶端和服務(wù)器端.客戶端這一部分是最簡(jiǎn)單的,所以我們先討論它. 列表9.1列出了一個(gè)簡(jiǎn)單的客戶端的程序.它向一個(gè)服務(wù)器發(fā)出一個(gè)請(qǐng)求,取回一個(gè)HTML文檔,并把它顯示在控制臺(tái)上. 9.1一個(gè)簡(jiǎn)單的socket客戶端 import java.io.*; import java.net.*; /** * 一個(gè)簡(jiǎn)單的從服務(wù)器取回一個(gè)HTML頁(yè)面的程序 * 注意:merlin是本地機(jī)器的名字 */ public class SimpleWebClient { public static void main(String args[]) { try { // 打開(kāi)一個(gè)客戶端socket連接 Socket clientSocket1 = new Socket('merlin', 80); System.out.println('Client1: ' + clientSocket1); // 取得一個(gè)網(wǎng)頁(yè) getPage(clientSocket1); } catch (UnknownHostException uhe) { System.out.println('UnknownHostException: ' + uhe); } catch (IOException ioe) { System.err.println('IOException: ' + ioe); } } /** *通過(guò)建立的連接請(qǐng)求一個(gè)頁(yè)面,顯示回應(yīng)然后關(guān)閉socket */ public static void getPage(Socket clientSocket) { try { // 需要輸入和輸出流 DataOutputStream outbound = new DataOutputStream( clientSocket.getOutputStream() ); DataInputStream inbound = new DataInputStream( clientSocket.getInputStream() ); // 向服務(wù)器發(fā)出HTTP請(qǐng)求 outbound.writeBytes('GET / HTTP/1.0 '); // 讀出回應(yīng) String responseLine; while ((responseLine = inbound.readLine()) != null) { // 把每一行顯示出來(lái) System.out.println(responseLine); if ( responseLine.indexOf('') != -1 ) break; } // 清除 outbound.close(); inbound.close(); clientSocket.close(); } catch (IOException ioe) { System.out.println('IOException: ' + ioe); } } }Java面向連接的類 回憶一個(gè),一個(gè)客戶端向一個(gè)正在監(jiān)聽(tīng)的服務(wù)器socket發(fā)出一個(gè)連接.客戶端的sockets是用Socket類建立的.下面的程序建立了一個(gè)客戶端的socket并且連接到了一個(gè)主機(jī): Socket clientSocket = new Socket('merlin', 80); 第一個(gè)參數(shù)是你想要連接的主機(jī)的名稱,第二個(gè)參數(shù)是端口號(hào).一個(gè)主機(jī)名稱指定了目的的名稱.端口號(hào)指定了由哪個(gè)應(yīng)用程序來(lái)接收.在我們的情況下,必須指定80,因?yàn)樗悄J(rèn)的HTTP協(xié)議的端口.另外的知名的端口列在表9.1中,看: 知名的端品: echo 7 daytime 13 daytime 13 ftp 21 telnet 23 smtp 25 finger 79 http 80 pop3 110 因?yàn)镾ocket類是面向連接的,它提供了一個(gè)可供讀寫(xiě)的流接口.java.io包中的類可以用來(lái)訪問(wèn)一個(gè)已連接的socket: DataOutputStream outbound = new DataOutputStream( clientSocket.getOutputStream() ); DataInputStream inbound = new DataInputStream( clientSocket.getInputStream() ); 一旦流建立了,一般的流操作就可以做了: outbound.writeBytes('GET / HTTP/1.0 ); String responseLine; while ( (responseLine = inbound.readLine()) != null) { System.out.println(responseLine); } 以上的小程序請(qǐng)求了一個(gè)WEB頁(yè)面并且把它顯示出來(lái).當(dāng)程序完成之后,連接必須關(guān)閉. outbound.close(); inbound.close(); clientSocket.close(); 注意socket流必須首先關(guān)閉.所有的的socket流必須在socket關(guān)閉之前關(guān)閉.這個(gè)小程序非常地簡(jiǎn)單,但是所有的客戶端程序都必須遵首下面的基本的步驟: 1.建立客戶端socket連接. 2.得到socket的讀和寫(xiě)的流. 3.利用流. 4.關(guān)閉流. 5.關(guān)閉socket. 使用一個(gè)服務(wù)器端的socket只是有一點(diǎn)復(fù)雜,它將在下面講到.服務(wù)器Sockets 列表9.2是一個(gè)服務(wù)器應(yīng)用程序的一部分. 列表9.2 一個(gè)簡(jiǎn)單的服務(wù)器程序 /** * 一個(gè)監(jiān)聽(tīng)端口并提供HTML文檔的程序. */ class SimpleWebServer { public static void main(String args[]) { ServerSocket serverSocket = null; Socket clientSocket = null; int connects = 0; try { { // 建立一個(gè)服務(wù)器socket serverSocket = new ServerSocket(80, 5); while (connects < 5) { // 等待連接 clientSocket = serverSocket.accept(); //服務(wù)連接 ServiceClient(clientSocket); connects++; } serverSocket.close(); } catch (IOException ioe) { System.out.println('Error in SimpleWebServer: ' + ioe); } } public static void ServiceClient(Socket client) throws IOException { DataInputStream inbound = null; DataOutputStream outbound = null; try { // 得到IO流 inbound = new DataInputStream( client.getInputStream()); outbound = new DataOutputStream( client.getOutputStream()); //格式化輸出(回應(yīng)頭和很少的HTML文檔) StringBuffer buffer = PrepareOutput(); String inputLine; while ((inputLine = inbound.readLine()) != null) { //如果到了HTTP請(qǐng)求的尾部,就發(fā)送回應(yīng) if ( inputLine.equals('') ) { outbound.writeBytes(buffer.toString()); break; } } } finally { // 清除 System.out.println('Cleaning up connection: ' + client); tln('Cleaning up connection: ' + client); outbound.close(); inbound.close(); client.close(); client.close(); } }服務(wù)器Sockets 服務(wù)器并不是主動(dòng)地建立連接.相反地,他們是被動(dòng)地監(jiān)聽(tīng)一個(gè)客戶端的連接請(qǐng)示然后給他們服務(wù).服務(wù)器是由類ServerSocket來(lái)建立的.下面的程序建立了一個(gè)服務(wù)器端socket并把它綁定到80端口: ServerSocket serverSocket = new ServerSocket(80, 5); 第一個(gè)參數(shù)是服務(wù)器要監(jiān)聽(tīng)的端口.第二個(gè)參數(shù)是可選的.API文檔中說(shuō)明了這是一個(gè)監(jiān)聽(tīng)時(shí)間,但是在傳統(tǒng)的socket程序中第二個(gè)參數(shù)是監(jiān)聽(tīng)深度.一個(gè)服務(wù)器可以同時(shí)接收多個(gè)連接請(qǐng)求,但是每次只能處理一個(gè).監(jiān)聽(tīng)堆是一個(gè)無(wú)回答的連接請(qǐng)求隊(duì)列.上面的請(qǐng)求建立一個(gè)連接來(lái)處理最后五個(gè)請(qǐng)求.如果省略了后面的一個(gè)參數(shù),則默認(rèn)值是50. ServerSocket serverSocket = new ServerSocket(80, 5); 一旦socket建立了并開(kāi)始監(jiān)聽(tīng)連接,進(jìn)來(lái)的連接將會(huì)建立并放在監(jiān)聽(tīng)堆.accetp()方法把在堆中的連接取出來(lái). Socket clientSocket = serverSocket.accept(); 這個(gè)方法返回一個(gè)用來(lái)與來(lái)訪者對(duì)話的客戶端連接.服務(wù)器本身不可能建立對(duì)話,相反地,服務(wù)器socket會(huì)使用accept()方法來(lái)產(chǎn)生一個(gè)新的socket.服務(wù)器socket依舊打開(kāi)并排列新的連接請(qǐng)求. 與客戶端socket一樣,下面的一步建立輸入和輸出流: DataInputStream inbound = new DataInputStream( clientSocket.getInputStream() ); DataOutputStream outbound = new DataOutputStream( clientSocket.getOutputStream() ); 一般的I/O操作可以在新建的流中運(yùn)用.在服務(wù)器回應(yīng)前它等待客戶端發(fā)送一個(gè)空白的行.當(dāng)會(huì)話結(jié)束時(shí),服務(wù)器關(guān)閉流和客戶端socket.如果在隊(duì)列中沒(méi)有請(qǐng)示將會(huì)出現(xiàn)什么情況呢?那個(gè)方法將會(huì)等待一個(gè)的到來(lái).這個(gè)行為叫阻塞.accept()方法將會(huì)阻塞服務(wù)器線程直到一個(gè)呼叫到來(lái).當(dāng)5個(gè)連接處理完閉之后,服務(wù)器退出.任何的在隊(duì)列中的呼叫將會(huì)被取消. 所有的服務(wù)器都要有以下的基本的步驟: 1.建立一個(gè)服務(wù)器socket并開(kāi)始監(jiān)聽(tīng). 2.使用accept()方法取得新的連接. 3.建立輸入和輸出流. 4.在已有的協(xié)議上產(chǎn)生會(huì)話. 5.關(guān)閉客戶端流和socket. 6.回到第二步或者到第七步. 7.關(guān)閉服務(wù)器socket.重復(fù)和并發(fā)服務(wù)器這個(gè)應(yīng)用程序被當(dāng)作一個(gè)重復(fù)的服務(wù)器.因?yàn)樗挥性谔幚硗暌粋€(gè)進(jìn)程以后才會(huì)接受另一個(gè)連接.更多的復(fù)雜服務(wù)器是并發(fā)的.它為每一個(gè)請(qǐng)求分配一個(gè)線程,而不是來(lái)一個(gè)處理一個(gè).所以看起來(lái)它在同時(shí)處理多人請(qǐng)求.所有的商業(yè)的服務(wù)器都是并發(fā)的服務(wù)器. Java數(shù)據(jù)報(bào)類 不像面向連接的類,數(shù)據(jù)報(bào)的客戶端和服務(wù)器端的類在表面上是一樣的.下面的程序建立了一個(gè)客戶和服務(wù)器商的數(shù)據(jù)報(bào)sockets: DatagramSocket serverSocket = new DatagramSocket( 4545 ); DatagramSocket clientSocket = new DatagramSocket(); 服務(wù)器用參數(shù)4545來(lái)指定端口號(hào),由于客戶端將要呼叫服務(wù)器,客戶端可以利用可利用的端口.如果省略第二個(gè)參數(shù),程序會(huì)讓操作系統(tǒng)分配一個(gè)可用的端口.客戶端可以請(qǐng)求一個(gè)指定的端口,但是如果其它的應(yīng)用程序已經(jīng)綁定到這個(gè)端口之上,請(qǐng)求將會(huì)失敗.如果你的意圖不是作為一個(gè)服務(wù)器,最好不要指定端口. 由于流不能由交談得到,那么我么如何與一個(gè)數(shù)據(jù)報(bào)Socket進(jìn)行對(duì)話.答案在于數(shù)據(jù)報(bào)類. 接收數(shù)據(jù)報(bào) DatagramPacket類是用來(lái)通過(guò)DatagramSocket類接收和發(fā)送數(shù)據(jù)的類.packet類包括了連接信息和數(shù)據(jù).就如前面所說(shuō)的一樣,數(shù)據(jù)報(bào)是自身獨(dú)立的傳輸單元.DatagramPacket類壓縮了這些單元.下面的程序表示了用一個(gè)數(shù)據(jù)報(bào)socket來(lái)接收數(shù)據(jù): DatagramPacket packet = new DatagramPacket(new byte[512], 512); clientSocket.receive(packet); clientSocket.receive(packet); packet的構(gòu)建器需要知道將得到的數(shù)據(jù)放在哪兒.一個(gè)512字節(jié)的緩存被建立并且作為構(gòu)建器的第二個(gè)參數(shù).每二個(gè)構(gòu)建器參數(shù)是緩存的大小.就像ServerSocket類的accept()方法一樣,receive()方法在數(shù)據(jù)可用之前將會(huì)阻塞. 發(fā)送數(shù)據(jù)報(bào) 發(fā)送數(shù)據(jù)報(bào)是非常地簡(jiǎn)單地,所有需要的只是一個(gè)地址.地址是由InetAddress類來(lái)建立的.這個(gè)類沒(méi)有公共的構(gòu)建器,但是它有幾個(gè)static的方法,可以用來(lái)建立這個(gè)類的實(shí)例.下面的列表列出了建立InetAddress類的實(shí)例的方法: Public InetAddress Creation Methods InetAddress getByName(String host); InetAddress[] getAllByName(String host); InetAddress getLocalHost(); 得到本地主機(jī)的地址是非常地有用的,只有前面兩個(gè)方法是用來(lái)發(fā)送數(shù)據(jù)包的.getByName()和getAllByName()需要目的主機(jī)的地址.第一個(gè)方法僅僅只是返回第一個(gè)符合條件的東西.第二個(gè)方法是必須的,因?yàn)橐慌_(tái)計(jì)算機(jī)可能有多個(gè)地址.在這種情況下,這臺(tái)計(jì)算機(jī)被稱為multi-homed. 所有的建立的方法都被標(biāo)記為static.它們必須像下面這樣得到調(diào)用: InetAddress addr1 = InetAddress.getByName('merlin'); InetAddress addr2[] = InetAddress.getAllByName('merlin'); InetAddress addr3 = InetAddress.getLocalHost();所有的這些調(diào)用都可以擲出一個(gè)UnknownHostException違例.如果一臺(tái)計(jì)算機(jī)沒(méi)有連接上DNS服務(wù)器,或者主機(jī)的確沒(méi)有找到,這個(gè)違例就會(huì)被擲出.如果一臺(tái)計(jì)算機(jī)沒(méi)有一個(gè)激活的TCP/IP配置,getLocalHost()也為失敗并擲出一個(gè)違例. 一旦一個(gè)地址被確定了,數(shù)據(jù)報(bào)就可以被送出了.下面的程序傳輸了一個(gè)字符串給目的socket: String toSend = 'This is the data to send!'); byte[] sendbuf = new byte[ toSend.length() ]; toSend.getBytes( 0, toSend.length(), sendbuf, 0 ); DatagramPacket sendPacket = new DatagramPacket( sendbuf, sendbuf.length, addr, port); clientSocket.send( sendPacket ); 首先,字符串必須被轉(zhuǎn)換成一個(gè)字節(jié)數(shù)組.然后,一個(gè)新的DatagramPacket實(shí)例必須被建立.注意構(gòu)建器的最后兩個(gè)參數(shù).因?yàn)橐l(fā)送一個(gè)包,所以地址和端口必須被給定.一個(gè)applet可能可以知道它的服務(wù)器的地址,但是服務(wù)器如何知道它的客戶機(jī)的地址呢.當(dāng)任何一個(gè)包被收到后,返回的地址和端口會(huì)被解壓出來(lái),并通過(guò)getAddress()和getPort()方法得到.這就是一個(gè)服務(wù)器如何回應(yīng)一個(gè)客戶端的包: DatagramPacket sendPacket = new DatagramPacket( sendbuf, sendbuf.length, recvPacket.getAddress(), recvPacket.getPort() ); serverSocket.send( sendPacket ); 不像面向連接的操作,數(shù)據(jù)報(bào)服務(wù)器服務(wù)器其實(shí)比數(shù)據(jù)報(bào)客戶端更簡(jiǎn)單: 數(shù)據(jù)報(bào)服務(wù)器 一個(gè)數(shù)據(jù)報(bào)服務(wù)器的基本步驟: 1.在一個(gè)指定的端口上建立一個(gè)數(shù)據(jù)報(bào)socket. 2.用receive方法等待進(jìn)來(lái)的包. 3.用特定的協(xié)議來(lái)回應(yīng)收到的包. 4.回到第二步或繼續(xù)第二步. 5.關(guān)閉數(shù)據(jù)報(bào)socket. 列表9.3演示了一人簡(jiǎn)單的數(shù)據(jù)報(bào)回應(yīng)服務(wù)器.它將回應(yīng)它收到的包. 列表9.3.一個(gè)簡(jiǎn)單的數(shù)據(jù)報(bào)回應(yīng)服務(wù)器 import java.io.*; import java.net.*; public class SimpleDatagramServer { public static void main(String[] args) { DatagramSocket socket = null; DatagramPacket recvPacket, sendPacket; try { socket = new DatagramSocket(4545); while (socket != null) { recvPacket= new DatagramPacket(new byte[512], 512); socket.receive(recvPacket); sendPacket = new DatagramPacket( recvPacket.getData(), recvPacket.getLength(), recvPacket.getAddress(), recvPacket.getPort() ); socket.send( sendPacket ); } } catch (SocketException se) { System.out.println('Error in SimpleDatagramServer: ' + se); } catch (IOException ioe) { System.out.println('Error in SimpleDatagramServer: ' + ioe);簡(jiǎn)單的WEB服務(wù)器一個(gè)簡(jiǎn)單的WEB服務(wù)器將由列表9.2這樣構(gòu)建.當(dāng)然,還必須要對(duì)方法和回應(yīng)事件進(jìn)行改進(jìn).簡(jiǎn)單的服務(wù)器不會(huì)分析和存儲(chǔ)請(qǐng)求頭.新的WEB服務(wù)器將分析和存儲(chǔ)請(qǐng)求,為以后的處理作準(zhǔn)備.為了達(dá)到這個(gè)目的,你必須有一個(gè)包含HTTP請(qǐng)求的類. HTTPrequest類 列表9.5列出了一個(gè)完整的HTTPrequest類.這個(gè)類必須包括一個(gè)請(qǐng)求頭所需的所有信息. 列表9.5.HTTPrequest類. import java.io.*; import java.util.*; import java.net.*; import NameValue; /** * 這個(gè)類有一個(gè)HTTP請(qǐng)求的所有信息 */ public class HTTPrequest { public String version; public String method; public String file; public Socket clientSocket; public DataInputStream inbound; public NameValue headerpairs[]; /** * 建立一個(gè)這個(gè)類的實(shí)例 */ public HTTPrequest() { version = null; method = null; file = null; clientSocket = null; inbound = null; inbound = null; headerpairs = new NameValue[0]; } /** * 加入一個(gè)名稱/值對(duì)到核心數(shù)組 */ public void addNameValue(String name, String value) { try { NameValue temp[] = new NameValue[ headerpairs.length + 1 ]; System.arraycopy(headerpairs, 0, temp, 0, headerpairs.length); temp[ headerpairs.length ] = new NameValue(name, value); headerpairs = temp; } catch (NullPointerException npe) { System.out.println('NullPointerException while adding name-value: ' + npe); } } /** * 以字符串的形式歸還這個(gè)類 */ public String toString() { String s = method + ' ' + file + ' ' + version + ' '; for (int x = 0; x < headerpairs.length; x++ ) s += headerpairs[x] + ' '; return s; } } NameValue類簡(jiǎn)單地存儲(chǔ)了兩個(gè)字符串:name 和 value.當(dāng)一個(gè)新的對(duì)要被加入時(shí),一個(gè)新的數(shù)組將被分配.新的數(shù)組接受了舊的數(shù)組和新的成員.舊的數(shù)組然后被一個(gè)新建的對(duì)象覆蓋了 Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 国产亚洲一区二区在线观看 | 国产精品亚洲综合久久小说 | 99www综合久久爱com | 超级碰碰碰视频在线观看 | 一级 在线播放 | 青草久久久 | 日本欧美韩国专区 | 黄色免费网站网址 | 黄+色+性+人免费 | 亚洲一区二区三区四区 | 嫩草影院麻豆久久视频 | 欧美 日韩 国产在线 | 欧美日韩中文字幕一区二区高清 | 久久国产精品一区二区三区 | 亚洲一区二区色 | 欧美喷水 | 欧美精品免费看 | 黄色网址在线免费看 | 亚洲另类在线观看 | 久久久国产精品福利免费 | 成人毛片免费视频播放 | 一级影院 | 老妇女毛片 | 亚洲免费网站 | 又爽又黄又无遮挡的视频美女软件 | 操网| 亚洲国产天堂久久综合9999 | 日本欧美韩国一区二区三区 | 国产精品乱 | 亚洲香蕉国产高清在线播放 | 国产精品美女免费视频观看 | 亚洲国产婷婷综合在线精品 | 五月天婷婷网亚洲综合在线 | 欧美另类亚洲一区二区 | 欧美啊啊 | 亚洲欧美久久婷婷爱综合一区天堂 | 国产亚洲欧美另类一区二区三区 | 免费xxxxx大片观看 | 永久免费在线观看视频 | 国产一级第一级毛片 | 免费观看一级欧美大 |