cuestiones relacionadas con WebSocket Resumen (sesiones compartidas, de inicio de sesión de usuario de múltiples terminales, etc.)

WebSocket problema cuando utilizamos el hecho de que el principal problema sesión de cara compartir:

Ya sea sobre la base de WebSocket primavera implementado WebsocketSession

Se basa en la implementación JDK de la Sesión

O Netty basada también logró ChannelHandlerContext

La figura usando se describirá un escenario:

OK, veo esta cifra, casi debería entender cómo se ocupan de la sesión compartida. De hecho, el principio es muy simple:

1, sabemos que hay función de retención de IP-nginx, de hecho, esta función será capaz de resolver la mayoría de las escenas Sesión problema de compartir. Sin embargo, en algunos casos extremos todavía tiene problemas, como en el caso de la misma por debajo del navegador se cierra un usuario para reemplazar el estado de la red llevado a IP cambiada, o por alguna red IP es el caso de los cambios, habrá Sesión la situación no se puede encontrar.

2, basado en los principios anteriores, podemos optimizar nginx, o el almacenamiento de instancia única. Así que el tiempo de operar, le digo a todo el lado del servicio, de ir a la sesión del usuario, y el mensaje con el pasado. A continuación, el nodo de usuario correspondiente para obtener la Sesión se puede procesar.

La descripción breve de arriba alrededor de las 2:00 de la siguiente reunión del principio de compartir, entonces hay un tal escenario, el texto no puede ser una buena expresión, utilizamos diagrama para ilustrar:

En general, parece que MULTIPORT circunstancia debe permitirse que los anteriores dos casos, ya sea autorizados o no autorizados. Estoy aquí para decir simplemente el proceso de flujo permisible.

Establecer una conexión cuando la primera sesión se hacen mayores

 Session oldSession = SOCK_MAP.get(baseStudentInfo.getId());

 Hay, a continuación, empuje para cerrar el mensaje, no existe para informar a otros nodos para borrar. nodo de servidor, por supuesto, ser excluido, donde se determina a través de IP.

        if(oldSession!=null) {
            oldSession.getBasicRemote().sendObject(close);
        }else{
            //关闭其他节点的的session
            authService.pushCloseMessage(close);
        }
        //替换
        SOCK_MAP.put(baseStudentInfo.getId(),session);

escucha de mensajes

            String serverIp = IPUtils.getLocalhostIp();
            logger.info("当前IP:"+serverIp);
            logger.info("content的IP:"+wsMessage.getBody().getContent());
            //IP不相等,说明不是当前连接的服务端,关闭其他端口
            if(!serverIp.equals(wsMessage.getBody().getContent())){
                //关闭session,并返回给前端
                customerHandler.closeSession(wsMessage.getBody().getReceiver(), wsMessage);
            }

Cerrar:

    /**
     * 关闭Session
     * @param studentId
     * @param closeMessage
     */
    public void closeSession(Long studentId,WsMessage closeMessage){
        Session session = SOCK_MAP.get(studentId);
        if(session!=null) {
            try {
                session.getBasicRemote().sendObject(closeMessage);
                SOCK_MAP.remove(studentId);
                //清除redis
                logger.info("连接已关闭:" + studentId);
            } catch (Exception e) {
                e.printStackTrace();
                logger.error("关闭连接异常");
            }
        }
    }

Así que, básicamente, para evitar problemas de registro de múltiples puertos, si multipuerto les permite conectarse sólo cuando es necesario cambiar el almacenamiento, el cambio de enviar un mensaje a convertirse en masa.

Ha publicado 183 artículos originales · ganado elogios 37 · vistas 160 000 +

Supongo que te gusta

Origin blog.csdn.net/zhuwei_clark/article/details/104772732
Recomendado
Clasificación