code-magic-record / ginchat

GO
https://chat.yaogeng.top
1 stars 0 forks source link

实现一个简单的websocket 的连接 #4

Open yaogengzhu opened 11 months ago

yaogengzhu commented 11 months ago

第一步:路由注册

package ws

import (
    "ginchat/service"

    "github.com/gin-gonic/gin"
)

func WsRouter() *gin.Engine {
    r := gin.New()
    v1 := r.Group("/v1/ws")

    v1.GET("/connect", service.HandlerWs)
    return r
}

第二步实现路由方法

package service

import (
    "fmt"
    "log"
    "net/http"

    "github.com/gin-gonic/gin"
    "github.com/gorilla/websocket"
)

var upgrade = websocket.Upgrader{
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}

func HandlerWs(c *gin.Context) {
    // 升级成websocket协议
    ws, err := upgrade.Upgrade(c.Writer, c.Request, nil)
    if err != nil {
        log.Fatalln(err, "err")
    }
    fmt.Println("ws connect success")
    // 完成时关闭连接释放资源
    defer ws.Close()

    go func() {
        // 监听连接“完成”事件,其实也可以说丢失事件
        <-c.Done()
        fmt.Println("ws lost connection")
    }()

    for {
        // 读取客户端发送过来的消息,如果没发就会一直阻塞住
        mt, message, err := ws.ReadMessage()

        if err != nil {
            fmt.Println("read error")
            fmt.Println(err)
            break
        }
        if string(message) == "ping" {
            message = []byte("恭喜您连接成功,您可以发送消息了")
        }
        // 将读取到的消息写回客户端,这里是原封不动的写回去
        fmt.Print("receive message: ", mt, "\n")
        err = ws.WriteMessage(mt, message)
        if err != nil {
            fmt.Println(err)
            break
        }

    }
}

参考文章: https://juejin.cn/post/7103737973782511646

yaogengzhu commented 10 months ago

ngnix 部署时处理

  location /v1/ws/connect {
      proxy_pass http://xxxx:8888/v1/ws/connect;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "Upgrade";
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
  }