<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    少年阿賓

    那些青春的歲月

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

           Web服務(wù)器與客戶端的通信使用HTTP協(xié)議(超文本傳輸協(xié)議),所以也叫做HTTP服務(wù)器。用Java構(gòu)造Web服務(wù)器主要用二個類,java.net.Socket和java.net.ServerSocket,來實現(xiàn)HTTP通信。因此,本文首先要討論的是HTTP協(xié)議和這兩個類,在此基礎(chǔ)上實現(xiàn)一個簡單但完整的Web服務(wù)器。
      一、超文本傳輸協(xié)議
      Web服務(wù)器和瀏覽器通過HTTP協(xié)議在Internet上發(fā)送和接收消息。HTTP協(xié)議是一種請求-應(yīng)答式的協(xié)議——客戶端發(fā)送一個請求,服務(wù)器返回該請求的應(yīng)答。HTTP協(xié)議使用可靠的TCP連接,默認端口是80。HTTP的第一個版本是HTTP/0.9,后來發(fā)展到了HTTP/1.0,現(xiàn)在最新的版本是HTTP/1.1。HTTP/1.1由
     RFC 2616 定義(pdf格式)。
      本文只簡要介紹HTTP 1.1的相關(guān)知識,但應(yīng)該足以讓你理解Web服務(wù)器和瀏覽器發(fā)送的消息。如果你要了解更多的細節(jié),請參考RFC 2616。
      在HTTP中,客戶端/服務(wù)器之間的會話總是由客戶端通過建立連接和發(fā)送HTTP請求的方式初始化,服務(wù)器不會主動聯(lián)系客戶端或要求與客戶端建立連接。瀏覽器和服務(wù)器都可以隨時中斷連接,例如,在瀏覽網(wǎng)頁時你可以隨時點擊“停止”按鈕中斷當前的文件下載過程,關(guān)閉與Web服務(wù)器的HTTP連接。
      1.1 HTTP請求
      HTTP請求由三個部分構(gòu)成,分別是:方法-URI-協(xié)議/版本,請求頭,請求正文。下面是一個HTTP請求的例子:
    GET /servlet/default.jsp HTTP/1.1
    Accept: text/plain; text/html
    Accept-Language: en-gb
    Connection: Keep-Alive
    Host: localhost
    Referer: http://localhost/ch8/SendDetails.htm
    User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)
    Content-Length: 33
    Content-Type: application/x-www-form-urlencoded
    Accept-Encoding: gzip, deflate
    userName=JavaJava&userID=javaID

     請求的第一行是“方法-URI-協(xié)議/版本”,其中GET就是請求方法,/servlet/default.jsp表示URI,HTTP/1.1是協(xié)議和協(xié)議的版本。根據(jù)HTTP標準,HTTP請求可以使用多種請求方法。例如,HTTP 1.1支持七種請求方法:GET,POST,HEAD,OPTIONS,PUT,DELETE,和TRACE。在Internet應(yīng)用中,最常用的請求方法是GET和POST。
      URI完整地指定了要訪問的網(wǎng)絡(luò)資源,通常認為它相對于服務(wù)器的根目錄而言,因此總是以“/”開頭。URL實際上是
    URI 一種類型。最后,協(xié)議版本聲明了通信過程中使用的HTTP協(xié)議的版本。
      請求頭包含許多有關(guān)客戶端環(huán)境和請求正文的有用信息。例如,請求頭可以聲明瀏覽器所用的語言,請求正文的長度,等等,它們之間用一個回車換行符號(CRLF)分隔。
      請求頭和請求正文之間是一個空行(只有CRLF符號的行),這個行非常重要,它表示請求頭已經(jīng)結(jié)束,接下來的是請求的正文。一些介紹Internet編程的書籍把這個CRLF視為HTTP請求的第四個組成部分。
      在前面的HTTP請求中,請求的正文只有一行內(nèi)容。當然,在實際應(yīng)用中,HTTP請求正文可以包含更多的內(nèi)容。
      1.2 HTTP應(yīng)答
      和HTTP請求相似,HTTP應(yīng)答也由三個部分構(gòu)成,分別是:協(xié)議-狀態(tài)代碼-描述,應(yīng)答頭,應(yīng)答正文。下面是一個HTTP應(yīng)答的例子:
    HTTP/1.1 200 OK
    Date: Tue, 06 Mar 2012 12:32:58 GMT
    Server: Apache/2.2.22 (Win32)
    Last-Modified: Tue, 06 Mar 2012 11:46:06 GMT
    ETag: “b000000008d9e-57-4ba9196947acd”
    Accept-Ranges: bytes
    Content-Length: 87
    Content-Type: text/html

    經(jīng)過測試,可以使用滴
    //實例一:
    package com.abin.lii.han.socket;

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.URLEncoder;

    public class SocketGetServletTest {
     public static void main(String[] args) {
       BufferedWriter httpGetWriter = null;
             BufferedReader httpResponse = null;
             try {
                 String hostname = "localhost";// 主機,可以是域名,也可以是ip地址
                 int port = 1443;// 端口
                 InetAddress addr = InetAddress.getByName(hostname);
                 // 建立連接
                 Socket socket = new Socket(addr, port);
                 // 創(chuàng)建數(shù)據(jù)提交數(shù)據(jù)流
                 httpGetWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "GBK"));
                 // 相對主機的請求地址
                 StringBuffer httpSubmitPath = new StringBuffer("/abin/ImediaRegister?");
    //             StringBuffer httpSubmitPath = new StringBuffer("http://localhost:7200/abin/ImediaRegister?");
                 httpSubmitPath.append(URLEncoder.encode("app", "GBK"));
                 httpSubmitPath.append("=");
                 httpSubmitPath.append(URLEncoder.encode("longcodeimedia", "GBK"));
                 httpSubmitPath.append("&");
                 httpSubmitPath.append(URLEncoder.encode("udid", "GBK"));
                 httpSubmitPath.append("=");
                 httpSubmitPath.append(URLEncoder.encode("123456789", "GBK"));
                 httpSubmitPath.append("&");
                 httpSubmitPath.append(URLEncoder.encode("source", "GBK"));
                 httpSubmitPath.append("=");
                 httpSubmitPath.append(URLEncoder.encode("limei", "GBK"));
                 httpSubmitPath.append("&");
                 httpSubmitPath.append(URLEncoder.encode("returnFormat", "GBK"));
                 httpSubmitPath.append("=");
                 httpSubmitPath.append(URLEncoder.encode("2", "GBK"));
                 httpGetWriter.write("GET " + httpSubmitPath.toString() + " HTTP/1.1\r\n");
                 httpGetWriter.write("Host: localhost:7200\r\n");
                 httpGetWriter.write("UserAgent: IE8.0\r\n");
                 httpGetWriter.write("Connection: Keep-Alive\r\n");
                 httpGetWriter.write("\r\n");
                 httpGetWriter.flush();
                 // 創(chuàng)建web服務(wù)器響應(yīng)的數(shù)據(jù)流
                 httpResponse = new BufferedReader(new InputStreamReader(socket.getInputStream(), "GBK"));
                 // 讀取每一行的數(shù)據(jù).注意大部分端口操作都需要交互數(shù)據(jù)。
                 String lineStr = "";
                 while ((lineStr = httpResponse.readLine()) != null) {
                     System.out.println(lineStr);
                 }
             } catch (Exception e) {
                 e.printStackTrace();
             } finally {
                 try {
                     if (httpGetWriter != null) {
                         httpGetWriter.close();
                     }
                     if (httpResponse != null) {
                         httpResponse.close();
                     }
                 } catch (IOException e) {
                     e.printStackTrace();
                 }
             }
         }

           
    }



    //實例二

    package com.abin.lii.han.socket;

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.InetAddress;
    import java.net.Socket;

    public class SocketGetServletTest1 {

     public static void main(String[] args) {
      try {
       Socket socket = new Socket(InetAddress.getLocalHost(), 7200);
       BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
       StringBuffer buffer = new StringBuffer();
       buffer.append("GET http://localhost:7200/abin/ImediaRegister?app=2 HTTP/1.1\r\n");
       buffer.append("Host: localhost:7200\r\n");
       buffer.append("UserAgent: IE8.0\r\n");
       buffer.append("Connection: Keep-Alive\r\n");
       // 注,這是關(guān)鍵的關(guān)鍵,忘了這里讓我搞了半個小時。這里一定要一個回車換行,表示消息頭完,不然服務(wù)器會等待
       buffer.append("\r\n");
       writer.write(buffer.toString());
       writer.flush();

       // --輸出服務(wù)器傳回的消息的頭信息
       BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
       String line = null;
       StringBuilder builder=new StringBuilder();
       while((line=reader.readLine())!=null){
        builder.append(line);
       }
       String result=builder.toString();
       System.out.println("result="+result);
      } catch (Exception e) {
       e.printStackTrace();
      }
     }

    }

     

    posted on 2012-12-31 08:31 abin 閱讀(3225) 評論(0)  編輯  收藏 所屬分類: Socket

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 久久精品国产亚洲αv忘忧草| 日本中文一区二区三区亚洲 | 亚洲小视频在线播放| 免费看无码特级毛片| 国产自偷亚洲精品页65页| 一区二区视频在线免费观看| www.91亚洲| 产传媒61国产免费| 亚洲国产精品成人| 久久久久久av无码免费看大片| 亚洲五月午夜免费在线视频| 国产做国产爱免费视频| 国产AV无码专区亚洲AV毛网站| 四虎国产精品免费永久在线| 久久精品亚洲视频| 亚洲免费视频观看| 亚洲高清视频在线观看| 免费无码一区二区三区蜜桃| 亚洲无av在线中文字幕| 成全在线观看免费观看大全| 久久久久亚洲Av无码专| 麻豆最新国产剧情AV原创免费| 亚洲精品欧美综合四区| 免费va人成视频网站全| 中国在线观看免费的www| 午夜亚洲国产理论秋霞| 曰曰鲁夜夜免费播放视频| 亚洲欧美日韩中文字幕在线一区| 国产精品美女自在线观看免费| 老司机精品视频免费| 亚洲精品少妇30p| 精品女同一区二区三区免费站| 亚洲色大成网站www久久九| 亚洲国产高清在线一区二区三区| a级午夜毛片免费一区二区| 亚洲欧洲日韩综合| 免费a级毛片大学生免费观看| 一区二区三区无码视频免费福利| 亚洲一级毛片免费观看| 四虎精品亚洲一区二区三区| 久久99精品视免费看|