我的编程空间,编程开发者的网络收藏夹
学习永远不晚

websocket实战(3) 错误处理及

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

websocket实战(3) 错误处理及

回顾

websocket实战(1) 入门

websocket实战(2) 信息处理发送、接收和编码

通过前面说明,已经轻松构建一个简单的websocket ServerEndPoint了。可以为EndPoint加上×××,编码器,为EndPoint提供支持。但是,作为一个服务器,遇到错误怎么办?websocket作为一个简单的容器组件,也具备简单配置管理功能。

1.错误处理

1.1@onError

其实很简单,就是在ServerEndPoint类中,添加一个方法,要求该方法被@onError修饰。

如下

@ServerEndpoint("/testendpoint")
public class TestEndpoint {
   ...
   @OnError
   public void error(Session session, Throwable t) {
      t.printStackTrace();
      ...
   }
}


代码片段(代码没有意义,纯属测试)

@ServerEndpoint("/echo")
public class EchoEndpoint {
    @OnMessage
    public String onMessage(String message,Session session) {
        System.out.println("Received : " + message);
        int random = new Random().nextInt(5);
        if(random==3){
            throw new RuntimeException("自定义异常");
        }else{
            System.out.println("random="+random);
        }
        return message+"-"+session.getId();
    }

    @OnOpen
    public void myOnOpen(Session session) {
        session.getUserProperties().put("startTime",new Date());
        System.out.println("WebSocket opened: " + session.getId());
    }

    @OnClose
    public void myOnClose(CloseReason reason) {
        System.out.println("Closing a WebSocket due to " + reason.getReasonPhrase());
    }

    @OnError
    public void error(Session session, Throwable t) {
        System.out.println("发生错误,请注意");
        t.printStackTrace();
    }
}

如果遇到错误,将抛异常如下

发生错误,请注意(error方法中输出)

java.lang.RuntimeException: 自定义异常
    at com.sample.websocket.endpoint.EchoEndpoint.onMessage(EchoEndpoint.java:21)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.tomcat.websocket.pojo.PojoMessageHandlerWholeBase.onMessage(PojoMessageHandlerWholeBase.java:80)
    at org.apache.tomcat.websocket.WsFrameBase.sendMessageText(WsFrameBase.java:393)
    at org.apache.tomcat.websocket.WsFrameBase.processDataText(WsFrameBase.java:494)
    at org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:289)
    at org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:130)
Closing a WebSocket due to An unrecoverable IOException occurred so the connection was closed(myOnClose调用输出)
    at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:56)
  ....

1.2 Error Handing

主要错误有3种。

Deployment Errors (部署期间,比如tomcat启动)
Errors Originating in Websocket Application Code(websocket endpoint 发生错误)
Errors Originating in the Container and/or Underlying Connection(连接peer内部错误)
javax.websocket. CloseReason

CloseReason.CloseCode

public enum CloseCodes implements CloseReason.CloseCode {
...

CLOSED_ABNORMALLY(1006),
...
}
//1006是一个比较特殊的错误码
//其他错误码,参照Enum CloseCodes

if the local
container determines the session has timed out, the local implementation must use the websocket protocol
close code 1006

2.配置管理

2.1 先从javax.websocket.Session说起

Session 代表一个有效连接。周期从(Open ->Close)

wKioL1fmRSPzbyNgAACOZi444dY166.png

简单将Session的方法分为几类(当然你也许有更好的分类)

  1. 配置信息(其中有些配置信息来源于WebContainer)

  2. Session状态信息

  3. 自定义存储信息

  4. 请求信息

  5. Session的操作方法

测试代码

package com.sample.websocket.endpoint;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.nio.ByteBuffer;
import java.util.Iterator;
import java.util.Set;

@ServerEndpoint("/config")
public class ReceiveEndpoint {
   @OnMessage
   public void textMessage(Session session, String msg) {
      System.out.println("Text message: " + msg);
      Set<Session> openSessions = session.getOpenSessions();
      System.out.println(" session.OpenSessions.size" + openSessions.size());
   }
   @OnMessage
   public void binaryMessage(Session session, ByteBuffer msg) {
      System.out.println("Binary message: " + msg.toString());
   }
   @OnMessage
   public void pongMessage(Session session, PongMessage msg) {
      System.out.println("Pong message: " +  msg.getApplicationData().toString());
   }

   @OnClose
   public void nClose(Session session, CloseReason reason) {
      System.out.println("Pong message: " +  reason.getReasonPhrase()+"-->"+reason.getCloseCode());
   }

   @OnError
   public void onError(Throwable t){
      t.printStackTrace();
   }
   @OnOpen
   public void onOpen(Session session){
      System.out.println("session.getId()=" + session.getId());

      Set<Session> openSessions = session.getOpenSessions();
      System.out.println(" session.OpenSessions.size=" + openSessions.size());
      session.getUserProperties().put("userName","Guest"+session.getId());

      Iterator<Session> iterator = openSessions.iterator();
      System.out.println("open session list===========");
      while(iterator.hasNext()){
         Session s = iterator.next();
         String sid = s.getId();
         System.out.println("session.id==>"+ sid);
         Object user = s.getUserProperties().get("userName");
         System.out.println("session."+sid+"username==>"+user);
      }
      System.out.println();
      System.out.println();

      WebSocketContainer wsc = session.getContainer();
      System.out.println("WebSocketContainer Info==========");
      System.out.println("webSocketContainer=" + wsc);
      System.out.println("defaultAsyncTimeout->"+wsc.getDefaultAsyncSendTimeout());
      System.out.println("defaultMaxBinaryMessageBufferSize-->"+wsc.getDefaultMaxBinaryMessageBufferSize());
      System.out.println("defaultMaxSessionIdleTimeout-->"+wsc.getDefaultMaxSessionIdleTimeout());
      System.out.println("installedExtensions.size==>" + wsc.getInstalledExtensions().size());
      System.out.println();
      System.out.println();
      System.out.println("session parameter");
      System.out.println("session.getMaxBinaryMessageBufferSize()==>"+session.getMaxBinaryMessageBufferSize());
      System.out.println("session.getMaxIdleTimeout()==>"+session.getMaxIdleTimeout());
      System.out.println("session.getNegotiatedSubprotocol()==>"+session.getNegotiatedSubprotocol());
      System.out.println("session.getProtocolVersion()==>"+session.getProtocolVersion());
      System.out.println("session.getRequestURI()==>" + session.getRequestURI());
      System.out.println();
      System.out.println();
      Set<MessageHandler> messageHandlers = session.getMessageHandlers();
      Iterator<MessageHandler> messageHandlerIterator = messageHandlers.iterator();
      System.out.println("MessageHandlers");
      while(messageHandlerIterator.hasNext()){
         MessageHandler handler = messageHandlerIterator.next();
         System.out.println(handler.toString());
      }
      System.out.println("session.getUserPrincipal().getName()==>"+session.getUserPrincipal());
   }
}

输出结果如下

session.getId()=0
 session.OpenSessions.size=0
open session list===========

WebSocketContainer Info==========
webSocketContainer=org.apache.tomcat.websocket.server.WsServerContainer@4d3de8ab
defaultAsyncTimeout->-1
defaultMaxBinaryMessageBufferSize-->8192
defaultMaxSessionIdleTimeout-->0
installedExtensions.size==>0


session parameter
session.getMaxBinaryMessageBufferSize()==>8192
session.getMaxIdleTimeout()==>0
session.getNegotiatedSubprotocol()==>
session.getProtocolVersion()==>13
session.getRequestURI()==>/wsexample/config

MessageHandlers
org.apache.tomcat.websocket.pojo.PojoMessageHandlerWholePong@6e710882
org.apache.tomcat.websocket.pojo.PojoMessageHandlerWholeBinary@3ee5c773
org.apache.tomcat.websocket.pojo.PojoMessageHandlerWholeText@1f69b445
session.getUserPrincipal().getName()==>null
Text message: Hello WebSocket!
 session.OpenSessions.size=1


下面是我分析结果

1.session.id是从0递增的

2.session.getOpenSessions(),API定义是获取连接EndPoint的Session的数目,但实际上永远返回1

3.session.getOpenSessions() 在@OnOpen方法中调用返回0,在@OnMessage方法中调用返回1,即便打开了多个连接也是如此。在Tomcat7.72中如此。

4.定义了3个OnMessage修饰的方法,MessageHandler也是三个

5.几个参数从WebSocketContainer中的参数,与Session的参数一致。比如MaxBinaryMessageBufferSize等

6.即使在方法中修改了WebSocketContainer的配置参数值,session中对应的值也不会变。

session.getOpenSessions() API

Return a copy of the Set of all the open web socket sessions that represent connections to the same endpoint to which this session represents a connection. The Set includes the session this method is called on.

调整Session中的若干参数值

    @OnOpen 
    public void onOpen(final Session session) { 
        session.setMaxIdleTimeout(TIMEOUT); 
        ... 
    }

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

websocket实战(3) 错误处理及

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

websocket实战(3) 错误处理及

回顾websocket实战(1) 入门websocket实战(2) 信息处理发送、接收和编码通过前面说明,已经轻松构建一个简单的websocket ServerEndPoint了。可以为EndPoint加上×××,编码器,为EndPoint
2023-01-31

PHP微框架实战:Slim 和 Phalcon 的错误处理机制

微框架 slim 和 phalcon 的错误处理机制:slim:自定义错误处理程序可定义在 index.php 文件中。处理异常对象和 http 错误代码,可返回 http 响应、抛出异常或显示错误页面。phalcon:全面错误处理系统,使
PHP微框架实战:Slim 和 Phalcon 的错误处理机制
2024-05-21

Golang错误处理计划:错误类型分类及处理技巧详解

Golang 错误处理计划:错误类型分类及处理技巧详解引言:错误处理是编程中一个至关重要的方面,它帮助我们在程序出现异常情况时做出及时的响应和处理。在 Golang 中,错误处理被设计成一种可管理和清晰的机制来处理异常。本文将详细探讨
Golang错误处理计划:错误类型分类及处理技巧详解
2024-03-09

PHP错误类型及对应处理

PHP错误类型及对应处理在开发PHP应用程序时,不可避免地会遇到各种各样的错误。了解不同类型的PHP错误,以及如何适当地处理这些错误,对于确保应用程序的稳定性和安全性至关重要。本文将介绍一些常见的PHP错误类型,并提供具体的代码示例来展示
PHP错误类型及对应处理
2024-03-12

Nginx处理WebSocket连接时的错误重试与恢复策略

在使用Nginx处理WebSocket连接时,可能会遇到一些错误,例如连接超时、网络故障等。为了确保服务的稳定性和可靠性,我们需要实现一种错误重试和恢复策略。以下是一些建议:错误检测:首先,需要检测到WebSocket连接的错误。Nginx
Nginx处理WebSocket连接时的错误重试与恢复策略
2024-10-20

JavaScript Try...Catch 语句实战指南:轻松捕获并处理错误

: JavaScript Try...Catch 语句是一种强大的错误处理机制,可帮助您轻松捕获并处理错误,从而使您的代码更加健壮可靠。本文将详细介绍 Try...Catch 语句的语法、用法以及一些常见的错误处理场景,帮助您掌握这一重要技术。
JavaScript Try...Catch 语句实战指南:轻松捕获并处理错误
2024-02-08

NodeJS 错误处理最佳实践

NodeJS 是一种基于事件驱动、异步 I/O 的开放源代码服务器端 JavaScript 运行时环境。它的高效性和可扩展性使得 NodeJS 成为了许多企业级 Web 应用的首选技术。然而,像所有其他软件一样,NodeJS 应用程序也无法完全避免出现错误和异常。为了提高代码的健壮性和可靠性,正确地进行错误处理是非常重要的。本文旨在提供一些 NodeJS 错误处理的最佳实践,帮
2023-05-14

Python 异常处理实战指南,解决常见错误不再是难事

Python 异常处理是编程中必不可少的一环,它可以帮助我们捕获并处理程序运行期间可能发生的错误,避免程序意外终止。本文将介绍 Python 中的异常处理机制,并通过丰富的示例演示如何处理常见的错误,为读者提供一份实用的 Python 异常处理指南。
Python 异常处理实战指南,解决常见错误不再是难事
2024-02-24

怎么处理VSFTPD实验500OOPS错误

小编给大家分享一下怎么处理VSFTPD实验500OOPS错误,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!vsftpd用了有一年了,发现个VSFTPD的错误,一直
2023-06-16

Golang错误处理方式实战指南:高效解决问题的秘诀

Golang 错误处理方式实战指南:高效解决问题的秘诀在编程中,错误处理是非常重要的一部分,它能够帮助我们优雅地处理异常情况,提高程序的健壮性和可靠性。然而,在 Golang 中,错误处理有着自己独特的方式和技巧。本文将针对 Golang
Golang错误处理方式实战指南:高效解决问题的秘诀
2024-03-13

驯服 JavaScript 错误对象:错误处理的最佳实践

处理 JavaScript 错误对象是一项关键任务,可以增强应用程序的健壮性和用户体验。遵循最佳实践对于有效管理错误并提供有意义的反馈至关重要。
驯服 JavaScript 错误对象:错误处理的最佳实践
2024-03-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录