Skip to content

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

@yaogengzhu

Description

@yaogengzhu

第一步:路由注册

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions