PHP之即時通信


出自  http://www.52im.net   (了解即時通信的好地方)

 

socket,websocket 解釋

在網絡中的兩個應用程序(進程)需要雙全工相互通信(雙全工即雙方可同時向對方發消息),需要用到的就是socket,它能夠提供端對端通信,對於程序員來講,他只需要在某個應用程序的一端(暫且稱之為客戶端)創建一個socket實例並且提供它所需要連接的一端(暫且稱之為服務端)的ip地址和端口,而另一端(服務端)創建另一個socket並綁定本地端口進行監聽 ,然后客戶端進行連接服務端,服務端接受連接后雙方建立了一個端對端的tcp連接,在該連接上就可以雙向通訊了,而且一旦建立這個連接之后,通信雙發就沒有客戶端服務端之分,提供的就是端對端通信了。我們可以采取這種方式構建一個桌面版的im程序,讓不同主機上的用戶發送消息。從本質上來說,socket並不是一個新的協議,它只是為了便於程序員進行網絡編程而對tcp/ip協議族通信機制的一種封裝。

websocket 是html5規范中的一個部分,它借鑒了socket這種思想,為web應用程序客戶端和服務端之間提供了一種全雙工通信機制   同時,他又是一種新的應用層協議,websocket協議是為了提供web應用程序和服務端全雙工通信而專門制定的一種應用層協議,通常它表示為:ws://url:端口 

 

websocket的通信原理和機制

websocket基於瀏覽器端的web技術,那么它也不能脫離http。我們在客戶端構建一個websocket實例,並且為它綁定一個需要連接的服務器地址,當客戶端連接服務端的時候,會向服務端發送一個

報文

這是一個http get請求,在報文中有一個upgrade首部,他的作用是高速服務器需要將通信協議切換到websocket,如果服務端支持websocket協議,那么它就將自己的通信協議切換到websocket,同時發個客戶端類似於以下的一個響應報文頭

返回狀態碼為101  表示同意客戶端協議轉換請求,並將他轉換為websocket協議。以上過程都是利用http通信完成的,稱之為websocket協議握手(websocket Protocol handshake),進行過這次握手之后,客戶端和服務端就建立了websocket連接,以后的通信都是websocket協議。

所以websocket握手需要借助http協議,建立連接后通信過程使用websocket協議 。

websocket提供兩種數據傳輸:文本數據和二進制數據。

WebSocket技術出現之前,web端實現即時通訊的方法有哪些?

1.定期輪詢的方式

  客戶端按照某個時間間隔不斷的向服務端發送請求,請求服務端的最新數據然后更新客戶端顯示。這種方式實際上浪費了大量流量並且對服務端造成了很大壓力

2.sse(server-sent event) 服務端推送事件

  sse是一種允許服務端向客戶端推送數據的html5技術。與由於客戶端每隔幾秒從服務端輪詢拉取新數據相比,這是一種更優的解決方案

3comet技術

  comet是在客戶端請求服務端這個模式上的一種hack技術,通常來講,它主要分為兩種做法

  (1) 基於長輪詢的服務端推送技術

    就是客戶端首先給服務端發送一個請求,服務端收到該請求之后如果沒有數據更新則並不立即返回,即服務端阻塞請求的返回,直到數據發生了更新或者發生了連接超時,服務端返回數據之后客戶端再次發送同樣的請求   

    

 

   (2) 基於流式數據傳輸的長連接

    通常的做法是在頁面中嵌入一個隱藏的iframe然后讓這個iframe的src屬性指向我們請求的一個服務端地址,並且為了數據更新,我們將頁面上數據更新操作封裝為一個js函數,將函數名當做參數傳遞到這個地址當中。 服務端收到請求后解析地址取出參數(客戶端js函數調用名),每當有數據更新的時候,返回客戶端函數的調用,並且將要更新的數據以js函數的參數填入到返回內容中,

例如返回“<script type="text/javascript">update("data")</script>”這樣一個字符串,意味着以data為參數調用客戶端update函數進行客戶端view更新

     

    comet技術是針對客戶端請求服務器響應模型而模擬出的一個服務端推送數據實時更新技術。(由於瀏覽器兼容性不能夠廣泛應用)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM