Java基礎-Java中的”推”技術

發表于:2007-05-25來源:作者:點擊數: 標簽:java-Java一般中的基礎
在一般的B/S程序中(最典型的是web服務),工作的方式是客戶端(brower)向 服務器 端(server)發送一個請求,服務器端響應這個請求并發回客戶端所請求的數據。在這個過程中服務器端扮演的是一個被動響應的角色,一般的情況下,服務器端是不會主動向客戶端寫數據
在一般的B/S程序中(最典型的是web服務),工作的方式是客戶端(brower)向服務器端(server)發送一個請求,服務器端響應這個請求并發回客戶端所請求的數據。在這個過程中服務器端扮演的是一個被動響應的角色,一般的情況下,服務器端是不會主動向客戶端寫數據的。由于HTTP是一個無連接的協議,也就是說當服務器端完成對客戶端的響應后,雙方的連接就斷開了,直到下一次客戶端發出請求時再重新建立連接。這樣的HTTP協議是節省網絡資源的,但是也給我們帶來了一些麻煩,比如客戶端不能實時探查服務器端的數據變化,不能作出及時的響應。所以當我們在做一些需要客戶端和服務器端互相響應的程序時(比如聊天室、web短信息),不得不在客戶端不停的刷新頁面,以求獲得最新的數據,這樣做增加的服務器的負擔。如果服務器能在數據發生變化的時候主動向客戶端寫數據,那么問題就解決了,這就是所謂的“推”技術。
 在java中,客戶端主動向服務器端申請數據,叫做“拉”;服務器主動向客戶端寫數據,叫做“推”。我們可以在服務器端打開某個端口,監聽客戶端的連接,就可以向客戶端隨意寫數據,這是我們做C/S程序的原理,“推”技術采用相同的原理,只是客戶端是瀏覽器而已,只要我們按照瀏覽器能夠識別的格式向客戶端寫數據,客戶端就可以通過HTTP與服務器建立連接,并獲得數據。
 HTTP是一個很龐大的協議,但是我們只需要用到很小一部分。最重要的是要知道按照什么格式寫數據,瀏覽器才認識。當我們瀏覽一個網站的某一頁,比如www.sohu.com/page.htm的時候,我們是在向服務器發送這樣一個信息:
 GET /page.htm HTTP/1.0

 From: someuser@somehost.com

 User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 5.0; DigExt)

 空行
 其中第一行是我們要關注的,它由空格分隔成三部分,一是請求的方法(get),二是請求的頁面,三是HTTP的版本。如果請求無誤,服務器將返回如下信息:
 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>
 (其他內容)...
 </body>
 </html>
 第一行表示連接成果,然后是返回數據的屬性,從開始才是返回給瀏覽器返回的數據。在我們自己的程序中只需要按照上述格式寫數據,就可以實現一個自己的簡易web服務器。下面是一個hello,world的例子:

 //myServer.java
 import java.io.*;
 import java.net.*;
 public class myServer
 {
 static ServerSocket server=null;
 static OutputStreamWriter ow=null;
 public static void main(String args[])
 {
  int port=800;
  try
  {
   server=new ServerSocket(port);
  }catch(Exception e)
  {
   System.out.println(e);
  }
  while(true)
  {
   try
   {
    Socket socket=server.aclearcase/" target="_blank" >ccept();
    ow=new OutputStreamWriter(socket.getOutputStream());
    ow.write("HTTP/1.0 200 ok ");
    ow.write("Content-Type:text/html ");
    ow.write("");
    ow.write("hello,world");
    ow.write("");
    ow.flush();
    socket.close();
   }catch(Exception e)
   {
    System.out.println(e);
   }
  }
 }
 } 


 編譯:javac myServer.java
 運行:java myServer
 然后打開瀏覽器,輸入http://localhost:800,將會返回一個”hello,world”
 以上就是一個“推”技術的簡單實現,將它擴展一下,比如加入多線程響應,就可以實現無刷新的聊天室,請讀者自己考慮。

原文轉自:http://www.anti-gravitydesign.com

評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97