欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語言實(shí)現(xiàn)websocket推送程序

 更新時(shí)間:2023年05月18日 17:30:41   作者:永遠(yuǎn)的麥田  
這篇文章主要介紹了Go語言實(shí)現(xiàn)websocket推送程序,WebSocket是基于TCP的一個(gè)雙向傳輸數(shù)據(jù)的協(xié)議,和HTTP協(xié)議一樣,是在應(yīng)用層的,他的出現(xiàn),是為了解決網(wǎng)頁(yè)進(jìn)行持久雙向傳輸數(shù)據(jù)的問題

最近要在一個(gè)go實(shí)現(xiàn)的K線服務(wù)器上追加一個(gè)websocket推送功能。

初步設(shè)想是在各品種每分鐘的數(shù)據(jù)完成后立即向各訂閱單位推送對(duì)應(yīng)的K線數(shù)據(jù)。

一、場(chǎng)景抽象

1用戶連接上服務(wù)器

2用戶訂閱某品種的某周期

3用戶退訂某品種某周期

4用戶斷開服務(wù)器

訂閱:

推送:

二、程序框架

由于go語言不熟,幸好網(wǎng)上有人做了成熟的框架:GitHub - gorilla/websocket: A fast, well-tested and widely used WebSocket implementation for Go.這個(gè)解決了怎樣使用websocket的問題

三、主要業(yè)務(wù)邏輯

每個(gè)連接開兩個(gè)線程

一個(gè)線程進(jìn)行數(shù)據(jù)寫入writePump,一個(gè)線程進(jìn)行數(shù)據(jù)讀取readPump,每當(dāng)有客戶端連接上服務(wù)器后,立即開啟這兩個(gè)線程。

讀線程邏輯圖:

寫線程邏輯圖:

程序啟動(dòng)時(shí)開一個(gè)總控線程func (h *Hub) Run()

此線程用來處理客戶端的連接,斷開,訂閱和向訂閱信息的客戶端作相應(yīng)信息的廣播。

邏輯圖如下:

處理注冊(cè)

處理注冊(cè)的邏輯非常簡(jiǎn)單,只是將客戶端的指針放置于指針map中即可,代碼如下:

// 注冊(cè),客戶端連接上來的處理邏輯
func (h *Hub) registerMsg(client *Client) {
	h.clients[client] = true
}

處理注銷

注銷需要分兩步走,首先把客戶端指針集合中的對(duì)應(yīng)指針刪除,同時(shí)刪除對(duì)應(yīng)的發(fā)送通道。然后遍歷內(nèi)容訂閱集合,刪除對(duì)應(yīng)的客戶端指針的元素,最后,若發(fā)現(xiàn)某訂閱內(nèi)容上已經(jīng)沒有任何客戶端指針,將其訂閱內(nèi)容一并刪除。

程序邏輯如下:

訂閱處理

訂閱最主要的是訂閱關(guān)系,我們可以用合約.周期作為key,使用客戶端連接上來的指針集作為value,每當(dāng)有用戶訂閱某內(nèi)容時(shí),將相應(yīng)內(nèi)容下面的指針集上加上對(duì)應(yīng)此用戶的指針即可,訂閱關(guān)系如下:

推送處理

推送處理分兩種類型,一種為用戶訂閱的數(shù)據(jù)推送給到他們,一種為心跳包推送給到30秒內(nèi)沒有數(shù)據(jù)推送或訂閱動(dòng)作的用戶。

推送訂閱的內(nèi)容:當(dāng)用戶訂閱的類型數(shù)據(jù)到達(dá)時(shí),系統(tǒng)檢查此訂閱上的用戶指針,將數(shù)據(jù)推送到對(duì)應(yīng)指針的通道中,由各通道自行推送給各自的客戶端。

推送心跳包:當(dāng)某個(gè)連接上來的客戶端30秒內(nèi)沒有訂閱請(qǐng)求或是推送數(shù)據(jù),系統(tǒng)將自動(dòng)推送心跳包,以維持連接不被斷開。

到此這篇關(guān)于Go語言實(shí)現(xiàn)websocket推送程序的文章就介紹到這了,更多相關(guān)Go websocket內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang使用CGO與Plugin技術(shù)運(yùn)行加載C動(dòng)態(tài)庫(kù)

    Golang使用CGO與Plugin技術(shù)運(yùn)行加載C動(dòng)態(tài)庫(kù)

    這篇文章主要介紹了Golang使用CGO與Plugin技術(shù)運(yùn)行加載C動(dòng)態(tài)庫(kù),Golang?程序在運(yùn)行時(shí)加載C動(dòng)態(tài)庫(kù)的技術(shù),跳過了Golang項(xiàng)目編譯階段需要鏈接C動(dòng)態(tài)庫(kù)的過程,提高了Golang項(xiàng)目開發(fā)部署的靈活性
    2022-07-07
  • golang?手寫貪吃蛇示例實(shí)現(xiàn)

    golang?手寫貪吃蛇示例實(shí)現(xiàn)

    這篇文章主要為大家介紹了golang?手寫貪吃蛇示例實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 詳解如何使用beego orm在postgres中存儲(chǔ)圖片

    詳解如何使用beego orm在postgres中存儲(chǔ)圖片

    這篇文章主要為大家介紹了如何使用beego orm在postgres中存儲(chǔ)圖片詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • golang 實(shí)現(xiàn)interface{}轉(zhuǎn)其他類型操作

    golang 實(shí)現(xiàn)interface{}轉(zhuǎn)其他類型操作

    這篇文章主要介紹了golang 實(shí)現(xiàn)interface{}轉(zhuǎn)其他類型操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go語言中的原子操作使用詳解

    Go語言中的原子操作使用詳解

    這篇文章主要介紹了Go語言中的原子操作使用詳解的相關(guān)資料,需要的朋友可以參考下
    2023-08-08
  • Go channel發(fā)送方和接收方如何相互阻塞等待源碼解讀

    Go channel發(fā)送方和接收方如何相互阻塞等待源碼解讀

    這篇文章主要為大家介紹了Go channel發(fā)送方和接收方如何相互阻塞等待源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 通過案例簡(jiǎn)單聊聊為什么說Go中的字符串是不能被修改的

    通過案例簡(jiǎn)單聊聊為什么說Go中的字符串是不能被修改的

    在接觸Go這么語言,可能你經(jīng)常會(huì)聽到這樣一句話,對(duì)于字符串不能修改,可能你很納悶,日常開發(fā)中我們對(duì)字符串進(jìn)行修改也是很正常的,為什么又說Go中的字符串不能進(jìn)行修改呢,本文就來通過實(shí)際案例給大家演示,為什么Go中的字符串不能進(jìn)行修改
    2023-07-07
  • golang 項(xiàng)目打包部署環(huán)境變量設(shè)置方法

    golang 項(xiàng)目打包部署環(huán)境變量設(shè)置方法

    最近將 golang 項(xiàng)目打包部署在不同環(huán)境,下面分享一下我的心得體會(huì),對(duì)golang 項(xiàng)目打包部署環(huán)境變量設(shè)置方法感興趣的朋友一起看看吧
    2024-07-07
  • Windows下使用go語言寫程序安裝配置實(shí)例

    Windows下使用go語言寫程序安裝配置實(shí)例

    這篇文章主要介紹了Windows下使用go語言寫程序安裝配置實(shí)例,本文講解了安裝go語言、寫go代碼、生成可執(zhí)行文件、批量生成可執(zhí)行文件等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • 一文詳解go同步協(xié)程的必備工具WaitGroup

    一文詳解go同步協(xié)程的必備工具WaitGroup

    這篇文章主要為大家介紹了一文詳解go同步協(xié)程的必備工具WaitGroup使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03

最新評(píng)論