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

相关推荐
a努力。3 小时前
阿里Java面试被问:WebSocket的心跳检测和自动重连实现
java·开发语言·python·websocket·面试·职场和发展·哈希算法
虾说羊3 小时前
WebSocket讲解
网络·websocket·网络协议
宇宙帅猴18 小时前
【Ubuntu踩坑及解决方案(一)】
linux·运维·ubuntu·go
AIFQuant20 小时前
2026 全球外汇免费实时行情汇率数据 API 接口大全
开发语言·python·websocket·金融·restful
智_永无止境1 天前
基于Netty的WebSocket自动解决拆包粘包问题
websocket·拆包粘包
Dreamboat_LX1 天前
websocket-sockjs-stomp
网络·websocket·网络协议
CryptoRzz1 天前
印度股票数据API对接实战(实时行情与IPO功能全解析)
websocket·区块链·github·共识算法·分布式账本
php_kevlin1 天前
websocket实现站内信
android·websocket·网络协议
SomeBottle2 天前
【小记】解决校园网中不同单播互通子网间 LocalSend 的发现问题
计算机网络·go·网络编程·学习笔记·计算机基础
且去填词2 天前
深入理解 GMP 模型:Go 高并发的基石
开发语言·后端·学习·算法·面试·golang·go