前言
websocket是HTML5才出現的通訊協議,與HTTP協議不同,只是為了兼容現有瀏覽器的握手規範,也就是說它是HTTP協議上的一種補充。
![真簡單:史上最小websocket協議Demo,看一遍就記住了!](http://p2.ttnews.xyz/loading.gif)
HTTP
HTTP1.0,很簡單,握手通過,一個request,一個response,結束。
HTTP2.0,握手通過,使用keep-alive,可以多個request,有多個response。
本質都是一樣的,請求 = 響應,一一對應。
有同學不禁要問,我用 http long poll,或者 ajax 輪詢,不是一樣的嗎?還要什麼websocket?
Ajax輪詢
一般就是定時發起請求,不管什麼狀況,間隔時間就發起request。好比下面的對話:
Ajax:飯好了嗎?
Srv:沒有;
Ajax:飯好了嗎?
Srv:沒有;
Ajax:飯好了嗎?
Srv:好了;
Ajax:飯好了嗎?
Srv:好了;
Ajax:飯好了嗎?
Srv:好了,問了八百遍了,好了;
Long poll
跟ajax輪詢差不多,不過這個是阻塞型,拿不到response不停。好比下面的對話:
Poll:飯好了嗎?
Srv:沒有……(洗菜,切菜,點火,炒菜,翻鍋)……好了,拿去。
Poll:好開心,飯好了。
websocket
講了兩個HTTP,終於輪到websocket了。
相對於HTTP的被動式響應,websocket可以給客戶端推送消息。好比下面的對話:
WS:我要建websocket連接,需要服務:food,websocket協議 17 (HTTP Request)。
Srv:OK,確認升級為websocket協議。
WS:飯好了告訴我一聲。
Srv:米飯好了。
Srv:菜好了。
Srv:碗筷好了。
Srv:可以吃了了。
Srv:巴拉巴拉巴拉。
大家看到了吧,這種協議的好處就是,資源利用率提高了,服務端可以按需推送消息了,不必等客戶端請求才發送。
Go語言寫一個demo
我們寫一個最小,最簡單的demo,演示一個提供websocket服務的服務器。
代碼如下:
<code>// main.go
package main
import (
\t"io"
\t"net/http"
\t"golang.org/x/net/websocket"
)
func resp(ws *websocket.Conn) {
\tio.Copy(ws, ws)
}
func main() {
\thttp.Handle("/echo", websocket.Handler(resp))
\thttp.Handle("/", http.FileServer(http.Dir(".")))
\terr := http.ListenAndServe(":8090", nil)
\tif err != nil {
\t\tpanic("ListenAndServe: " + err.Error())
\t}
}
/<code>
這就是服務器端全部的代碼,是不是超級簡單?
不用編譯,直接在命令行運行
<code>go run main.go/<code>
那麼就有一個websocket服務器監聽在 8090 端口了。
websocket客戶端
有了服務器,我們再準備一個客戶端頁面,測試一下連接情況。
使用jquery把收到的信息動態展示在頁面上。在console控制檯打印接收和發送的數據。
<code>
\t
\t\t
\t\t<title>Sample of websocket with golang/<title>
\t\t
\t\t
\t
\t
\t\t\t
\t\t\t
\t
/<code>
結合起來
本地瀏覽器打開index.html文件,併發送一些測試數據如下圖。
![真簡單:史上最小websocket協議Demo,看一遍就記住了!](http://p2.ttnews.xyz/loading.gif)
使用按鈕發送輸入框內容,服務器接到後,原封不動返回。
js使用WebSocket建立通信,並在控制檯打印收到的內容。
結語
相信通過Ajax,Long Poll,和websocket的對比,大家對websocket的作用原理,和使用方法,會有一個較為清晰的理解了。
Happy coding :-)
【本文由 發佈,持續分享編程故事,歡迎關注】
閱讀更多 程序員小助手 的文章