2015-10-26 3 views
0

Вот моя ситуация:Нетти - Отправка POST запросов

  1. Клиент отправляет запрос POST на Нетти Server.
  2. Netty обрабатывает запрос POST и Если сервер определяет, что ответ необходимо отправить Он отправляет ответ клиенту. Else Сервер должен отправить запрос POST в другую конечную точку, получить ответ и отправить ответ обратно клиенту.

Пока у меня есть входящий запрос POST. Чтобы отправить исходящий запрос POST, это то, что я делаю в своем обработчике.

private void sendHttpPost(String input, ChannelHandlerContext ctx) { 
     try { 
      String url = "http://localhost"; 
      URI uri = new URI(url); 
      Bootstrap b = new Bootstrap(); 
      b.group(new NioEventLoopGroup()) 
      .channel(NioServerSocketChannel.class) 
      .handler(new PostRequestHandler()) 
      .option(ChannelOption.AUTO_READ, false); 
      Channel f = b.connect("REMOTE_HOST", 8888).sync().channel();  
      HttpRequest postReq = new DefaultHttpRequest(HttpVersion.HTTP_1_1, 
             HttpMethod.POST, uri.getRawPath()); 
      postReq.headers().set(HttpHeaders.Names.HOST, "localhost"); 
      postReq.headers().set(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.CLOSE); 
      postReq.headers().set(HttpHeaders.Names.CONTENT_TYPE,"application/x-www-form-urlencoded"); 
      f.writeAndFlush(postReq); 

      // Wait for the server to close the connection. 
      f.closeFuture().sync(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     }   
    } 

Это, очевидно, неправильно, потому что я начинаю новый процесс Bootstrap внутри обработчика. Однако я не могу отправить HttpRequest без канала. Я не могу повторно использовать существующий канал в ChannelHandlerContext.

Каков правильный способ сделать это? Как я могу разблокировать новый HttpPostRequest. Любая помощь будет оценена.

+0

Вы не можете использовать существующий канал для подключения к другому серверу с тех пор, как этот канал уже подключен к вашему оригинальному клиенту. Я не вижу ничего плохого в этом коде. И согласно вашему требованию, самонастраивание клиента в обработчике сервера вполне нормально. У вас эта программа работает правильно? – Sudheera

+0

@Sudheera я получаю unsupportedoperation исключение, и этот код не работает .java.lang.UnsupportedOperationException \t в io.netty.channel.socket.nio.NioServerSocketChannel.doConnect (NioServerSocketChannel.java:135) \t при гипергликемии. netty.channel.nio.AbstractNioChannel $ AbstractNioUnsafe.connect (AbstractNioChannel.java:172) \t в io.netty.channel.DefaultChannelPipeline $ HeadHandler.connect (DefaultChannelPipeline.java:1003) \t в io.netty.channel.DefaultChannelHandlerContext. invokeConnect0 (DefaultChannelHandlerContext.java:527) (не может вставить полную трассировку стека) –

+0

вы можете разместить здесь полный класс обработчика? – Sudheera

ответ

0

Используйте .channel(NioSocketChannel.class) вместо .channel(NioServerSocketChannel.class) в вашем загрузочном коде клиента. Вот и все.

+0

Спасибо @Sudheera, это сработало. –

Смежные вопросы