1

ClientBootstrapを使用してクライアントモードでnettyを使用しています。ほとんどの場合、メッセージを受信しようとすると正常に動作し、本文のみが返されますが、message.getContent()を呼び出すと、コンテンツ内にヘッダーが返されることがあります(サーバーは常に同じ応答を返します)。

Content-type: text/xml;charset=windows-1251
Content-length: 649
Connection: keep-alive

<?xml version="1.0" encoding="windows-1251"?>
<response>
  <status>
    <code>0</code>
  </status>
  <detail>

明らかに、それはhttpリクエストの本文のみである必要があります。そして、本文でヘッダー部分を返す場合、本文部分自体はヘッダーのサイズによってカットされます。

これが私のPipileniFactoryです:

public ChannelPipeline getPipeline() throws Exception {
    ChannelPipeline pipeline = pipeline();
    if (isSecure) {
        SSLContext clientContext = SSLContext.getInstance("TLS");
        clientContext.init(null, new TrustManager[]{DUMMY_TRUST_MANAGER}, null);
        SSLEngine engine = clientContext.createSSLEngine();
        engine.setUseClientMode(true);
        pipeline.addLast("ssl", new SslHandler(engine));
    }

    pipeline.addLast("codec", new HttpClientCodec());
    pipeline.addLast("aggregator", new HttpChunkAggregator(1048576));
    pipeline.addLast("timeout", new ReadTimeoutHandler(timer, timeout, TimeUnit.MILLISECONDS));
    pipeline.addLast("handler", ibConnectorHandler);
    return pipeline;
}

そして、これがibConnectorHandlerから受信したmessageReceivedです。

public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
    logger.info("Received");

    HttpResponse response = (HttpResponse) e.getMessage();
    ChannelBuffer resContent = response.getContent();
    byte[] content = null;
    if (resContent.readable()) {
        content = Arrays.copyOf(resContent.array(), resContent.readableBytes());
        logger.debug(Arrays.toString(req.getParams().toArray()) + "----------" + new String(content));
    }

}

私はnetty3.5.8を使用しています。

UPDすべてが正しい場合、resContentはinstanceoforg.jboss.netty.buffer.BigEndianHeapChannelBufferです。また、ヘッダーが表示されている場合、resContentはinstanceoforg.jboss.netty.buffer.SlicedChannelBufferです。したがって、nettyがhttpメッセージのコンテンツにorg.jboss.netty.buffer.SlicedChannelBufferを使用した場合に問題が発生します。

4

1 に答える 1

2

「Arrays.copyOf(resContent.array()、resContent.readableBytes())」では、配列のオフセットを尊重しません。ChannelBuffer.arrayOffset()+ ChannelBuffer.readerIndex();から取得できるオフセットも渡す必要があります。

参照:http ://static.netty.io/3.5/api/org/jboss/netty/buffer/ChannelBuffer.html#arrayOffset ()

于 2012-10-10T15:27:31.327 に答える