【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,再关闭连接。顺序最好别错。

相关推荐
2501_921649492 分钟前
股票 API 对接, 接入德国法兰克福交易所(FWB/Xetra)实现量化分析
后端·python·websocket·金融·区块链
CryptoRzz1 小时前
墨西哥股票数据 API 对接实战指南(含实时行情与 IPO 功能)
java·后端·websocket·区块链
岁月的眸13 小时前
【科大讯飞声纹识别和语音内容识别的实时接口实现】
人工智能·go·语音识别
王中阳Go19 小时前
三年前,我帮万人转Go;今天,聊聊Go/Java程序员如何抢占AI高地
人工智能·后端·go
chalmers_1519 小时前
将单个 WebSocket 客户端封装为实例
服务器·websocket·网络协议
王中阳Go1 天前
全面解析Go泛型:从1.18到最新版本的演进与实践
后端·面试·go
代码扳手1 天前
“老板,我的接口性能还能再快一倍!” — Go微服务gRPC升级实战
后端·go
码luffyliu1 天前
Go 语言并发编程:为何它能甩开 Java 等传统后端语言?
java·后端·golang·go
chalmers_151 天前
基于该 WebSocket 脚本开展专业的压力测试
服务器·websocket·压力测试
吴佳浩1 天前
Go 1.25.5 通关讲解
后端·面试·go