> 文档中心 > golang-gin-websocket问题

golang-gin-websocket问题


接口全览

//聊一聊接口func Handler(c *gin.Context) {fmt.Println("进入函数")//获取发送者uid和被发送者uidtoken := module.WsGetTokenFromHeader(c.Request.Header)fmt.Println(token)stuNum := dao.Redis.Get(token).Val()toStuNum := c.Query("toStuNum")if stuNum == toStuNum {c.JSON(http.StatusOK, gin.H{"status": 203,"msg":    "自己无法与自己建立沟通",})return}//升级websocket协议conn, err := (&websocket.Upgrader{CheckOrigin: func(r *http.Request) bool {return true},//将获取的参数放进这个数组Subprotocols: []string{token},}).Upgrade(c.Writer, c.Request, nil) //升级ws协议if err != nil {http.NotFound(c.Writer, c.Request)return}//创建一个用户实例client := &models.Client{ID:    createID(stuNum, toStuNum), //1->2SendID:createID(toStuNum, stuNum), //2->1FromUsername: stuNum,ToUsername:   toStuNum,Socket:conn,Send:  make(chan []byte),}//用户注册到用户管理上mux.Lock()models.Manager.Register <- clientmux.Unlock()go client.Read()go client.Write()go models.BatchRead(toStuNum, stuNum)}

接口切片

如果前端使用Sec-WebSocket-Protocol字段传递token的话会引发websocket刚连接上就断开的问题
届时需要在Upgrader添加

//将获取的参数放进这个数组Subprotocols: []string{token},

以建立连接

websocket升级

conn, err := (&websocket.Upgrader{CheckOrigin: func(r *http.Request) bool {return true},//将获取的参数放进这个数组Subprotocols: []string{token},}).Upgrade(c.Writer, c.Request, nil) //升级ws协议if err != nil {http.NotFound(c.Writer, c.Request)return}

在这里插入图片描述

开发者涨薪指南 golang-gin-websocket问题 48位大咖的思考法则、工作方式、逻辑体系