java onerror_java-如何处理websocket @OnError

除了记录Websocket错误,正确的方法是什么?

关于onError,端点documentation指出:

Developers may implement this method when the web socket session

creates some kind of error that is not modeled in the web socket

protocol. This may for example be a notification that an incoming

message is too big to handle, or that the incoming message could not

be encoded.

There are a number of categories of exception that this method is

(currently) defined to handle:

connection problems, for example, a socket failure that occurs before the web socket connection can be formally closed. These are modeled as SessionExceptions

runtime errors thrown by developer created message handlers calls.

conversion errors encoding incoming messages before any message handler has been called. These are modeled as DecodeExceptions

所有这些异常类型是否都是致命的,导致websocket关闭?

如果发生错误,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.");

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java可以使用Java-WebSocket库来编写多个WebSocket实例。在使用Java-WebSocket库时,需要创建多个WebSocketServer实例,并为每个实例指定不同的端口号。每个WebSocketServer实例都可以处理多个WebSocket连接。在处理WebSocket连接时,可以使用WebSocket类的onOpen、onClose、onMessage和onError方法来处理WebSocket连接的打开、关闭、消息和错误事件。此外,还可以使用WebSocket类的send方法向客户端发送消息。下面是一个简单的Java-WebSocket多个WebSocket实例的示例代码: ``` import java.net.InetSocketAddress; import java.util.concurrent.CopyOnWriteArrayList; import org.java_websocket.WebSocket; import org.java_websocket.handshake.ClientHandshake; import org.java_websocket.server.WebSocketServer; public class MultiWebSocketServer { private CopyOnWriteArrayList<WebSocket> webSockets = new CopyOnWriteArrayList<>(); public MultiWebSocketServer(int... ports) { for (int port : ports) { WebSocketServer server = new WebSocketServer(new InetSocketAddress(port)) { @Override public void onOpen(WebSocket webSocket, ClientHandshake clientHandshake) { webSockets.add(webSocket); System.out.println("WebSocket opened: " + webSocket.getRemoteSocketAddress()); } @Override public void onClose(WebSocket webSocket, int i, String s, boolean b) { webSockets.remove(webSocket); System.out.println("WebSocket closed: " + webSocket.getRemoteSocketAddress()); } @Override public void onMessage(WebSocket webSocket, String s) { System.out.println("WebSocket message received: " + s); } @Override public void onError(WebSocket webSocket, Exception e) { System.out.println("WebSocket error: " + e.getMessage()); } }; server.start(); System.out.println("WebSocket server started on port " + port); } } public void broadcast(String message) { for (WebSocket webSocket : webSockets) { webSocket.send(message); } } public static void main(String[] args) { MultiWebSocketServer server = new MultiWebSocketServer(8080, 8081); server.broadcast("Hello, world!"); } } ``` 此代码创建了两个WebSocketServer实例,分别监听8080和8081端口。在每个WebSocketServer实例的onOpen、onClose、onMessage和onError方法中,分别处理WebSocket连接的打开、关闭、消息和错误事件。在broadcast方法中,使用WebSocket类的send方法向所有客户端发送消息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值