基于Jave的Web服務(wù)工作機(jī)制(5)_Windows教程
output = socket.getOutputStream();
await于是就創(chuàng)建一個(gè)Request對(duì)象并調(diào)用它的 parse 方法來解析原始的HTTP請(qǐng)求信息。
// create Request object and parse
Request request = new Request(input);
request.parse();
接下來,await 方法創(chuàng)建了一個(gè)Response 對(duì)象,使用setRequest方法并調(diào)用它的sendStaticResource 方法。
// create Response object
Response response = new Response(output);
response.setRequest(request);
response.sendStaticResource();
最后,await關(guān)閉該Socket。調(diào)用Request的getUri方法來檢查HTTP請(qǐng)求的URI是否是一個(gè)shutdown命令。如果是,shutdown變量被設(shè)置為true,程序退出while循環(huán)。
// Close the socket
socket.close();
//check if the previous URI is a shutdown command
shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
Request類
Request類代表一個(gè)HTTP請(qǐng)求。Socket處理客戶端的通訊,將返回一個(gè)InputStream對(duì)象,通過傳遞該對(duì)象,可以構(gòu)造一個(gè)Request類的實(shí)例。通過調(diào)用InputStream 對(duì)象的read方法來獲得這個(gè)HTTP請(qǐng)求的原始數(shù)據(jù)(raw data)。
Request 有兩個(gè)公共方法:parse 和 getUri。parse方法解釋HTTP請(qǐng)求的原始數(shù)據(jù)。它不做很多事情----它能夠利用的唯一信息只是HTTP請(qǐng)求的URI ,這個(gè)URI是從私有方法 parseUri.得到的。parseUri 方法保存URI 到uri 變量中,然后調(diào)用公共方法getUri來返回一個(gè)HTTP請(qǐng)求的URI。
為了理解parse 和 parseUri 方法是如何工作的,需要知道HTTP請(qǐng)求的內(nèi)部結(jié)構(gòu)。這個(gè)結(jié)構(gòu)是在RFC2616文檔中定義的。
一個(gè)HTTP請(qǐng)求包含三個(gè)部分:
請(qǐng)求行(Request line)
請(qǐng)求包頭(Headers)
消息體(Message body)
現(xiàn)在,我們僅僅只對(duì)HTTP請(qǐng)求的第一部分請(qǐng)求行(Request line)感興趣。一個(gè)請(qǐng)求行由方法標(biāo)記開始,后面根請(qǐng)求的URI和協(xié)議版本,最后由CRLF字符結(jié)束。請(qǐng)求行中的元素被空格字符分開。比如,使用GET方法請(qǐng)求的index.html文件的請(qǐng)求行如下:
GET /index.html HTTP/1.1 //這是一個(gè)請(qǐng)求行
方法parse從socket的InputStream 中讀取整個(gè)字節(jié)流,該字節(jié)流是 Request 對(duì)象傳遞進(jìn)來的,然后parse將這些字節(jié)流存儲(chǔ)在一個(gè)緩沖區(qū)里, 在緩沖區(qū)中組裝一個(gè)稱為request的StringBuffer對(duì)象。
下面的Listing 1.2.顯示了parse方法的用法:
Listing 1.2. The Request class' parse method
public void parse() {
// Read a set of characters from the socket
StringBuffer request = new StringBuffer(2048);
int i;
byte[] buffer = new byte[2048];
try {
i = input.read(buffer);
}
catch (IOException e) {
e.printStackTrace();
i = -1;
}
for (int j=0; j<i; j++) {
request.append((char) buffer[j]);
}
System.out.print(request.toString());
uri = parseUri(request.toString());
}
- 相關(guān)鏈接:
- 教程說明:
Windows教程-基于Jave的Web服務(wù)工作機(jī)制(5)
。