真簡單:史上最小websocket協議Demo,看一遍就記住了!

前言

websocket是HTML5才出現的通訊協議,與HTTP協議不同,只是為了兼容現有瀏覽器的握手規範,也就是說它是HTTP協議上的一種補充。


真簡單:史上最小websocket協議Demo,看一遍就記住了!


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,看一遍就記住了!

使用按鈕發送輸入框內容,服務器接到後,原封不動返回。

js使用WebSocket建立通信,並在控制檯打印收到的內容。


結語

相信通過Ajax,Long Poll,和websocket的對比,大家對websocket的作用原理,和使用方法,會有一個較為清晰的理解了。

Happy coding :-)


【本文由 發佈,持續分享編程故事,歡迎關注】


分享到:


相關文章: