Cómo agregar control de sincronización a WebSocket
Hoy en día, muchos sitios web utilizan el sondeo (sondeo) para lograr una comunicación en tiempo real. El sondeo es un servidor cliente en el que el navegador envía una solicitud HTTP al servidor dentro de un intervalo de tiempo específico (como cada 1 segundo) y luego el servidor devuelve los datos más recientes al navegador. Este modo de solicitud HTTP tradicional tiene desventajas obvias: el navegador necesita enviar solicitudes al servidor continuamente. Sin embargo, el encabezado de la solicitud HTTP es muy largo y los datos contenidos en él pueden ser solo un valor pequeño, lo que ocupará mucho. de ancho de banda.
La última tecnología de sondeo es Comet, que utiliza AJAX, pero aunque esta tecnología puede lograr una comunicación full-duplex, aún requiere enviar una solicitud (reuqest).
En la API WebSocket, el navegador y el servidor solo necesitan realizar un protocolo de enlace, y luego el navegador y el servidor formarán un canal rápido. Luego se forma un canal rápido entre el navegador y el servidor, y los dos pueden enviarse datos directamente entre sí. En este protocolo WebSocket, tenemos dos beneficios principales como implementación de servicio:
1. Encabezado
El encabezado utilizado para la comunicación mutua es muy pequeño: aproximadamente 2 bytes.
2. Push del servidor
El servidor puede enviar datos activamente al cliente
El siguiente es un ejemplo simple de implementación PUSH.
Un ejemplo simple de implementación PUSH es el siguiente:
Código de servidor: socketList = new ArrayList
super.init(config);
System. out. println("Inicio del servidor============");
}
Lista pública estática
devuelve InitServlet.socketList;
}
}
clase pública TestWebSocketServlet extiende WebSocketServlet{
final estático privado Registro del registrador = Logger .getLogger(TestWebSocketServlet.class);
/**
*
*
privado estático final largo serialVersionUID = 1L ;
//Contenedor de enlace de almacenamiento
Lista estática privada
@Override
StreamInbound protegido createWebSocketInbound(String subProtocol,HttpServletRequest request) {
// TODO genera automáticamente resguardos de métodos
devuelve nuevo WebSocketMessageInbound();
}
clase pública WebSocketMessageInbound extiende MessageInbound{
@ Anulación
protected void onClose(int status) {
// InitServlet.getSocketList().remove(this);
super.onClose(status);
log.debug("onClose");
InitServlet. getSocketList( ).remove(this);
}
@Override
protected void onOpen( WsOutbound saliente) {
log. debug( "onOpen");
super.onOpen(saliente
InitServlet.getSocketList().add(this);
}
@Override
Protect void onBinaryMessage(mensaje ByteBuffer) lanza IOException {
// TODO Método generado automáticamente stub
log.debug("onBinaryMes
sage");
}
@Override
protected void onTextMessage(mensaje CharBuffer) lanza IOException {
//TODO genera automáticamente un código auxiliar de método p> p>
log.debug("onTextMessage="+message);
// this.getWsOutbound().writeTextMessage( CharBuffer.wrap("===="));
// this.getWsOutbound().writeTextMessage(message);
//Enviar a todos los enlaces
for (MessageInbound messageInbound: InitServlet.getSocketList(). writeTextMessage( mensaje));
// Enviar a todos los enlaces
configuración web.xml
< -- WebSocket -->
< servlet-mapping>
Código de interfaz de usuario: