es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Netty: cómo compartir objetos entre canales.

En primer lugar, gracias por responder a esta pregunta.

Quiero utilizar Netty para implementar una función que recoja información de otros sitios web y la muestre, por lo que el Canal de Servidor Handler se implementa de la siguiente manera:

public class ProxyRedirectHandler extends SimpleChannelInboundHandler <fullhttprequest> {

    private final Logger logger = getLogger(getClass());

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest msg) throws Exception {
        logger.info("proxy request start");

        Bootstrap bootstrap = new Bootstrap();

        bootstrap.group(ctx.channel().eventLoop())
                 .channel(NioSocketChannel.class)
                 // Este Handler incluye la estrategia de recopilación y obtiene la respuesta
                 .handler(new HttpClientHandler())
                 .connect(new InetSocketAddress("www.baidu.com", 443));

        // muestra la respuesta
        ctx.writeAndFlush(response)
               .addListener(ChannelFutureListener.CLOSE);
    }
}

La cuestión principal que me confunde es cómo puedo obtener la respuesta de HttpClientHandler en el método channelRead0,

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para obtener la respuesta de HttpClientHandler en el método channelRead0 de ProxyRedirectHandler, se puede usar un objeto ChannelFuture.

    En primer lugar, es necesario modificar HttpClientHandler para almacenar el objeto ChannelPromise para su uso posterior:

    En el código anterior, hemos agregado un objeto ChannelPromise llamado “promise” y modificado el método “channelRead” para establecer esta promesa cuando recibamos la respuesta.

    Ahora, modifique ProxyRedirectHandler para esperar a que la promesa de respuesta se cumpla antes de enviar la respuesta de vuelta al cliente:

    En el código anterior, hemos modificado el “ProxyRedirectHandler” para esperar a que se complete la promesa. Una vez que se completa la promesa, podemos obtener la respuesta de “HttpClientHandler” y enviarla de vuelta al cliente.

Comments are closed.