国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

推技術聊天室的實現(上)

2019-11-18 11:35:18
字體:
來源:轉載
供稿:網友

  基于推技術的聊天室在國內現在已經比較常見。這種聊天室最大的特點是不使用瀏覽器每格一段時間就刷新的方式,而讓服務器不定時往客戶端寫聊天的內容。當有人發言時,屏幕上才會出現新聊天內容,而且聊天內容是不斷向上滾動的,假如瀏覽器狀態欄在的話,可以看到進度條始終處于下載頁面狀態。即使這種聊天室容納上百人,性能不會明顯的降低。而以往的CGI或活動服務器端腳本做的聊天室性能明顯就不行了。

  推技術的聊天室聊天室基本原理是,不使用HTTPD服務器程序,由自己的Socket程序監聽服務器的80端口,根據Html規范,在接收到瀏覽器的請求以后,模擬www服務器的響應,將聊天內容發回瀏覽器。在瀏覽器看來就象瀏覽一個巨大的頁面一樣始終處于頁面接收狀態。也就是說,我們不再使用CGI等方式來處理聊天的內容,而采用我們自己的程序來處理所有的事務。實際上它就是一個專門的聊天服務器,即一個簡化了的專門用于聊天的WWW服務器。

  在具體討論程序的實現之前,我們先來解析一下相關的技術。

◆http請求和應答過程

  http協議是瀏覽器與WWW服務器之間通信的標準,Socket聊天服務器應當遵守這個協議。實際上,我們只需要使用其中的一小部分就可以了。

  http使用了C/S(客戶/服務器)模式,其中瀏覽器是http客戶,瀏覽某個頁面實際上就是打開一個Socket連接,發送一個請求到WWW服務器,服務器根據所請求的資源發送應答給瀏覽器,然后關閉連接。客戶和服務器之間的請求和應答有一定的格式要求,只要按照這個格式接收請求發送應答,瀏覽器就會正常的顯示你所需要的的內容。

  請求和應答具有類似的結構,包括:

  · 一個初始行

  · 0個或多個header lines

  · 一個空行

  · 可選的信息

  我們看看一個瀏覽器發出的請求:

  當我們瀏覽網頁http://www.somehost.com/path/file.html的時候,瀏覽器首先打開一個到主機www.somehost.com的80端口的socket,然后發送以下請求:

  GET /path/file.html HTTP/1.0

  From: someuser@somehost.com

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

  [空行]

  第一行GET /path/file.html HTTP/1.0是我們需要處理的核心。由以空格分隔的三部分組成,方法(method):GET,請求資源:/path/file.html,http版本:HTTP/1.0。

  服務器將會通過同一個socket用以下信息回應:

  HTTP/1.0 200 OK

  Date: Fri, 31 Dec 1999 23:59:59 GMT

  Content-Type: text/html

  Content-Length: 1354

 ?。糷tml>
  <body>
 ?。糷1>Hello world!</h1>
(其他內容)...
 ?。?body>
  </html>

  第一行同樣也包括三部分:http版本,狀態碼,與狀態碼相關的描述。狀態碼200表示請求成功。
  發送完應答信息以后,服務器就會關閉socket。
◆服務器模型

  一般網絡服務器主要分為兩種:

 ?。?)循環服務器(iterative server):它是一個時刻只能處理一個請求的服務器,多個請求同時到來將會放在請求隊列里。TCP套接字服務器一般很少采用循環方式,因為假如某個客戶和服務器的連接出了問題,會導致整個服務器掛掉。它常為UDP套接字服務器所采用。

  (2)并發服務器(concurrent server):在每個請求到來以后分別產生一個新進程來處理這個請求所產生的連接。TCP的Socket服務器大多采用并發方式提供服務。

  并發服務器有多種實現方法:

  i 服務器和每個接收到的客戶機進行連接,創建一個新的子進程處理這個客戶機請求。

  ii 服務器預先創建多個子進程,由這個子進程處理客戶機請求。這種方式被稱為“預創建(PRefork)”服務器。

  iii 服務器用函數select實現對多個客戶機連接的多路復用。

  iv 超級服務器(inet)激活的服務器。

  并發服務器由于其算法而具有與生俱來的快速響應優勢,而且當某一個用戶與服務器通信死鎖不會影響其他進程,但由于多個進程之間需要通過進程間通信實現信息交換,而且fork新進程所帶來的開銷隨著用戶數量的增加越來越大,因此原始的并發服務器并不一定是最好的選擇。java語言給我們帶來的方便的線程機制,使我們可以用多線程來代替多進程,實現并發服務器,為我們進行快速的商業版本的聊天室的開發提供了優勢。

  值得注重的是,在linux下,JAVA并沒有實現真正的多線程,本質上仍然是多進程。

  ◆POST與GET

  提交form表單信息一般常用的有兩種:POST或者GET。POST由于長度不受限制,而作為大多數form提交時使用的方法。GET方法通過URL來發送提交信息,由于URL被WWW服務器限制了長度,一般最長只能為1024字節,所以假如發送信息很長的話,就不能使用這種方法。
  由于我們對聊天內容有長度限制,不會太長,而且普通瀏覽頁面使用GET方法,使用GET方法提交form表單可以簡化處理過程,所以我們可以使用這種方法來提交聊天內容。

  我們感到美中不足的是GET方法將提交的內容簡單的附在連接后邊,我們假如能夠將提交的內容進行HTML編碼的話,就可以讓客戶舒適點了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 墨江| 宽甸| 富阳市| 北宁市| 武穴市| 临泉县| 罗平县| 平湖市| 德安县| 麻栗坡县| 乡宁县| 七台河市| 陈巴尔虎旗| 双流县| 紫金县| 十堰市| 千阳县| 南宁市| 太仆寺旗| 光山县| 湟中县| 宝丰县| 兴安盟| 嵊州市| 名山县| 耿马| 多伦县| 乌拉特中旗| 邓州市| 浦东新区| 磐安县| 陇川县| 西乌珠穆沁旗| 龙州县| 滨海县| 冕宁县| 措美县| 阿克| 万源市| 新蔡县| 长宁区|