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

介绍

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

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

问题

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

怎么终止websocket重连呢?

解决方式

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

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

相关推荐

  1. websocket怎么终止websocket断开

    2024-06-17 06:44:03       31 阅读
  2. uniapp封装websocket以及心跳检测、

    2024-06-17 06:44:03       35 阅读
  3. vue封装websocket以及心跳检测、

    2024-06-17 06:44:03       35 阅读
  4. WebSocket 断网、心跳检测功能封装

    2024-06-17 06:44:03       30 阅读
  5. WebSocket

    2024-06-17 06:44:03       63 阅读
  6. websocket

    2024-06-17 06:44:03       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-17 06:44:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-17 06:44:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-17 06:44:03       87 阅读
  4. Python语言-面向对象

    2024-06-17 06:44:03       96 阅读

热门阅读

  1. 【Git】撤销远程仓库的提交(push)

    2024-06-17 06:44:03       39 阅读
  2. cbam+lstm代码预测

    2024-06-17 06:44:03       23 阅读
  3. vant的作用及其使用方法

    2024-06-17 06:44:03       33 阅读
  4. 大数据开发语言Scala入门

    2024-06-17 06:44:03       32 阅读
  5. MySQL入门学习-子查询.ANY

    2024-06-17 06:44:03       29 阅读
  6. Vue基础

    Vue基础

    2024-06-17 06:44:03      27 阅读
  7. 动态规划解题步骤

    2024-06-17 06:44:03       33 阅读
  8. 代码随想三刷二叉树篇1

    2024-06-17 06:44:03       24 阅读
  9. 数据结构学习笔记-图

    2024-06-17 06:44:03       34 阅读
  10. TF-IDF算法详细解析与应用

    2024-06-17 06:44:03       30 阅读
  11. 【完整解决方案】生产实战,数据库发生了死锁

    2024-06-17 06:44:03       29 阅读