使用Netty发送和接收http报文中的一些注意事项
近期看了一些《Netty实战》这本书,看完之后有些云里雾里的,就想写一个简单的http服务端和客户端感受一下,代码不多但是期间还是遇到了一些问题,这里把其中的一些坑记录下来。
Netty自带的编码器解码器
Netty为常用的网络协议准备了编/解码器,但是就像Netty中大多数组件都是有服务端与客户端的区别,编/解码器同样也存在这方面的差异,下面两个是Netty为HTTP准备的
HttpClientCodec //客户端用
HttpServerCodec //服务端用
当时由于copy代码没有注意,在客户端使用了HttpServerCodec,导致了在建立链接之后客户端迟迟没有发送报文(报文未发送的具体原因不明,信息似乎是卡在了HttpServerCodec这里)。
注意content-length
content-length是HTTP头部信息的一个字段,表明body的长度。在最初的代码中,忘记了给该字段赋值,导致服务端收到的FullHttpRequest实体中,content字段没有内容。可以使用以下方法为content-length赋值
request.headers().set(HttpHeaders.Names.CONTENT_LENGTH,request.content().readableBytes());
为HttpResponse设置content
可以通过构造器为FullHttpRequest设置content字段,但是HttpResponse没有类似的构造器。可以通过ChannelHandlerContext.write()方法直接写返回体
HttpResponse response = new DefaultHttpResponse(msg.getProtocolVersion(), HttpResponseStatus.OK);
response.headers().set(HttpHeaders.Names.CONTENT_TYPE,"text/html; charset=UTF-8");
ctx.write(response);
ctx.write(Unpooled.copiedBuffer("This is response", CharsetUtil.UTF_8));
//最后记得flush
ChannelFuture future = ctx.writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT);
future.addListener(ChannelFutureListener.CLOSE);
以上是这次小试验发现的问题,以后有新发现会陆续补充。