【websocket】怎么终止websocket断开重连

介绍

代码是用go语言实现的。go语言实现websocket,常用第三方库github.com/gorilla/websocket。

不过只要明白了思路,不管哪个语言实现起来都是一样的。

问题

在生产环境,websocket客户端一般都会实现断开重连的逻辑,如果直接通过Conn.Close()函数关闭连接会触发重连。

怎么终止websocket重连呢?

解决方式

这是一段websocket客户端的实现代码,实现了终止重连的功能。

Go 复制代码
package test

import (
	"fmt"
	"testing"
	"time"

	"github.com/gorilla/websocket"
)

type Session struct {
	Conn   *websocket.Conn
	Url    string
	IsStop bool
}

// NewSession 创建会话
func NewSession(url string) *Session {
	return &Session{
		Url: url,
	}
}

// Start 开始会话
// 创建websocket连接,支持失败重连
func (s *Session) Start() {
	for !s.IsStop {
		// for {
		conn, _, err := websocket.DefaultDialer.Dial(s.Url, nil)
		if err != nil {
			// 2s后重连
			time.Sleep(2 * time.Second)
			continue
		}
		fmt.Println("连接成功")
		s.Conn = conn
		for {
			messageType, message, err := conn.ReadMessage()
			if err != nil {
				fmt.Println("读取失败:", err)
				break
			}
			switch messageType {
			case websocket.TextMessage:
				// 处理消息
				fmt.Println("message:", string(message))
			}
		}
		if !s.IsStop {
			return
		}
		// 2s后重连
		time.Sleep(2 * time.Second)
	}
}

// Close 关闭会话
// 关闭websocket连接
func (s *Session) Close() {
	fmt.Println("关闭连接")
	s.IsStop = true
	if s.Conn != nil {
		s.Conn.Close()
	}
}

// 测试代码
func TestSession(t *testing.T) {
	var session *Session
	go func() {
		url := "ws://127.0.0.1:7776"
		session = NewSession(url)
		session.Start()
		fmt.Println("连接已关闭")
	}()

	time.Sleep(10 * time.Second)

	session.Close()

	time.Sleep(20 * time.Second)
}

用Session结构体及其方法来封装websocket连接和关闭,并在结构体中添加了IsStop属性,作为是否要关闭连接,不再重连的标识。

把IsStop作为外层for循环的判断条件,当调用Conn.Close()函数关闭连接的时候,conn.ReadMessage()会中断阻塞,并返回一个error,我们捕捉到error会跳到外层循环,只要我们把IsStop设置为true,外层循环就会终止,结束重连逻辑。

在Session.Close()方法中,先把IsStop设置为true,再关闭连接。顺序最好别错。

相关推荐
未来魔导15 小时前
Go-qdrant-API开启客服系统新模式
go·api·qdrant
破烂pan19 小时前
Python 长连接实现方式全景解析
python·websocket·sse
真上帝的左手20 小时前
15. 实时数据- SSE VS WebSocket
websocket
喵个咪20 小时前
开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:Makefile 在后端开发中的应用与 Windows 环境配置
后端·go
9527出列21 小时前
Netty实战--使用netty构建WebSocket服务
websocket·网络协议·netty
真上帝的左手1 天前
15. 实时数据-SpringBoot集成WebSocket
spring boot·后端·websocket
坐吃山猪1 天前
Playwright03-CDP/WebSocket/PlayWright
python·websocket·playwright
未来魔导1 天前
go语言中json操作总结
数据分析·go·json
王中阳Go背后的男人2 天前
GoFrame vs Laravel:从ORM到CLI工具的全面对比与迁移指南
后端·go
卡尔特斯2 天前
Go 安装插件更换国内镜像
go