大佬教程收集整理的这篇文章主要介绍了golang websocket,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
项目名称:websocketa
1. server.go
package main import ( "github.com/gin-gonic/gin" "websocketa/middleware" "websocketa/controllers" ) func main() { route := gin.Default() route.Use(middleware.WsMiddlewarE) route.GET("ws",controllers.Wstest) route.Run("0.0.0.0:5000") }@H_404_4@
2. 处理函数:controllers/controller.go
package controllers import ( "fmt" "github.com/gin-gonic/gin" "github.com/gorilla/websocket" "github.com/json-iterator/go" "sync" "time" "reflect" "log" ) type dataClient struct { Conn *websocket.Conn reciveParam []String exitChan chan struct{} } func (wc *dataClient) Close() { wc.Conn.Close() } func (wc *dataClient) StartAndWait() { wc.exitChan = make(chan struct{}) defer close(wc.exitChan) var wg sync.WaitGroup wg.Add(2) go func() { defer wg.Done() wc.listen() }() go func() { defer wg.Done() wc.write() }() wg.Wait() } func (wc *dataClient) write() { ticker := time.NewTicker(time.Second * 5) defer ticker.Stop() for { SELEct { case <-wc.exitChan: return default: wc.send() <-ticker.C } } } func (wc *dataClient) listen() { for { _,msg,err := wc.Conn.Readmessage() if err != nil { wc.exitChan <- struct{}{} return } param := String(msg) fmt.Println(reflect.TypeOf(param),param) err = jsoniter.Unmarshal(msg,wc.reciveParam) log.Println(err) //wc.send() // 可以单独发一次消息 } } func (wc *dataClient) send() { var result String if len(wc.reciveParam) == 0{ // 逻辑 result = "reciveParam is empty" }else { // 拿到客户端发过来的参数,逻辑操作 result = fmt.Sprintf("reciveParam is %v",wc.reciveParam) } returnBytes,_ := jsoniter.Marshal(result) fmt.Println(String(returnBytes)) wc.Conn.Writemessage(websocket.Textmessage,returnBytes) } func Wstest(ctx *gin.Context) { cli := dataClient{ Conn: ctx.MustGet("websocketConnection").(*websocket.Conn),exitChan:make(chan struct{}),} defer cli.Close() cli.StartAndWait() fmt.Println(44) }@H_404_4@
3. 中间件:middlewares/middleware.go
package middleware import ( "github.com/gin-gonic/gin" "github.com/gorilla/websocket" "net/http" "time" ) var wsUpgrade = websocket.Upgrader{ ReadBufferSize: 1024,WriteBufferSize: 1024,HandshakeTimeout: 5 * time.Second,checkOrigin: func(r *http.request) bool { return true },EnableCompression: true,} // websocket中间件 func WsMiddleware(ctx *gin.Context) { conn,err := wsUpgrade.Upgrade(ctx.Writer,ctx.request,nil) if err != nil { ctx.AbortWithStatusJSON(400,gin.H{}) } else { ctx.Set("websocketConnection",conn) ctx.Next() } }@H_404_4@
4. 测试:wsTest.html
<!DOCTYPE html> <html lang="en"> <head> <Meta charset="UTF-8"> <title>title</title> </head> <body> </body> <script type="text/javascript"> let websocket = new WebSocket("ws://localhost:5000/ws"); websocket.onmessage = function (E) { console.log(e.data); } // websocket.onopen = function () { // websocket.send(JSON.Stringify([ // "hahaha", // ])); // websocket.send(JSON.Stringify([ // "item1", // "item2", // ])); // } </script> </html>@H_404_4@ @H_404_4@
以上是大佬教程为你收集整理的golang websocket全部内容,希望文章能够帮你解决golang websocket所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。