iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >websocket实战(3) 错误处理及
  • 640
分享到

websocket实战(3) 错误处理及

实战错误websocket 2023-01-31 05:01:51 640人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

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

回顾

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); 
        ... 
    }

--结束END--

本文标题: websocket实战(3) 错误处理及

本文链接: https://www.lsjlt.com/news/188064.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • websocket实战(3) 错误处理及
    回顾websocket实战(1) 入门websocket实战(2) 信息处理发送、接收和编码通过前面说明,已经轻松构建一个简单的websocket ServerEndPoint了。可以为EndPoint加上×××,编码器,为EndPoint...
    99+
    2023-01-31
    实战 错误 websocket
  • Oracle_CDC整理3-参考及错误处理
      1.  参考文档 http://blog.csdn.net/chentaocba/article/details/7435131 http://www.cnbl...
    99+
    2022-10-18
  • 【MongoDB学习笔记3】处理MongoDB连接错误
    安装MongoDB后第一次启用shell登录mongo会出现一下的错误:warning: Failed to connect to 127.0.0.1:27...
    99+
    2022-10-18
  • Kotlin Android中错误及异常处理最佳实践
    Kotlin Android中错误及异常处理最佳实践 Kotlin在Android开发中的错误处理机制以及其优势 Kotlin具有强大的错误处理功能:Kotlin提供了强大的错误处理功能,使处理错...
    99+
    2023-10-08
    android kotlin 开发语言
  • GoFrame错误处理常用方法及错误码使用示例
    目录前言错误创建New/NewfWrap/WrapfNewSkip/NewSkipf错误码使用错误码相关方法概览NewCode/NewCodef示例代码WrapCode/WrapCo...
    99+
    2022-11-13
  • PHP中的错误及其处理机制
    目录什么是错误?Fatal Error:致命错误(脚本终止运行)Parse Error:编译时解析错误,语法错误(脚本终止运行)Warning Error:警告错误(仅给出提示信息,...
    99+
    2022-11-12
  • SQL Server中实现错误处理
    一、SQLServer数据库引擎错误 1、查询系统错误信息 SQLServer在每个数据库的系统视图sys.messages中存储系统自定义(Message_id <= 500...
    99+
    2022-11-13
  • NodeJS 错误处理最佳实践
    NodeJS 是一种基于事件驱动、异步 I/O 的开放源代码服务器端 JavaScript 运行时环境。它的高效性和可扩展性使得 NodeJS 成为了许多企业级 Web 应用的首选技术。然而,像所有其他软件一样,NodeJS 应用程序也无法...
    99+
    2023-05-14
  • Python编程pydantic触发及访问错误处理
    目录常见触发错误的情况错误的触发注意访问错误的方式简单栗子复杂栗子自定义错误自定义错误模板类PydanticValueError常见触发错误的情况 如果传入的字段多了会自动...
    99+
    2022-11-12
  • 怎么处理VSFTPD实验500OOPS错误
    小编给大家分享一下怎么处理VSFTPD实验500OOPS错误,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!vsftpd用了有一年了,发现个VSFTPD的错误,一直...
    99+
    2023-06-16
  • JavaScript中怎么实现错误处理
    JavaScript中怎么实现错误处理,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。使用 Promise 处理错误为了演示 Promise...
    99+
    2022-10-19
  • dbeaver连接MySQL数据库及错误Connection refusedconnect处理
    目录 一、正常安装dbeaver 二、连接MySQL 三、Connection refused:connect处理 四、连接MySQL成功 一、正常安装dbeaver 进入dbeaver官网,找到安...
    99+
    2023-09-18
    android 前端 后端
  • CDH6.0.1 搭建过程及所遇到的错误处理
    一、集群服务器配置说明(整个过程中我会提前把一些小坑填上,有的坑后面没有提到) IP  节点名 OS Cores Memory Disk Remark 172.25.16.1 cdh1 CentOS7.5 40 128 ...
    99+
    2021-04-16
    CDH6.0.1 搭建过程及所遇到的错误处理
  • SQL Server中如何实现错误处理
    今天小编给大家分享一下SQL Server中如何实现错误处理的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、SQ...
    99+
    2023-06-30
  • Golang try catch与错误处理的实现
    目录Golang try catch panic panic主要使用场景: recover error 预定义错误值 自定义错误类型 使用 panic和recover模拟 tyr...
    99+
    2022-11-12
  • Go 错误处理实践总结示例
    目录前言Go 错误处理机制Go 内置 errorsError 与 ExceptionGo 错误处理最佳实践panicerror总结前言 最近在对极客时间毛剑老师的 Go 进阶训练营进...
    99+
    2022-11-13
  • Go错误处理机制实例分析
    这篇文章主要讲解了“Go错误处理机制实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go错误处理机制实例分析”吧!Go 错误处理机制Go 内置 errorsGo 语言中的 e...
    99+
    2023-07-02
  • SQL Server2019安装详细教程及常见错误处理
    在.net开发中我们经常会用到SQL Server,微软的SQL Server其实还算不错,而且其Developer(开发者版)也免费对用户使用,但是在安装的过程中,尤其是在没有之前版本的全新安装时,往往会出现很多问题,在...
    99+
    2018-03-14
    SQL Server2019安装详细教程及常见错误处理
  • jQuery如何实现AJAX调用错误处理
    这篇文章主要为大家展示了“jQuery如何实现AJAX调用错误处理”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“jQuery如何实现AJAX调用错误处理”这篇文...
    99+
    2022-10-19
  • React中Portals与错误边界处理实现
    目录Portals 错误边界处理 如果没有使用错误边界会怎样? 注意点 Portals 可以说是 插槽,但 不同于 Vue 中的 slot,它指的是将一个 React 元素渲染到指...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作