SSD8 exercise01

    新的一學期 又帶去回了SSD8,網絡與分佈式課程。今年開始改革了,因此咱們助教要一個一個查做業。而後我就陷入了一場幫別人圓謊的博弈賽中。有鑑於此,我就幾個關鍵點對SSD8 exercise01關鍵點進行描述。首先FTP裏面有個wireshark-setup-1.0.8.exe的軟件,你們不妨打開看看,這個wireshark的抓包工具的教程網上一搜一堆,你們能夠看下。html

先說說這個題是幹嗎的,你要完成三個類java

1 Client.java,這個類就是模擬一個HTTP的客戶端,發出「請求報文」,解析「響應報文」。ajax

2 SimpleServer.java這個類是模擬一個HTTP的服務器,解析「請求報文」,向Client.java返回「響應報文」。數組

3 多線程的HTTP服務器,響應併發的Client.java可是以現有的實驗室資源無法測試,你也能夠寫個ThreadClient.java來試試。服務器

 HTTP的請求報文張這樣:網絡

GET /enclosure/2010-09-10T02_51_05-07_00.mp3 HTTP/1.1 多線程

Host: 805665086.podomatic.com Connection: keep-alive 併發

User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7 app

Accept: */*框架

Referer: http://www.1g1g.com/player/loader.swf?uid=0.8106261373031884

Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
[不要忘了這有空行或者CRLF]

HTTP的響應報文張這樣:

 HTTP/1.1 200 OK 

Server: XNHttpServer1.0
Content-Type: text/html;charset=UTF-8
Content-Length: 79
Connection: keep-alive
Keep-Alive: 300
Cache-Control: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
[不要忘了這有空行或者CRLF,分割了報文頭和報文體]
<msglist><message type='system'><body>init ajax loop</body></message></msglist>

那麼如今開始程序方面的問題。

Client.java代碼框架大概是這樣。

建立Socket;

socket = new Socket(host, PORT);

打開鏈接到Socket的輸入/出流;

ostream = new BufferedOutputStream(socket.getOutputStream());
istream = new BufferedInputStream(socket.getInputStream());

 下面開始最最重要的步驟就是發出「請求報文」,解析「響應報文」。

這裏是檢查的重點

首先你要拼出請求報文的請求行

長這樣GET /index.html HTTP/1.1[crlf][crlf]

這樣就足夠了,有的同窗把首部行也拼了出來,也沒錯,可是工做量上去了。這樣其實就能夠了socket就能夠幫你把你的「請求報文」發送到服務器段的host上去了。

還記得當時你打開socket的ostream嗎?用它來發送就行。以上面的爲例

ostream.write(buffer, 0, request.length());
ostream.flush();

就能夠發送了。不一樣的流有不一樣的方法,具體查看JDK。

下面解析「響應報文」。

你要得到一段流,輸入流,哪來的本身找去。我從網上找了一段很精妙的代碼,各位看官看看。

                boolean inHeader = true; // loop control
        char c = 0;
        while (inHeader && ((c = istream.read()) != -1)) {
            switch (c) {
            case '\r':
                break;
            case '\n':
                if (c == last) {
                    inHeader = false;
                    break;
                }
                last = c;
                header.append("\n");
                break;
            default:
                last = c;
                header.append((char) c);
            }
        }

引入標誌位inHeader來記錄當前是否是在解析響應報文頭。同時斷定是否是有兩個連續的crlf。

再來你就把剩下的東東報文體就是直接保存在一個byte數組或者String中就能夠了。

最後不要忘了關閉SOCKET。

 

SimpleServer端和Client反過來了,你們能夠嘗試一下。本身寫寫,切記報文處理邏輯和SOCKET是考察重點。

相關文章
相關標籤/搜索