日韩精品成人无码专区免费-国产99久久久久久免费看-国产精品丝袜久久久久久不卡-国产精品无码一区二区三区

Go如何使用websocket實現彈幕功能

發布時間:2025-02-16 點擊:50
下面由golang教程欄目給大家go使用websocket實現彈幕功能的方法,希望對需要的朋友有所幫助!
使用websocket協議,客戶端發送一個消息,服務端廣播到所有有效連接中。
主要思路:
1.封裝*websocket.conn,用client結構表示一個客戶端。
2.維持一個map[client]bool,表示有效的客戶端映射,用于廣播消息
3.除了處理websocket連接外,還要開啟一個廣播協程,監聽客戶端連接,斷開,發彈幕事件。
推薦:《go語言教程》
主要的結構:
type client struct{ wsconnect *websocket.conn inchan chan []byte outchan chan []byte closechan chan byte name string //客戶的名稱 id string //客戶id,唯一 mutex sync.mutex // 對closechan關閉上鎖 isclosed bool // 防止closechan被關閉多次}type message struct { eventtype byte `json:"type"` // 0表示用戶發布消息;1表示用戶進入;2表示用戶退出 name string `json:"name"` // 用戶名稱 message string `json:"message"` // 消息內容} clients = make(map [*util.client] bool) // 用戶組映射 join = make(chan *util.client, 10) // 用戶加入通道 leave = make(chan *util.client, 10) // 用戶退出通道 message = make(chan message, 10) // 消息通道server端代碼
package mainimport ( "encoding/json" "fmt" "github.com/gorilla/websocket" "gogin/server/util" "net/http")var( upgrader = websocket.upgrader{ // 允許跨域 checkorigin:func(r *http.request) bool{ return true }, } clients = make(map [*util.client] bool) // 用戶組映射 join = make(chan *util.client, 10) // 用戶加入通道 leave = make(chan *util.client, 10) // 用戶退出通道 message = make(chan message, 10) // 消息通道)type message struct { eventtype byte `json:"type"` // 0表示用戶發布消息;1表示用戶進入;2表示用戶退出 name string `json:"name"` // 用戶名稱 message string `json:"message"` // 消息內容}func wshandler(w http.responsewriter , r *http.request){ var( wsconn *websocket.conn err error client *util.client data []byte ) r.parseform() //返回一個map,并且賦值給r.form name := r.form["name"][0] id := r.form["id"][0] if wsconn , err = upgrader.upgrade(w,r,nil); err != nil{ return } if client , err = util.initconnection(wsconn); err != nil{ goto err } client.id = id client.name = name // 如果用戶列表中沒有該用戶 if !clients[client] { join <- client } for { if data , err = client.readmessage();err != nil{ //一直讀消息,沒有消息就阻塞 goto err } var msg message msg.eventtype = 0 msg.name = client.name msg.message = string(data) message <- msg }err: leave<-client//這個客戶斷開 client.close()}func broadcaster() { for { select { // 消息通道中有消息則執行,否則堵塞 case msg := <-message: // 將數據編碼成json形式,data是[]byte類型 // json.marshal()只會編碼結構體中公開的屬性(即大寫字母開頭的屬性) data, err := json.marshal(msg) if err != nil { return } for client := range clients { if client.isclosed == true { leave<-client//這個客戶斷開 continue } // fmt.println("=======the json message is", string(data)) // 轉換成字符串類型便于查看 if client.writemessage(data) != nil { continue //發送失敗就跳過 } } // 有用戶加入 case client := <-join: clients[client] = true // 將用戶加入映射 // 將用戶加入消息放入消息通道 var msg message msg.name = client.name msg.eventtype = 1 msg.message = fmt.sprintf("%s join in, there are %d preson in room", client.name, len(clients)) message <- msg // 有用戶退出 case client := <-leave: // 如果該用戶已經被刪除 if !clients[client] { break } delete(clients, client) // 將用戶從映射中刪除 // 將用戶退出消息放入消息通道 var msg message msg.name = client.name msg.eventtype = 2 msg.message = fmt.sprintf("%s leave, there are %d preson in room", clien

網站上有個視頻播放為什么地址后面會加上這個呢
cloud域名有價值嗎?cloud域名需要實名制嗎?
學生阿里云服務器多少錢
哪購買騰訊云服務器哪里便宜
如何使用阿里云服務器建設網站
騰訊云服務器需要備案么
這個網站打不開請幫忙看一下什么情況
鏈接無法打開-虛擬主機/數據庫問題