Golang——WebSocket

拉模式與推送模式

拉模式的缺點 數(shù)據(jù)更新頻率低,則大多數(shù)的請求是無效的
在線用戶數(shù)量多脐彩,則服務端的查詢負載高碎乃。
定時查詢拉取,無法滿足時效性要求
推送模式 盡在數(shù)據(jù)更新才推送惠奸,需要維護大量的在線長連接梅誓,數(shù)據(jù)更新后立即推送。

WebSocket推送

瀏覽器支持的socket編程佛南,輕松維護服務端長連接梗掰,基于TCP可靠傳輸之上的協(xié)議,無需開發(fā)者關心通訊細節(jié)嗅回。提供了高度抽象的編程接口及穗,業(yè)務開發(fā)成本低。

websocket協(xié)議

來源于慕課網(wǎng)

協(xié)議升級后妈拌,繼續(xù)復用HTTP的底層socket完成后續(xù)操作
message底層被切分成多個frame 幀傳輸拥坛。
編程是只需要操作message不需要關心frame
框架底層完成TCP網(wǎng)絡I/O,WebSocker協(xié)議解析蓬蝶,開發(fā)者不需要關心尘分。

package main

import "net/http"

func wsHandle(writer http.ResponseWriter, request *http.Request) {
      writer.Write([]byte("hello world"))
}

func main() {
    http.HandleFunc("/ws", wsHandle)
    http.ListenAndServe(":8888",nil)
    
}

服務請求參數(shù)

Request URL: http://localhost:8888/ws
Request Method: GET
Status Code: 200 OK
Remote Address: [::1]:8888

websocket的服務器端代碼

package main

import (
    "fmt"
    "github.com/gorilla/websocket"
    "net/http"
    "time"
)

func wsHandle(writer http.ResponseWriter, request *http.Request) {
    upgrader:= websocket.Upgrader{CheckOrigin: func(r *http.Request) bool {
          return true
      }}
    con,err := upgrader.Upgrade(writer,request,nil)
    defer con.Close()
    if err!=nil {
        writer.Write([]byte(err.Error()))
    }
    for{
        _, p, err := con.ReadMessage()
        if err!= nil {
            writer.Write([]byte(err.Error()))
            break
        }
        fmt.Println("client message "+string(p))
        con.WriteMessage(websocket.TextMessage,[]byte(time.Now().String()))
    }
}

func main() {
    http.HandleFunc("/ws", wsHandle)
    http.ListenAndServe(":8888",nil)
    
}
image.png

websocket 客戶端代碼

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script>
        window.addEventListener("load", function(evt) {
            var output = document.getElementById("output");
            var input = document.getElementById("input");
            var ws;
            var print = function(message) {
                var d = document.createElement("div");
                d.innerHTML = message;
                output.appendChild(d);
            };
            document.getElementById("open").onclick = function(evt) {
                if (ws) {
                    return false;
                }
                ws = new WebSocket("ws://localhost:8888/ws");
                ws.onopen = function(evt) {
                    print("連接websocket");
                }
                ws.onclose = function(evt) {
                    print("CLOSE");
                    ws = null;
                }
                ws.onmessage = function(evt) {
                    print("收到消息: " + evt.data);
                }
                ws.onerror = function(evt) {
                    print("ERROR: " + evt.data);
                }
                return false;
            };
            document.getElementById("send").onclick = function(evt) {
                if (!ws) {
                    return false;
                }
                print("發(fā)送消息: " + input.value);
                ws.send(input.value);
                return false;
            };
            document.getElementById("close").onclick = function(evt) {
                if (!ws) {
                    return false;
                }
                ws.close();
                return false;
            };
        });
    </script>
</head>
<body>
<table>
    <tr><td valign="top" width="50%">
            <p>點擊啟動按鈕創(chuàng)建websocket連接<br/>
               點擊發(fā)送按鈕可以發(fā)送任意消息給服務器<br/>
               點擊關閉按鈕斷開websocket連接
            </p>
            <form>
                <button id="open">啟動</button>
                <button id="close">關閉</button>
                <input id="input" type="text" value="Hello golang!">
                <button id="send">發(fā)送</button>
            </form>
        </td><td valign="top" width="50%">
            <div id="output"></div>
        </td></tr></table>
</body>
</html>

運行client.html,效果如下



數(shù)據(jù)抓包


image.png
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末猜惋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子培愁,更是在濱河造成了極大的恐慌著摔,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件定续,死亡現(xiàn)場離奇詭異谍咆,居然都是意外死亡,警方通過查閱死者的電腦和手機私股,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門摹察,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人倡鲸,你說我怎么就攤上這事供嚎。” “怎么了峭状?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵克滴,是天一觀的道長。 經(jīng)常有香客問我优床,道長劝赔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任胆敞,我火速辦了婚禮着帽,結果婚禮上,老公的妹妹穿的比我還像新娘移层。我一直安慰自己启摄,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布幽钢。 她就那樣靜靜地躺著歉备,像睡著了一般。 火紅的嫁衣襯著肌膚如雪匪燕。 梳的紋絲不亂的頭發(fā)上蕾羊,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音帽驯,去河邊找鬼龟再。 笑死,一個胖子當著我的面吹牛尼变,可吹牛的內(nèi)容都是我干的利凑。 我是一名探鬼主播浆劲,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼哀澈!你這毒婦竟也來了牌借?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤割按,失蹤者是張志新(化名)和其女友劉穎膨报,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體适荣,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡现柠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了弛矛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片够吩。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖丈氓,靈堂內(nèi)的尸體忽然破棺而出周循,到底是詐尸還是另有隱情,我是刑警寧澤扒寄,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布鱼鼓,位于F島的核電站,受9級特大地震影響该编,放射性物質發(fā)生泄漏迄本。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一课竣、第九天 我趴在偏房一處隱蔽的房頂上張望嘉赎。 院中可真熱鬧,春花似錦于樟、人聲如沸公条。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽靶橱。三九已至,卻和暖如春路捧,著一層夾襖步出監(jiān)牢的瞬間关霸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工杰扫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留队寇,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓章姓,卻偏偏與公主長得像佳遣,于是被迫代替她去往敵國和親识埋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • (非轉載) "我就三千工資零渐,還要養(yǎng)活全家人窒舟,承受不起這制氧機的價錢" 這是今天遇到的一個客人,母親三高相恃,打算給他母...
    無所謂姑涼閱讀 254評論 0 0
  • 我是六扇帽扇辜纲,錯號笨觅,留三毛三 我是一個男生拦耐,可是我愛畫畫,除了美術課我什么課都不喜歡见剩, 我有一個愛嘮叨的媽媽杀糯,...
    瘋狂寫作閱讀 194評論 0 0
  • 小豆豆終于見到了校長先生,而且校長先生主動要求和小豆豆談話苍苞。即使小豆豆的說話的順序固翰、說話的方式,都有些亂七八糟...
    成長的路上有您結伴而行閱讀 204評論 0 0
  • 閱讀書目:《周一清晨的領導課》 閱讀時長:2小時左右 閱讀收獲:今天去醫(yī)院做糖篩順便看了這本書的第一章羹呵,和老公順便...
    小夢化蝶閱讀 201評論 0 0
  • 更喜歡的一方能有多卑微呢 真的太可憐了
    阿月的小蝴蝶閱讀 101評論 0 0