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

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Android中使用WebSocket时,可以通过以下步骤实现WebSocket断开重连: 1. 创建WebSocket连接对象 ```java private WebSocket mWebSocket; private String mWebSocketUrl = "ws://yourwebsocketurl.com"; private void createWebSocket() { OkHttpClient okHttpClient = new OkHttpClient.Builder().build(); Request request = new Request.Builder().url(mWebSocketUrl).build(); mWebSocket = okHttpClient.newWebSocket(request, mWebSocketListener); } ``` 2. 实现WebSocketListener监听器 ```java private WebSocketListener mWebSocketListener = new WebSocketListener() { @Override public void onOpen(WebSocket webSocket, Response response) { // WebSocket连接成功 } @Override public void onMessage(WebSocket webSocket, String text) { // 接收到WebSocket服务器发送的消息 } @Override public void onClosed(WebSocket webSocket, int code, String reason) { // WebSocket连接关闭 reconnectWebSocket(); } @Override public void onFailure(WebSocket webSocket, Throwable t, Response response) { // WebSocket连接失败 reconnectWebSocket(); } }; ``` 3. 实现重连方法 ```java private void reconnectWebSocket() { new Thread(new Runnable() { @Override public void run() { while (!mWebSocket.isOpen()) { try { // 尝试重新连接 createWebSocket(); Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } ``` 这样,当WebSocket连接关闭或连接失败时,会自动尝试重新连接。可以根据具体需要调整重连时间间隔等参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小北很忧伤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值