You should check if there are any write errors as at the moment you only check if the write was successfully or not.
> On 18 Nov 2016, at 11:19, Cheng Ju <[email protected]> wrote: > > Hi everyone. I wrote a HTTP client using netty. But it can only send 100 > requests despite how many requests are written to the channel. For example > if I send 500 requests, an callback print the number on write complete tells > that 500 requests are written out, but nginx only get 100 of them and > returned 100 responses. Not sure what I missed. This seems to be some > configuration I didn't notice or there is a bug in my code I can't see. > > > My JDK and OS: > Apache Maven 3.3.9 > Java version: 1.8.0_112, vendor: Oracle Corporation > OS name: "windows 7", version: "6.1", arch: "amd64", family: "dos" > Netty: 4.1.6.Final > > How to test: > 1. Run ab -c10 -n10000 http://localhost/ <http://localhost/> proves nginx is > fine. > 2. Run the code against nginx and check program's log, find log line "written > 499" means 500 requests are written. Find "200 OK 100" means only 100 > respons with http status code 200. But check nginx access_log, only 100 > request are received by nginx. > > Here is my code: > > package demo; > > import io.netty.bootstrap.Bootstrap; > import io.netty.channel.Channel; > import io.netty.channel.ChannelDuplexHandler; > import io.netty.channel.ChannelFuture; > import io.netty.channel.ChannelHandlerContext; > import io.netty.channel.ChannelInitializer; > import io.netty.channel.ChannelOption; > import io.netty.channel.ChannelPromise; > import io.netty.channel.EventLoopGroup; > import io.netty.channel.SimpleChannelInboundHandler; > import io.netty.channel.WriteBufferWaterMark; > import io.netty.channel.nio.NioEventLoopGroup; > import io.netty.channel.socket.SocketChannel; > import io.netty.channel.socket.nio.NioSocketChannel; > import io.netty.handler.codec.http.DefaultFullHttpRequest; > import io.netty.handler.codec.http.FullHttpRequest; > import io.netty.handler.codec.http.FullHttpResponse; > import io.netty.handler.codec.http.HttpClientCodec; > import io.netty.handler.codec.http.HttpHeaderNames; > import io.netty.handler.codec.http.HttpHeaderValues; > import io.netty.handler.codec.http.HttpMethod; > import io.netty.handler.codec.http.HttpObjectAggregator; > import io.netty.handler.codec.http.HttpVersion; > import io.netty.util.concurrent.DefaultThreadFactory; > import io.netty.util.concurrent.Future; > import io.netty.util.concurrent.GenericFutureListener; > > import java.io.IOException; > import java.util.concurrent.atomic.AtomicInteger; > > public class HttpClient { > private EventLoopGroup group; > private Channel channel; > > public static void main(String[] args) throws InterruptedException, > IOException { > String host = "127.0.0.1"; > int port = 80; > int count = 500; > > EventLoopGroup group = new NioEventLoopGroup(1, new > DefaultThreadFactory("http-client-v1")); > HttpClient client = new HttpClient(group); > client.open(host, port); > for (int i = 0; i < count; i++) { > if (!client.isWritable()) { > Thread.sleep(5000); > } > > if (client.isWritable()) { > System.out.println("send " + i); > > FullHttpRequest getRequest = new DefaultFullHttpRequest( > HttpVersion.HTTP_1_1, > HttpMethod.GET, > "/"); > getRequest.headers().set(HttpHeaderNames.CONTENT_TYPE, > HttpHeaderValues.TEXT_PLAIN); > getRequest.headers().set(HttpHeaderNames.HOST, host + ":" + > "port"); > client.write(getRequest); > } > } > > System.out.println("done"); > System.in.read(); > client.close(); > System.out.println("close"); > } > > public HttpClient(EventLoopGroup group) { > this.group = group; > } > > public void open(String host, int port) { > Bootstrap b = new Bootstrap() > .group(group) > .channel(NioSocketChannel.class) > .option(ChannelOption.SO_SNDBUF, 128 * 1024 * 1024) > .option(ChannelOption.SO_RCVBUF, 128 * 1024 * 1024) > .option(ChannelOption.SO_REUSEADDR, false) > .option(ChannelOption.SO_KEEPALIVE, true) > .option(ChannelOption.WRITE_BUFFER_WATER_MARK, new > WriteBufferWaterMark(32 * 1024 * 1024, 128 * 1024 * 1024)) > .remoteAddress(host, port) > .handler(new ChannelInitializer<SocketChannel>() { > @Override > protected void initChannel(SocketChannel ch) throws > Exception { > ch.pipeline() > .addLast(new LogHandler()) > .addLast(new HttpClientCodec()) > .addLast(new HttpObjectAggregator(128 * 1024 > * 1024)) > .addLast(new ClientHandler()); > } > }); > channel = b.connect().syncUninterruptibly().channel(); > System.out.println("connected"); > } > > public void close() { > try { > channel.closeFuture().syncUninterruptibly(); > } catch (Exception e) { > e.printStackTrace(); > } > } > > public boolean isWritable() { > return channel.isWritable(); > } > > public ChannelFuture write(FullHttpRequest request) { > return channel.writeAndFlush(request); > } > > private static class ClientHandler extends > SimpleChannelInboundHandler<FullHttpResponse> { > AtomicInteger id = new AtomicInteger(); > > @Override > protected void channelRead0(ChannelHandlerContext ctx, > FullHttpResponse msg) throws Exception { > System.out.println(msg.status() + ", " + id.incrementAndGet()); > } > > @Override > public void exceptionCaught(ChannelHandlerContext ctx, Throwable > cause) throws Exception { > cause.getCause().printStackTrace(); > } > } > > private static class LogHandler extends ChannelDuplexHandler { > AtomicInteger id = new AtomicInteger(); > > @Override > public void write(ChannelHandlerContext ctx, Object msg, > ChannelPromise promise) throws Exception { > super.write(ctx, msg, promise.addListener(new > GenericFutureListener<Future<? super Void>>() { > @Override > public void operationComplete(Future<? super Void> future) > throws Exception { > if (future.isSuccess()) { > System.out.println("written " + id.incrementAndGet()); > } > } > })); > } > } > } > > > > > > -- > You received this message because you are subscribed to the Google Groups > "Netty discussions" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected] > <mailto:[email protected]>. > To view this discussion on the web visit > https://groups.google.com/d/msgid/netty/CAAmVRwaoZ173RUUh15Pi6qyJFgfdFbWA2_cwg1ZwJdAm3tdjaw%40mail.gmail.com > > <https://groups.google.com/d/msgid/netty/CAAmVRwaoZ173RUUh15Pi6qyJFgfdFbWA2_cwg1ZwJdAm3tdjaw%40mail.gmail.com?utm_medium=email&utm_source=footer>. > For more options, visit https://groups.google.com/d/optout > <https://groups.google.com/d/optout>. -- You received this message because you are subscribed to the Google Groups "Netty discussions" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/netty/C3A55AE4-04A9-4970-A8D3-3FDD69B5B8E0%40googlemail.com. For more options, visit https://groups.google.com/d/optout.
