此外,因为我没有找到其他讨论,我无法判断什么是最佳实践。
我正在使用JSR-356规范,如下所示:
@ClientEndpoint
@ServerEndpoint(value="/ws/events/")
public class WebSocketEvents
{
private javax.websocket.Session session;
private long token;
@OnOpen
public void onWebSocketConnect(javax.websocket.Session session) throws BadRequestException
{
logger.info("WebSocket connection attempt: " + session);
this.session = session;
// this throws BadRequestException if null or invalid long
// with short detail message, e.g., "Missing parameter: token"
token = HTTP.getRequiredLongParameter(session, "token");
}
@OnMessage
public void onWebSocketText(String message)
{
logger.info("Received text message: " + message);
}
@OnClose
public void onWebSocketClose(CloseReason reason)
{
logger.info("WebSocket Closed: " + reason);
}
@OnError
public void onWebSocketError(Throwable t)
{
logger.info("WebSocket Error: ");
logger.debug(t, t);
if (!session.isOpen())
{
logger.info("Throwable in closed websocket:" + t, t);
return;
}
CloseCode reason = t instanceof BadRequestException ? CloseReason.CloseCodes.PROTOCOL_ERROR : CloseReason.CloseCodes.UNEXPECTED_CONDITION;
try
{
session.close(new CloseReason(reason, t.getMessage()));
}
catch (IOException e)
{
logger.warn(e, e);
}
}
}
编辑:根据链接示例,异常抛出似乎很奇怪,因此现在我在OnOpen中捕获异常并立即执行。
session.close(new CloseReason(CloseReason.CloseCodes.CANNOT_ACCEPT, "some text"));
编辑:虽然有一个单独的错误掩盖了它,但这最终被证明是正确的。
编辑2:澄清一下:HTTP
是我自己的静态公用类。通过使用HTTP.getRequiredLongParameter()
从客户端的初始请求获取查询参数。
session.getRequestParameterMap().get(name)
并进行进一步的处理。
OnOpen
中抛出异常可能会在调用OnError
之前关闭会话,您是否看到记录了"Throwable in closed websocket"
? - Remy LebeauServerEndpoint
和ClientEndpoint
注解? 如果你不想使用过滤器,你也可以考虑自定义配置,在那里你将检查参数是否存在以及它的取值。 - Al-unClientEndpoint
与ServerEndpoint
被合并了。感谢您指出,已经将其删除。 - Saturn5