¿Cómo configurar un proxy de comunicación de red para programas JAVA NIO o Netty?
//Configura un controlador para arrancar. setpipelinefactory(newchannelpipelinefactory(){ @override publipchannelpipeline get pipeline()) maneja mensajes de clientes y varios eventos de mensajes. lanza una excepción {canales de retorno. (nuevo decodificador de objetos (resolutores de clase. caché deshabilitado (this. getClass(). getClassLoader())), newObjectServerHandler() }}); >
//Establezca un controlador para manejar mensajes del lado del servidor y varios eventos de mensajes.
bootstrap . setpipelinefactory(newChannelPipelineFactory(){ @ Anular publicChannelPipeline get pipeline() lanza excepción { return canales . pipeline(new object encoder(), newObjectClientHandler()); }}); p>Para pasar un objeto, naturalmente debe haber un modelo pasado y un Pojo simple. Por supuesto, es necesario implementar la interfaz de serialización.
/* * * * @authorlihzh * @alia OneCoder * @ blog */la implementación del comando de clase pública se puede serializar { privatestaticfinallonserialversionuid = 759099461767050471L privateString actionNamepublic string getaction name(){ return action name;} publicvidsetactionname ( String actionName){ this . actionName = actionName;}}
En el servidor y el cliente, nuestro controlador personalizado se implementa de la siguiente manera:
ObjectServerHandler. Lenguaje Java (un lenguaje informático, especialmente utilizado para crear sitios web)
/* * *Código del servidor de entrega de objetos* * @ Authorlihzh * @ aliaonecoder * @ blog */public class objecterverhandler extensionsimplemechannelhandler {/* * * Trigger */@ Anular publicvidmessagererecibido (ChannelHandlerContextCTX, Evento de mensaje E) lanza una excepción { comando comando =(comando)E . // Imprime para ver si es el sistema. out.println(command.getactionname() que acabamos de enviar;}}
ObjectClientHandler.
Lenguaje Java (un lenguaje informático, especialmente utilizado para crear sitios web)
/* * *Transferencia de objetos, código de cliente* * @ Authorlihzh * @ aliaonecoder * @ blog */public class objectclienthandler extensionally SimpleChannel Handler { /* * *Se activa cuando se vincula al servidor y envía un mensaje al servidor. * * @ autor lihzh * @ alia one coder */@ Anular publicvidchannelconnected(ChannelHandlerContext CTX, ChannelStateEvent e) {//Enviar información del objeto al servidor Enviar objeto(e. get channel());}/* * * Enviar objeto * * @ canal param * @ autor lihzh * @ aliaonecoder */private void Enviar objeto(canal de canal){ comando comando = nuevo comando(); setactionname("Hola acción.");
Después de iniciar, el servidor generalmente imprime el resultado: Hola acción.
Un breve resumen de las ideas:
Netty debe tener la forma de un ChannelBuffer basado en transmisiones. Entonces, objeto -> búfer de canal.
Netty proporciona una herramienta de conversión que requiere que configuremos el controlador.
Ejemplo del cliente --> El servidor envía mensajes unidireccional, por lo que la codificación se configura en el cliente y se decodifica en el servidor. Si envía y recibe en ambas direcciones, debe configurar el codificador y el decodificador.
Cabe señalar aquí que los controladores registrados en el servidor están en orden. Si el orden de registro se invierte:
bootstrap . setpipelinefactory(newChannelPipelineFactory(){
@ Anular publicChannelPipeline get pipeline() lanza una excepción { return canales . pipeline(newObjectServerHandler(), newObjectDecoder( solucionadores de clases .cache deshabilitado(this.getClass().get class loader())));}});
De esta manera, primero ingresamos a nuestro propio negocio y luego decodificamos. Naturalmente, esto no funcionará y conducirá al fracaso. En este punto, deberías poder usar Netty para pasar objetos.