Как создать простой клиент Netty, который отправляет запрос при запуске - PullRequest
0 голосов
/ 03 июня 2019

Я работаю над проектом, который использует Netty 4.1.9.Я пытаюсь создать чрезвычайно простой HTTP-клиент, который отправляет запрос хосту, ждет ответа и затем завершает работу.

Я использую netcat для отладки этой программы, но когда я ее запускаю,процесс блокирует и фактически никогда не отправляет запрос.Ниже мой класс HttpClient:

public class HttpClient {
    private String uri;
    private int port;
    private String payload;

    public HttpClient(String uri, int port, String payload) {
        this.uri = uri;
        this.port = port;
        this.payload = payload;
    }

    public void run() throws Exception {
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        try {
            Bootstrap b = new Bootstrap();
            b.group(workerGroup);
            b.channel(NioSocketChannel.class);
            b.option(ChannelOption.SO_KEEPALIVE, true);
            b.handler(new ChannelInitializer<SocketChannel>() {
                @Override
                public void initChannel(SocketChannel ch) throws Exception {
                    ch.pipeline().addLast(new HttpClientCodec());
                    ch.pipeline().addLast(new HttpObjectAggregator(1048576));
                    ch.pipeline().addLast(new SimpleChannelInboundHandler<FullHttpResponse>() {
                        @Override
                        protected void channelRead0(ChannelHandlerContext ctx, FullHttpResponse msg) throws Exception {
                            final String echo = msg.content().toString(CharsetUtil.UTF_8);
                            System.out.println(echo);
                        }
                    });
                    ch.pipeline().addLast(new HttpRequestEncoder());
                }
            });

            HttpRequest request = HttpRequester.createRequest(this.uri, this.payload);
            request.headers().set(HttpHeaderNames.CONTENT_TYPE, "application/json");
            System.out.println("Sending message!");
            Channel f = b.connect(uri, port).sync().channel();
            f.writeAndFlush(request);
            f.closeFuture().sync();
            System.out.println("Message was sent!");
        } finally {
            workerGroup.shutdownGracefully();
        }
    }
}

, когда я запускаю это, печатается журнал «Отправка сообщения», но никогда не печатается «Сообщение было отправлено».Кроме того, netcat показывает, что соединение с процессом было принято, но никогда не показывает сообщение.

...