Websocket 原理

1 > websocket 與httphtml

websocket約定了一種通訊規範,經過一個握手機制,客戶端和服務器之間能創建一個相似tcp的鏈接,從而方便它們的通訊。websocket出現以前,web交互通常是基於http協議的短鏈接或長鏈接。web

 

補充:http是運行在TCP協議傳輸層上的應用協議;websocket是經過http協議協商如何鏈接,而後獨立運行在TCP協議傳輸上的應用協議;websocket僅僅是利用了http協議作鏈接請求;websocket之因此能持久鏈接的緣由:它運行在TCP協議上,TCP協議自身是長鏈接協議。ajax

爲何http不是長鏈接?早期的http在發起每一個請求,響應完成後就會關閉Socket,但後來加了多路複用keepAlive協議後http協議已經能夠實現長鏈接。瀏覽器

 

2> Websocket是什麼協議,具備什麼優勢?服務器

 Websocket 是一個持久化的協議,而http非持久的協議;websocket

http的生命週期經過Request來界定,一個request只能有一個response,且response是被動的,不能主動發起;併發

websocket是基於http協議的,或者說借用了http的協議來完成一部分握手;socket

websocket協議:雙向通訊,協議分爲2部分:握手階段、數據通訊階段;tcp

websocket鏈接服務器的URI以「ws」或「wss」開頭, ws開頭的默認TCP端口爲80,wss開頭的默認端口是443;oop

 

補充:除了websocket 可實現實時信息傳遞,還有:

  1)ajax輪詢:讓瀏覽器隔個幾秒就發送一次請求,詢問服務器是否有新信息

  2)http long poll:long poll 原理跟ajax輪詢差很少,都是採用輪詢的方式,不過採用的是阻塞模型(客戶端發起鏈接後,若是沒消息,就一直不返回Response給客戶端,直到有消息才返回,返回完以後,客戶端再次創建鏈接loop)

總結:ajax輪詢:須要服務器有很快的處理速度和資源;

   long poll :須要有很高的併發,也就是說同時接待客戶的能力;

  不然 上面2者都會報錯:503 Server Unavailable

 

3> websocket 解決了http的難題:

  被動性:當服務器完成協議升級後(http->websocket),服務端就能夠主動推送信息給客戶端

  反覆解析http協議,查看indentity info:websocket只須要一次http握手,因此說整個通信過程創建在一次鏈接/狀態中,也就避免了http的非狀態性,服務端會一直知道你的信息,直到你關閉請求。

 

4>下面的代碼片斷是打開一個鏈接,爲鏈接建立事件監聽器,斷開鏈接,消息時間,發送消息返回到服務器,關閉鏈接。

CODE:
// 建立一個Socket實例
var socket = new WebSocket('ws://localhost:8080'); 

// 打開Socket 
socket.onopen = function(event) { 

  // 發送一個初始化消息
  socket.send('I am the client and I\'m listening!'); 

  // 監聽消息
  socket.onmessage = function(event) { 
    console.log('Client received a message',event); 
  }; 

  // 監聽Socket的關閉
  socket.onclose = function(event) { 
    console.log('Client notified socket has closed',event); 
  }; 

  // 關閉Socket.... 
  //socket.close() 
};

 

 

 https://www.cnblogs.com/netqq/p/5786750.html

相關文章
相關標籤/搜索