Red de conocimiento informático - Aprendizaje de código fuente - Crea tu propio marco de comunicación IV - Construcción de NettyServer

Crea tu propio marco de comunicación IV - Construcción de NettyServer

Enviar un mensaje desde el cliente al servidor, recibir y procesar el mensaje se puede dividir aproximadamente en los siguientes procesos:

La parte amarilla es la lógica del cliente y la parte azul es la Transmisión de red. El rojo es la lógica del lado del servidor. Este artículo se centra en la lógica del lado del servidor.

Decodificar binarios a un formato específico y encapsular protobuf en un formato personalizado son unidades en esta cadena de procesamiento.

En Netty, ChannelHandler actúa como una unidad y ChannelPipeline actúa como una cadena de procesamiento. La estructura de la cadena de procesamiento es la siguiente

Las marcas 1, 2 y 3 son la lógica a la que debemos prestar atención: 1. Decodificar datos binarios en protobuf -> 2. Codificar protobuf en Solicitud -> 3 Distribuir la solicitud de ejecución

Lo siguiente corresponde a los tres puntos clave en una implementación específica

A continuación explicaremos estos tres procesos en detalle

En este paso, nosotros binario Los datos se convierten a la Base previamente definida. Solicitud

Los dos ChannelHandlers utilizados aquí los proporciona Netty, por lo que no entraré en detalles.

En este paso, MessageFactory.createRequest() encontrará el específico según moduleId y CommandId Solicite y use el objeto proto para completarlo con datos. El AbstractMessage creado se pasa al siguiente nivel

(MessageRegistry se explicará más adelante).

Este paso convierte el canal en un usuario y entrega la responsabilidad de reenvío a RequestDispatchService

channel2SessionMap registra la correspondencia entre el canal y el usuario. Este es el identificador único del cliente y registra. la información del cliente y transporta mensajes serializados de forma asincrónica y no divulgables. Alberga una funcionalidad asíncrona sin bloqueo en serie, cuya implementación se analizará más adelante.

RequestDispatchService también es muy simple. Solo necesita encontrar el método correspondiente a AbstractRequest y luego llamar al método mediante reflexión para ejecutarlo.

user.execute(...) coloca este mensaje en la cola de mensajes del usuario para su ejecución

La lógica del lado del servidor termina aquí

Hagámoslo. siguiente Eche un vistazo al centro de registro de mensajes como el núcleo del proceso

El centro de registro de mensajes tiene dos funciones

Por ejemplo

Todas las implementaciones específicas de AbstractMessage se llevan a cabo usando @MessageWrapper Anotación para asociar un mensaje específico con moduleId + commandId, por ejemplo

El centro de registro de mensajes escaneará la información de la clase y registrará la relación de asociación.

Un mensaje debe tener un método correspondiente y la anotación @MessageHandler identifica un método en la interfaz que está asociado con el mensaje.

Luego, MessageRegistry encapsulará el método y lo combinará. con Correlación de mensajes

Este mecanismo permite un conjunto completo de lógica desde la recepción del mensaje hasta su ejecución.