用 servlet實現http長串連

來源:互聯網
上載者:User

標籤:tchar   cte   sys   content   用戶端   stat   lib   頻寬   .net   

為了實現服務端向用戶端推送的模式,如果自己寫的socket到時順理成章的很容易實現。但是,甲方要我們用標準的http協議。當然,自己寫http伺服器倒是也沒什麼題,我開始也時這麼想的,而且都設計好了分布計算和Server Load Balancer的方式。但有人暫時還建議我們用中介軟體,他們的意見就像天氣的臉,一會兒這樣,一會兒那樣。於是在這方面考慮,無奈和喜悅同時而生。無奈的是,直接應用中介軟體,成就感將大打折扣。喜悅的是,直接應用中介軟體,我的開發量幾乎可以說就是實現商業邏輯,分布計算和Server Load Balancer都可以配置中介軟體實現。

那麼如果用中介軟體寫http服務,來應付用戶端的請求並實現推送模式呢。在開會的時候, 一個同事使我猛醒。他說他就直接寫一個servlet,這就是標準的http服務。這時,我便想起了我曾寫過用Java中URL累實現的http用戶端。不妨用之,這樣服務端用戶端就都有了實驗的依據。其中我問及同事是否實現長串連,結果他說沒有 (應該是沒想到這點),但是我們知道,服務推送的模式每次都開啟和關閉與用戶端的串連必然很耗資源。而我們實現的系統就是具備長串連,而且很耗頻寬的串連,不管是長串連還是短串連。如果每次資料傳送都要建立串連,而且請求非常頻繁的假推送模式效能很低的話,我們就可以試一試長串連推送的方式。

也許你會想,servlet的長串連怎麼實現呢。不錯,用while迴圈就可以了。平常我們用瀏覽器瀏覽網頁,大都一次請求,然後得到結果,關閉串連。其實如果服務端用一個死迴圈,一直在發送資料,而且用戶端沒有關閉的話,串連是一直存在的。我們完全可以用這條串連實現服務推模式。當然,監聽的用戶端自己寫一個很簡單,如下:

Java代碼  
  1. package test;  
  2.   
  3. import java.io.InputStream;  
  4. import java.net.URL;  
  5.   
  6. public class LongConnectionClient {  
  7.       
  8.     public static void main(String args[]) {  
  9.         try {  
  10.               
  11.             //確定服務地址  
  12.             URL url = new URL("http://localhost:8080/HttpConnectionTest/LongConnectionTest");  
  13.             InputStream in=url.openStream();  
  14.             int n = -1;  
  15.             byte[] b = new byte[1024];  
  16.             //從服務端讀取資料並列印  
  17.             while((n=in.read(b))!=-1)  
  18.             {  
  19.                 String s=new String(b,0,n, "UTF-8");  
  20.                 System.out.println(s);      
  21.             }  
  22.               
  23.         } catch (Exception e) {  
  24.             e.printStackTrace();  
  25.         }  
  26.     }  
  27.   
  28. }  



服務端的代碼也異常簡單:

Java代碼  
    1. package test;  
    2.   
    3. import java.io.IOException;  
    4. import java.io.PrintWriter;  
    5.   
    6. import javax.servlet.ServletException;  
    7. import javax.servlet.http.HttpServletRequest;  
    8. import javax.servlet.http.HttpServletResponse;  
    9.   
    10.  public class LongConnectionTest extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {  
    11.    static final long serialVersionUID = 1L;  
    12.      
    13.     public LongConnectionTest() {  
    14.         super();  
    15.     }         
    16.       
    17.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
    18.         this.doPost(request, response);  
    19.     }     
    20.       
    21.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
    22.   
    23.          response.setCharacterEncoding("UTF-8");  
    24.          response.setContentType("text/html");  
    25.           
    26.          PrintWriter pr = response.getWriter();  
    27.            
    28.          try {  
    29.              while(true) {  
    30.                  pr.print("有時候你不得不相信");  
    31.                  //flush的作用很重要,當你任務寫給用戶端的資料總夠多的時候  
    32.                  //調用之,用戶端方能讀取到。  
    33.                  //否則,在資料長度達到上限或者串連關閉之前,用戶端讀不到資料  
    34.                  pr.flush();  
    35.                  Thread.sleep(500);  
    36.              }  
    37.          } catch(Exception e) {  
    38.              e.printStackTrace();  
    39.          }  
    40.           
    41.     }                 
    42. }  

用 servlet實現http長串連

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.