项目地址: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信息,服务端重置心跳倒计时。
评论 (0)