加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

golang websocket

发布时间:2020-12-16 09:32:52 所属栏目:大数据 来源:网络整理
导读:项目名称:websocketa 1. server.go package mainimport ( " github.com/gin-gonic/gin " " websocketa/middleware " " websocketa/controllers " )func main() { route : = gin.Default() route.Use(middleware.WsMiddleware) route.GET( " ws " ,controlle

项目名称: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")
}

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)
}

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()
    }
}

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>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读