标签搜索

go-gin-chat项目学习

lishengxie
2023-01-24 / 0 评论 / 18 阅读 / 正在检测是否收录...

项目地址:https://github.com/hezhizheng/go-gin-chat

Gin框架学习

参考笔记

Websocket学习

Websocket连接是升级的HTTP连接,在连接被客户端或服务器终止之前一直存在,基于Websocket可以实现客户端和服务端之间的双工通信,而不需要对HTTP端口进行持续轮询,大大节省了网络资源开销。

go-gin-chat中基于gorilla/websocket实现websocket的使用,下面是该软件包使用的示例,可以参考博客

// We'll need to define an Upgrader
// this will require a Read and Write buffer size
var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
}

func wsEndpoint(w http.ResponseWriter, r *http.Request) {
    upgrader.CheckOrigin = func(r *http.Request) bool { return true }

    // upgrade this connection to a WebSocket connection
    ws, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println(err)
    }

    // 向连接的客户端写入信息
    log.Println("Client Connected")
    err = ws.WriteMessage(1, []byte("Hi Client!"))
    if err != nil {
        log.Println(err)
    }

    // listen indefinitely for new messages coming
    // through on our WebSocket connection
    go reader(ws)
}

// define a reader which will listen for
// new messages being sent to our WebSocket
// endpoint
func reader(conn *websocket.Conn) {
    for {
    // read in a message
        messageType, p, err := conn.ReadMessage()
        if err != nil {
            log.Println(err)
            return
        }
    // print out that message for clarity
        fmt.Println(string(p))
        if err := conn.WriteMessage(messageType, p); err != nil {
            log.Println(err)
            return
        }
    }
}

Websocket心跳检测

参考博客 https://www.cnblogs.com/tugenhua0707/p/8648044.html

在使用websocket的过程中,如果网络断开而服务器没有触发onclose事件,那么服务器会继续向客户端发送数据,这些数据将被丢失。需要心跳机制来检测客户端和服务端之间是否处于正常的链接状态。

心跳机制的大致实现方式为:每隔一段时间客户端向服务器发送一个数据包,通知服务器自己还活着,如果链接还存在服务器会发送一个数据包给客户端,客户端确认服务端也活着,否则的话可能是链接已经断开,需要重新链接。发送顺序也可以反过来由服务器向客户端发送ping信息,由客户端反馈pong信息。

go-gin-chat中使用了https://github.com/zimv/websocket-heartbeat-js中提供的心跳检测方法,由服务段发送ping信息("heartbeat"),客户端接收到这个ping信息后返回一个pong信息,服务端重置心跳倒计时。

postman使用

进入postman网站注册用户并下载客户端,这里是使用postman进行POST请求提交json格式文件的示例

0

评论 (0)

取消