bromon原創(chuàng) 版權(quán)所有
在一般的B/S程序中(最典型的是web服務(wù)),工作的方式是客戶端(brower)向服務(wù)器端(server)發(fā)送一個請求,服務(wù)器端響應(yīng)這個請求并發(fā)回客戶端所請求的數(shù)據(jù)。在這個過程中服務(wù)器端扮演的是一個被動響應(yīng)的角色,一般的情況下,服務(wù)器端是不會主動向客戶端寫數(shù)據(jù)的。由于HTTP是一個無連接的協(xié)議,也就是說當(dāng)服務(wù)器端完成對客戶端的響應(yīng)后,雙方的連接就斷開了,直到下一次客戶端發(fā)出請求時再重新建立連接。這樣的HTTP協(xié)議是節(jié)省網(wǎng)絡(luò)資源的,但是也給我們帶來了一些麻煩,比如客戶端不能實(shí)時探查服務(wù)器端的數(shù)據(jù)變化,不能作出及時的響應(yīng)。所以當(dāng)我們在做一些需要客戶端和服務(wù)器端互相響應(yīng)的程序時(比如聊天室、web短信息),不得不在客戶端不停的刷新頁面,以求獲得最新的數(shù)據(jù),這樣做增加的服務(wù)器的負(fù)擔(dān)。如果服務(wù)器能在數(shù)據(jù)發(fā)生變化的時候主動向客戶端寫數(shù)據(jù),那么問題就解決了,這就是所謂的“推”技術(shù)。 在java中,客戶端主動向服務(wù)器端申請數(shù)據(jù),叫做“拉”;服務(wù)器主動向客戶端寫數(shù)據(jù),叫做“推”。我們可以在服務(wù)器端打開某個端口,監(jiān)聽客戶端的連接,就可以向客戶端隨意寫數(shù)據(jù),這是我們做C/S程序的原理,“推”技術(shù)采用相同的原理,只是客戶端是瀏覽器而已,只要我們按照瀏覽器能夠識別的格式向客戶端寫數(shù)據(jù),客戶端就可以通過HTTP與服務(wù)器建立連接,并獲得數(shù)據(jù)。 HTTP是一個很龐大的協(xié)議,但是我們只需要用到很小一部分。最重要的是要知道按照什么格式寫數(shù)據(jù),瀏覽器才認(rèn)識。當(dāng)我們?yōu)g覽一個網(wǎng)站的某一頁,比如www.sohu.com/page.htm的時候,我們是在向服務(wù)器發(fā)送這樣一個信息: GET /page.htm HTTP/1.0
From: someuser@somehost.com
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 5.0; DigExt)
空行 其中第一行是我們要關(guān)注的,它由空格分隔成三部分,一是請求的方法(get),二是請求的頁面,三是HTTP的版本。如果請求無誤,服務(wù)器將返回如下信息: HTTP/1.0 200 OK
Date: Thu, 8 Oct 2002 14:23:11 GMT
Content-Type: text/html
Content-Length: 1644
<html> <body> <h1>Hello world!</h1> (其他內(nèi)容)... </body> </html> 第一行表示連接成果,然后是返回?cái)?shù)據(jù)的屬性,從<html>開始才是返回給瀏覽器返回的數(shù)據(jù)。在我們自己的程序中只需要按照上述格式寫數(shù)據(jù),就可以實(shí)現(xiàn)一個自己的簡易web服務(wù)器。下面是一個hello,world的例子:
編譯:javac myServer.java 運(yùn)行:java myServer 然后打開瀏覽器,輸入http://localhost:800,將會返回一個”hello,world” 以上就是一個“推”技術(shù)的簡單實(shí)現(xiàn),將它擴(kuò)展一下,比如加入多線程響應(yīng),就可以實(shí)現(xiàn)無刷新的聊天室,請讀者自己考慮。
原文發(fā)表于《程序春秋》0301期