正确主动关闭websocket,异常关闭处理

这篇具有很好参考价值的文章主要介绍了正确主动关闭websocket,异常关闭处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

CloseEvent.code

下面是一个示例的WebSocket错误码表格,包括错误码、错误处理方法和错误码说明:

错误码 错误如何处理 错误码说明
1000 关闭连接 正常关闭连接
1001 关闭连接后几秒后重连 终端离开或刷新页面
1002 关闭连接上报日志给开发者 协议错误
1003 关闭连接上报日志给开发者 数据类型错误
1005 关闭连接提示未知的错误几秒后重连 无关闭状态码
1006 关闭连接 几秒后重连 连接意外中断
1007 关闭连接上报日志给开发者,几秒后重连 非法数据
1008 关闭连接笙宝日志给开发者,几秒后重连 消息内容违反策略
1009 关闭连接,上报日志给开发者,几秒后重连 消息过大
1010 关闭连接,上报日志给开发者,几秒后重连 扩展协商失败
1011 关闭连接 服务器内部错误
1012-1014 关闭连接 保留未使用的错误码
1015 关闭连接 TLS握手失败
  • 0-999 暂未使用
关闭状态码 简称 原因
1000 正常关闭 连接成功地完成了创建它的目的。
1001 离开 端点消失了,可能是因为服务器故障,也可能是因为浏览器离开了打开连接的页面。
1002 协议错误 由于协议错误,端点正在终止连接。
1003 不支持的数据 由于端点接收到的数据类型无法接受,连接被终止。(例如,纯文本端点接收二进制数据
1004 暂时保留 保留。将来可能会定义一个含义。
1005 No Status Rcvd Reserved. Indicates that no status code was provided even though one was expected.
1006 Abnormal Closure Reserved. Indicates that a connection was closed abnormally (that is, with no close frame being sent) when a status code is expected.
1007 Invalid frame payload data The endpoint is terminating the connection because a message was received that contained inconsistent data (e.g., non-UTF-8 data within a text message).
1008 Policy Violation The endpoint is terminating the connection because it received a message that violates its policy. This is a generic status code, used when codes 1003 and 1009 are not suitable.
1009 Message Too Big The endpoint is terminating the connection because a data frame was received that is too large.
1010 Mandatory Ext. The client is terminating the connection because it expected the server to negotiate one or more extension, but the server didn’t.
1011 Internal Error The server is terminating the connection because it encountered an unexpected condition that prevented it from fulfilling the request.
1012 Service Restart The server is terminating the connection because it is restarting.
1013 Try Again Later The server is terminating the connection due to a temporary condition, e.g. it is overloaded and is casting off some of its clients.
1014 Bad Gateway The server was acting as a gateway or proxy and received an invalid response from the upstream server. This is similar to 502 HTTP Status Code.
1015 TLS handshake Reserved. Indicates that the connection was closed due to a failure to perform a TLS handshake (e.g., the server certificate can’t be verified).
1016–2999 For definition by future revisions of the WebSocket Protocol specification, and for definition by extension specifications.
3000–3999 For use by libraries, frameworks, and applications. These status codes are registered directly with IANA. The interpretation of these codes is undefined by the WebSocket protocol.
4000–4999 For private use, and thus can’t be registered. Such codes can be used by prior agreements between WebSocket applications. The interpretation of these codes is undefined by the WebSocket protocol.

后面的不想翻译,请读者自行翻译,帮你贴一个翻译传送门

关闭websocket,Java,websocket,服务器,网络协议

关闭监听

TS

WebSocket.onclose = (event) => {
  console.log(event.code);
};

java

    @Override
    public void onClosed(WebSocket webSocket, int code, String reason) {
        super.onClosed(webSocket, code, reason);
        // todo 根据状态码执行重连
        if(code != 1000){
        
        }
    }

JavaScript (Node.js):

const WebSocket = require('ws');

const ws = new WebSocket('ws://localhost:8080');

ws.on('open', () => {
  // WebSocket连接成功
});

ws.on('message', (data) => {
  // 处理接收到的消息
});

ws.on('close', () => {
  // WebSocket连接关闭
});

ws.on('error', (error) => {
  // 处理WebSocket错误
  ws.close();

  // 执行重连逻辑
  setTimeout(() => {
    const newWs = new WebSocket('ws://localhost:8080');
    // ...
  }, 5000);
});

Python:

import websocket

def on_message(ws, message):
    # 处理接收到的消息

def on_close(ws):
    # WebSocket连接关闭

def on_error(ws, error):
    # 处理WebSocket错误
    ws.close()

    # 执行重连逻辑
    time.sleep(5)
    new_ws = websocket.WebSocketApp("ws://localhost:8080", on_open=on_open, on_message=on_message, on_close=on_close, on_error=on_error)
    # ...

def on_open(ws):
    # WebSocket连接成功

ws = websocket.WebSocketApp("ws://localhost:8080", on_open=on_open, on_message=on_message, on_close=on_close, on_error=on_error)
ws.run_forever()

Java Android:

import javax.websocket.*;

@ClientEndpoint
public class WebSocketClient {
    @OnOpen
    public void onOpen(Session session) {
        // WebSocket连接成功
    }

    @OnMessage
    public void onMessage(String message) {
        // 处理接收到的消息
    }

    @OnClose
    public void onClose(Session session, CloseReason closeReason) {
        // WebSocket连接关闭
    }

    @OnError
    public void onError(Session session, Throwable error) {
        // 处理WebSocket错误
        try {
            session.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 执行重连逻辑
        try {
            Thread.sleep(5000);
            WebSocketContainer container = ContainerProvider.getWebSocketContainer();
            Session newSession = container.connectToServer(WebSocketClient.class, URI.create("ws://localhost:8080"));
            // ...
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

###. C#:

using System;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;

public class WebSocketClient {
    private ClientWebSocket _client;

    public async Task Connect() {
        _client = new ClientWebSocket();
        await _client.ConnectAsync(new Uri("ws://localhost:8080"), CancellationToken.None);

        // WebSocket连接成功

        // 接收消息
        while (_client.State == WebSocketState.Open) {
            var buffer = new ArraySegment<byte>(new byte[4096]);
            WebSocketReceiveResult result = await _client.ReceiveAsync(buffer, CancellationToken.None);

            if (result.MessageType == WebSocketMessageType.Text) {
                string message = Encoding.UTF8.GetString(buffer.Array, buffer.Offset, result.Count);
                // 处理接收到的消息
            }
        }
    }

    public async Task Close() {
        await _client.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", CancellationToken.None);

        // WebSocket连接关闭

        // 执行重连逻辑
        await Task.Delay(5000);
        await Connect();
    }
}

以下是使用Kotlin和Swift语言实现关闭WebSocket并根据异常执行重连的示例:文章来源地址https://www.toymoban.com/news/detail-794196.html

Kotlin:

import okhttp3.*
import okhttp3.WebSocket
import okhttp3.WebSocketListener
import java.util.concurrent.TimeUnit

class WebSocketClient : WebSocketListener() {
    private lateinit var webSocket: WebSocket

    fun connect() {
        val okHttpClient = OkHttpClient.Builder()
            .retryOnConnectionFailure(true)
            .pingInterval(10, TimeUnit.SECONDS)
            .build()

        val request = Request.Builder()
            .url("ws://localhost:8080")
            .build()

        webSocket = okHttpClient.newWebSocket(request, this)
    }

    override fun onOpen(webSocket: WebSocket, response: Response) {
        // WebSocket连接成功
    }

    override fun onMessage(webSocket: WebSocket, text: String) {
        // 处理接收到的消息
    }

    override fun onClosed(webSocket: WebSocket, code: Int, reason: String) {
        // WebSocket连接关闭
    }

    override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
        // 处理WebSocket错误
        webSocket.close(1000, null)

        // 执行重连逻辑
        Thread.sleep(5000)
        connect()
    }
}

fun main() {
    val client = WebSocketClient()
    client.connect()
    // ...
}

Swift:

import Foundation
import Starscream

class WebSocketClient: WebSocketDelegate {
    private var socket: WebSocket?

    func connect() {
        socket = WebSocket(url: URL(string: "ws://localhost:8080")!)
        socket?.delegate = self
        socket?.connect()
    }

    func websocketDidConnect(socket: WebSocketClient) {
        // WebSocket连接成功
    }

    func websocketDidReceiveMessage(socket: WebSocketClient, text: String) {
        // 处理接收到的消息
    }

    func websocketDidDisconnect(socket: WebSocketClient, error: Error?) {
        // WebSocket连接关闭

        // 执行重连逻辑
        DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
            self.connect()
        }
    }

    func websocketDidReceiveData(socket: WebSocketClient, data: Data) {
        // 处理接收到的数据
    }
}

let client = WebSocketClient()
client.connect()
// ...

到了这里,关于正确主动关闭websocket,异常关闭处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java打印异常的正确方式

    工作多年,还是看到多种打印异常的方式,有些还是错误的,可见很多人没有亲自试验过,傻傻分不清楚。最常见的如下几种: 那么哪种才是正确的打印方式呢,看看结果就知道了! 从图片可以看出,第一种、第二种都没问题,但是第一种,画蛇添足,多加了 {} , 第三种方

    2024年02月15日
    浏览(36)
  • 已解决java.lang.NoClassDefFoundError异常的正确解决方法,亲测有效!!!已解决java.lang.NoClassDefFoundError异常的正确解决方法,亲测有效!!!

    已解决java.lang.NoClassDefFoundError异常的正确解决方法,亲测有效!!! java.lang.NoClassDefFoundError java.lang.NoClassDefFoundError是Java虚拟机在运行时无法找到特定类的错误。 下滑查看解决方法 该错误通常发生在以下情况下: 编译时缺少依赖项:如果在开发过程中缺少所需的库或依赖项

    2024年02月14日
    浏览(54)
  • Java-WebSocket通信 实现根据查询条件主动实时回传数据给前端&List<Map<String, Object>>转JSON编码器&WebSocket无法注册Bean问题解决方案

    项目背景:Java环境,Get请求根据前端查询条件建立WebSocket连接,每5秒主动实时推送最新查询结果给前端展示。其中也遇到定时器、WebSocket无法注册Bean、No encoder specified for object of class [class java.util.xxx]等问题,相关解决方案也有列举~ Web Sockets 的是在一个单独的持久连接上提

    2024年02月04日
    浏览(50)
  • 已解决com.sun.jersey.api.client.ClientHandlerException配置服务器异常的正确解决方法,亲测有效!!!

    已解决com.sun.jersey.api.client.ClientHandlerException配置服务器异常的正确解决方法,亲测有效!!! 目录 问题分析 报错原因 解决思路 解决方法 总结 问题分析 在开发基于Java的Web应用时,我们可能会使用Jersey框架来构建RESTful Web服务。Jersey是JAX-RS(Java API for RESTful Web Services)的一

    2024年03月21日
    浏览(47)
  • java.lang.NoClassDefFoundError异常的正确解决方法

    java.lang.NoClassDefFoundError 是 Java 运行时环境中的一个错误,表明 JVM 在运行时尝试加载一个类的定义,但未能找到。这通常发生在编译时该类是可用的,但在运行时 JVM 的类路径(classpath)上却找不到这个类。此错误不同于 ClassNotFoundException,后者通常在加载类时抛出,而 NoCl

    2024年04月25日
    浏览(87)
  • java.io.EOFException异常的正确解决方法

    本文将探讨java.io.EOFException异常及其正确的解决方法。EOFException是Java I/O操作中常见的异常之一,通常表示程序试图读取文件或数据流的末尾之外的内容。我们将从报错问题、报错原因和解决方案三个方面详细解析这一异常,并提供有效的处理方法。 当Java程序在进行输入流操

    2024年04月29日
    浏览(47)
  • 解决java.lang.IllegalArgumentException异常的正确解决方法

    java.lang.IllegalArgumentException 是 Java 编程语言中的一个运行时异常,通常表示向方法传递了一个不合法或不适当的参数。当程序在运行时遇到此类异常,它会立即中断当前的执行流程,并抛出异常信息。理解这个异常的原因并学会如何正确解决,对于编写健壮的 Java 程序至关重

    2024年04月25日
    浏览(73)
  • 服务器时间不正确的原因及处理方法(收藏)

    点击上方蓝字关注我 服务器时间不正确可能有多种原因,下面列举几个常见的原因: 硬件时钟故障:硬件时钟是计算机上的一块小型芯片,它用于跟踪系统时间。如果硬件时钟故障,可能导致服务器时间不正确。 操作系统配置错误:如果 CentOS 服务器的时区设置不正确,可

    2024年02月08日
    浏览(44)
  • .net8+webapi+sqlsugar基本配置;“连接数据库过程中发生错误,检查服务器是否正常连接字符串是否正确”异常

    1、引入sqlsugar的nugat包 2、封装一个操作类(参考sqlsugar官方文档) 3、配置program.cs和appsettings program.cs加上下面代码  appsettings配置连接字符串 4、新建一个控制台生成实体类 5、添加测试的controller 6、swagger调试抛异常 7、修改csproj文件中,仅适用.net 8(参考sqlsugar官方文档)  8、

    2024年03月15日
    浏览(67)
  • 解决java.sql.SQLSyntaxErrorException: Unknown database异常的正确方法

    解决java.sql.SQLSyntaxErrorException: Unknown database异常的正确方法 java.sql.SQLSyntaxErrorException: Unknown database异常 java.sql.SQLSyntaxErrorException: Unknown database 异常通常意味着你尝试连接的数据库在数据库服务器上不存在。 下滑查看解决方法 检查数据库名称: 确认你提供给 JDBC 连接字符串的

    2024年04月27日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包