java - Keep client from closing connection to a netty server (is there something I need to set)? -
i'm debugging problem netty proxy i'm writing, , i've noticed if skip 'proxy' aspect , implement simple http server , send 2 requests serially commons httpclient, commons httpclient closes connection , second request made in different connection. if proxy request on other hand, second request uses same connection, 'connection reset' exception when try write response second request client's channel.
code pipeline , basic handler:
channelfactory factory = new nioserversocketchannelfactory( executors.newcachedthreadpool(), executors.newcachedthreadpool()); serverbootstrap sb = new serverbootstrap(factory); sb.setpipelinefactory(new channelpipelinefactory() { public channelpipeline getpipeline() { return channels.pipeline( new httprequestdecoder(), new httpresponseencoder(), new requesthandler()); } }); private static class requesthandler extends simplechannelhandler { @override public void messagereceived(channelhandlercontext ctx, final messageevent e) { httpresponse clientresponse = new defaulthttpresponse(httpversion.http_1_1, httpresponsestatus.ok); clientresponse.setheader(httpheaders.names.content_type, "text/html; charset=utf-8"); clientresponse.setcontent(channelbuffers.wrappedbuffer(new byte[] {1, 2, 3})); system.out.println("here: " + e.getchannel()); e.getchannel().write(clientresponse); } } here tcpdump on port 2080 showing client closing connection (open-handshake, push, push, close-handshake, open-handshake, push, push, close-handshake):
[master] sudo tcpdump -i '(port 2080)' tcpdump: verbose output suppressed, use -v or -vv full protocol decode listening on any, link-type linux_sll (linux cooked), capture size 65535 bytes 15:13:22.396482 ip localhost.localdomain.45724 > localhost.localdomain.autodesk-nlm: flags [s], seq 3122841582, win 32792, options [mss 16396,sackok,ts val 880723828 ecr 0,nop,wscale 7], length 0 15:13:22.396499 ip localhost.localdomain.autodesk-nlm > localhost.localdomain.45724: flags [s.], seq 604436385, ack 3122841583, win 32768, options [mss 16396,sackok,ts val 880723829 ecr 880723828,nop,wscale 7], length 0 15:13:22.396511 ip localhost.localdomain.45724 > localhost.localdomain.autodesk-nlm: flags [.], ack 1, win 257, options [nop,nop,ts val 880723829 ecr 880723829], length 0 15:13:22.406805 ip localhost.localdomain.45724 > localhost.localdomain.autodesk-nlm: flags [p.], seq 1:1600, ack 1, win 257, options [nop,nop,ts val 880723839 ecr 880723829], length 1599 15:13:22.406817 ip localhost.localdomain.autodesk-nlm > localhost.localdomain.45724: flags [.], ack 1600, win 256, options [nop,nop,ts val 880723839 ecr 880723839], length 0 15:13:22.446068 ip localhost.localdomain.autodesk-nlm > localhost.localdomain.45724: flags [p.], seq 1:63, ack 1600, win 256, options [nop,nop,ts val 880723878 ecr 880723839], length 62 15:13:22.446083 ip localhost.localdomain.45724 > localhost.localdomain.autodesk-nlm: flags [.], ack 63, win 257, options [nop,nop,ts val 880723878 ecr 880723878], length 0 15:13:22.449192 ip localhost.localdomain.45724 > localhost.localdomain.autodesk-nlm: flags [f.], seq 1600, ack 63, win 257, options [nop,nop,ts val 880723881 ecr 880723878], length 0 15:13:22.449360 ip localhost.localdomain.autodesk-nlm > localhost.localdomain.45724: flags [f.], seq 63, ack 1601, win 256, options [nop,nop,ts val 880723881 ecr 880723881], length 0 15:13:22.449371 ip localhost.localdomain.45724 > localhost.localdomain.autodesk-nlm: flags [.], ack 64, win 257, options [nop,nop,ts val 880723881 ecr 880723881], length 0 15:13:22.449716 ip localhost.localdomain.35737 > localhost.localdomain.autodesk-nlm: flags [s], seq 929672323, win 32792, options [mss 16396,sackok,ts val 880723882 ecr 0,nop,wscale 7], length 0 15:13:22.449729 ip localhost.localdomain.autodesk-nlm > localhost.localdomain.35737: flags [s.], seq 1626218986, ack 929672324, win 32768, options [mss 16396,sackok,ts val 880723882 ecr 880723882,nop,wscale 7], length 0 15:13:22.449737 ip localhost.localdomain.35737 > localhost.localdomain.autodesk-nlm: flags [.], ack 1, win 257, options [nop,nop,ts val 880723882 ecr 880723882], length 0 15:13:22.449986 ip localhost.localdomain.35737 > localhost.localdomain.autodesk-nlm: flags [p.], seq 1:1600, ack 1, win 257, options [nop,nop,ts val 880723882 ecr 880723882], length 1599 15:13:22.449992 ip localhost.localdomain.autodesk-nlm > localhost.localdomain.35737: flags [.], ack 1600, win 256, options [nop,nop,ts val 880723882 ecr 880723882], length 0 15:13:22.453566 ip localhost.localdomain.autodesk-nlm > localhost.localdomain.35737: flags [p.], seq 1:63, ack 1600, win 256, options [nop,nop,ts val 880723886 ecr 880723882], length 62 15:13:22.453582 ip localhost.localdomain.35737 > localhost.localdomain.autodesk-nlm: flags [.], ack 63, win 257, options [nop,nop,ts val 880723886 ecr 880723886], length 0 15:13:22.475867 ip localhost.localdomain.35737 > localhost.localdomain.autodesk-nlm: flags [f.], seq 1600, ack 63, win 257, options [nop,nop,ts val 880723908 ecr 880723886], length 0 15:13:22.475998 ip localhost.localdomain.autodesk-nlm > localhost.localdomain.35737: flags [f.], seq 63, ack 1601, win 256, options [nop,nop,ts val 880723908 ecr 880723908], length 0 15:13:22.476012 ip localhost.localdomain.35737 > localhost.localdomain.autodesk-nlm: flags [.], ack 64, win 257, options [nop,nop,ts val 880723908 ecr 880723908], length 0 here happens if use proxy, saves channel messagereceived(), , looks channel little later write response. note here channel not closed, instead reset client, leading ioexception 'connection reset':
[master] sudo tcpdump -i '(port 2080)' tcpdump: verbose output suppressed, use -v or -vv full protocol decode listening on any, link-type linux_sll (linux cooked), capture size 65535 bytes 15:11:02.055316 ip localhost.localdomain.58266 > localhost.localdomain.autodesk-nlm: flags [s], seq 1055230627, win 32792, options [mss 16396,sackok,ts val 880583487 ecr 0,nop,wscale 7], length 0 15:11:02.055333 ip localhost.localdomain.autodesk-nlm > localhost.localdomain.58266: flags [s.], seq 596566447, ack 1055230628, win 32768, options [mss 16396,sackok,ts val 880583487 ecr 880583487,nop,wscale 7], length 0 15:11:02.055344 ip localhost.localdomain.58266 > localhost.localdomain.autodesk-nlm: flags [.], ack 1, win 257, options [nop,nop,ts val 880583487 ecr 880583487], length 0 15:11:02.066169 ip localhost.localdomain.58266 > localhost.localdomain.autodesk-nlm: flags [p.], seq 1:1600, ack 1, win 257, options [nop,nop,ts val 880583498 ecr 880583487], length 1599 15:11:02.066188 ip localhost.localdomain.autodesk-nlm > localhost.localdomain.58266: flags [.], ack 1600, win 256, options [nop,nop,ts val 880583498 ecr 880583498], length 0 15:11:02.071439 ip localhost.localdomain.autodesk-nlm > localhost.localdomain.58266: flags [p.], seq 1:1568, ack 1600, win 256, options [nop,nop,ts val 880583503 ecr 880583498], length 1567 15:11:02.071450 ip localhost.localdomain.58266 > localhost.localdomain.autodesk-nlm: flags [.], ack 1568, win 256, options [nop,nop,ts val 880583503 ecr 880583503], length 0 15:11:02.076384 ip localhost.localdomain.58266 > localhost.localdomain.autodesk-nlm: flags [p.], seq 1600:3199, ack 1568, win 256, options [nop,nop,ts val 880583508 ecr 880583503], length 1599 15:11:02.080625 ip localhost.localdomain.autodesk-nlm > localhost.localdomain.58266: flags [p.], seq 1568:3135, ack 3199, win 256, options [nop,nop,ts val 880583513 ecr 880583508], length 1567 15:11:02.102018 ip localhost.localdomain.58266 > localhost.localdomain.autodesk-nlm: flags [r.], seq 3199, ack 3135, win 256, options [nop,nop,ts val 880583534 ecr 880583513], length 0 is there i'm missing in handler keep client closing connection?
edit: reading response seems cause connection reset go away , connection torn down normally. idea why println prevents connection reset after second request?
httpclient.executemethod(method); system.out.println(method.getresponsebodyasstring());
your handler sending http v1.1 response keep-alive default connection type, long client expecting v1.1 , not v1.0, , behaves correctly, shouldn't have more indicate client keep connection open.
if client expecting http v1.0 add "connection: keep-alive" header.
Comments
Post a Comment