java - ejemplo - embarcadero websocket server: envíe el código de estado del cliente basado en la lógica de la aplicación
websocket service java (1)
Estoy escribiendo un servidor Websocket usando Jetty.
Mi código de controlador:
public class WebSocketServerHandler {
@OnWebSocketClose
public void onClose(int statusCode, String reason) {
System.out.println("Close: statusCode=" + statusCode + ", reason=" + reason);
}
@OnWebSocketError
public void onError(Throwable t) {
}
@OnWebSocketConnect
public void onConnect(Session session) {
}
@OnWebSocketMessage
public void onMessage(Session session, String message) {
}
@OnWebSocketMessage
public void onBinaryMethod(Session session, byte data[], int offset, int length) {
}
}
Uno de mis requisitos es enviar código de estado personalizado basado en lógica de negocios insde onBinaryMethod
Ejemplo: envíe 1001 como código de estado para el tiempo de espera (Jetty ya lo admite)
No estoy seguro de dónde establecer estos códigos de estado. He intentado seguir, pero parece que no funciona.
Session().getUpgradeResponse().setStatusCode();
WebSockets
Aquí está el RFC
respecto a los códigos de estado de WebSocket.
Durante la comunicación con el socket
, no se supone que deba enviar dicha información en los códigos de estado. Envíe un message
con la información que necesita el cliente.
Si está interesado en el cierre de códigos , puede proporcionar esta información en el objeto Session
siguiente manera:
session.close(new CloseReason(YOUR_NUMBER, "Your reason"));
DESCANSO
Si confía en esos códigos, use los servicios REST , hay muchas opciones allí:
- Lanzar una excepción específica
- Usar el generador de respuestas y devolver la respuesta
- Inyectar el contexto
Creo que la forma más fácil de lograr Tu objetivo es usar setStatus(int)
:
@Context
HttpServletResponse response;
@Path("/method")
public void onBinaryMethod() {
int statusCode = 200;
//SOME CODE
response.setStatus(statusCode);
}
Aquí hay una buena respuesta que enumera muchas soluciones posibles:
https://.com/a/22869076/4823977