当前位置: 首页 > 知识库问答 >
问题:

如何处理websocket@OnError

唐兴贤
2023-03-14

关于onerror(),endpoint文档说明:

当web套接字会话创建了某种未在web套接字协议中建模的错误时,开发人员可能会实现此方法。例如,这可能是传入消息太大而无法处理的通知,或者传入消息无法被编码。

此方法(当前)定义要处理的异常有许多类别:

如果发生错误,onerror()方法是否应该关闭websocket(调用session.close())?

到目前为止,我认为我的责任是干净利落地关闭会话,并将关闭的原因告知客户。这就是为什么如果session.isopen()返回true,我的onerror()尝试调用session.close(),但这导致tomcat(8.0.15)抛出NullPointerException:

...
Caused by: java.lang.NullPointerException
    at org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer.onWritePossible(WsRemoteEndpointImplServer.java:96)
    at org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer.doWrite(WsRemoteEndpointImplServer.java:81)
    at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.writeMessagePart(WsRemoteEndpointImplBase.java:444)
    at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.startMessage(WsRemoteEndpointImplBase.java:335)
    at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.startMessageBlock(WsRemoteEndpointImplBase.java:264)
    at org.apache.tomcat.websocket.WsSession.sendCloseMessage(WsSession.java:536)
    at org.apache.tomcat.websocket.WsSession.doClose(WsSession.java:464)
    at org.apache.tomcat.websocket.WsSession.close(WsSession.java:441)
    at my.package.MyEndpoint.onWebSocketError(MyEndpoint.java:229)
    ... 18 more

这是tomcat的错误,还是我的误会,还是两者兼而有之?

编辑:看起来Java EE websocket示例dukeeetf2假设错误是致命的;也没有必要结束会议。将记录错误,并删除会话:

@OnError
public void error(Session session, Throwable t) {
    /* Remove this connection from the queue */
    queue.remove(session);
    logger.log(Level.INFO, t.toString());
    logger.log(Level.INFO, "Connection error.");
}

共有1个答案

柳培
2023-03-14

@onerror方法调用并不意味着会话将被关闭;你可以做任何你想做的事情,这取决于你的应用程序指定的契约。

来自tomcat实现的stacktrace看起来像是一个bug。

ad dukeeetf2示例--这段代码似乎包含其他假设--endpoint不抛出异常,因此这里捕获的所有内容都来自底层WebSocket框架实现。那并不真的意味着存在“连接错误”;我可能会立即关闭(如果我不希望我的应用程序处理错误);此实现可能导致打开的连接没有任何消息。

 类似资料:
  • 我试图抓住无效的json,而解析它与jiffy在牛仔web套接字处理程序。如果json是有效的/无效的,我想转发一个适当的消息到,它将回复客户端。这是我的代码。 这会导致运行时异常。 12:07:48.406[错误]牧场侦听器http已连接到进程 那我该怎么做呢?

  • 主要内容:检查网络可用性当在客户端和服务器之间建立了连接,就会从Web Socket实例触发事件。在通信期间发生的错误会生成错误。它是在事件的帮助下标记和处理的。在发生错误之后总是会终止连接。 当通信之间发生错误时会触发事件。事件之后是连接终止,这是一个关闭事件。 一个好的做法是始终告知用户意外错误并尝试重新连接它们。 在处理错误时,必须考虑内部和外部参数。 内部参数包括由于代码中的错误或意外的用户行为而可能生成的错误。

  • 我有一个来捕获可能发生的: 这里是有问题的对象: 如果在和中发送以下JSON正文: 如何处理在websocket消息上引发的?

  • 我每个websocket接收几十条消息,这些消息可能只差几毫秒就能到达。我需要用操作来处理这些数据,这些操作有时会花费一些时间(例如,在DB中的插入)。为了处理接收到的新消息,必须完成对前一个消息的处理。 我的第一个想法是用Node.js Bull(用Redis)准备一个队列,但恐怕太长了,无法运行。这些消息的处理必须保持快速。 我尝试使用JS迭代器/生成器(直到现在我还从未使用过),我测试了如下

  • 问题从这里开始,似乎还没有人给出正确的答案。 ================================== 嗨,德夫斯, 我正在开发一个社交网络应用程序,其中包括音频通话功能。我与插座IO网络对话器集成了这个音频呼叫。我通过两种方式接收音频呼叫。连接套接字时的套接字呼叫 仅供参考,为什么我有两种接听电话的方式,如上所述, < li >默认情况下启用VoIP,因为有时套接字调用没有响应,并且