Netty+XML协议栈开发-Http服务

Netty+XML协议栈开发-Http服务

Tags: Netty

摘要

Netty,XML协议栈开发,http服务,JiBx序列化,反序列化

接上文

上一节中解释了,JiBx如何实现XML和Java对象之间的序列化,反序列化。
有了这个基础,就可以使用Netty的Http传递数据了。

Http+XML协议栈流程

  1. 构造客户端请求,将请求消息编码为Http+XML格式。
    (HttpXmlRequestEncoder)

  2. Http客户端发起连接,通过Http协议栈发送Http请求消息。
    (HttpXmlClientHandle.java channelActive(ChannelHandlerContext ctx) 方法)

  3. Http服务器端对Http+XML请求消息解码,解码成HttpXmlRequest对象
    (HttpXmlRequestDecoder)

  4. Http服务器端构造应答消息并编码,通过Http+XML方式返回给客户端
    (HttpXmlResponseEncoder)

  5. 客户端对Http+XML响应消息进行解码,解码成对象HttpXmlResponse
    HttpXmlResponseDecoder

书中代码错误

HttpXmlResponseDecoder.java中定义如下

public class HttpXmlResponseDecoder extends
        AbstractHttpXmlDecoder<DefaultFullHttpResponse> {
        ......

这样是错误的,因为HttpXmlResponse 中的response是FullHttpResponse
而不是DefaultFullHttpResponse。所以会导致泛型不匹配。看到的结果就是客户端请求成功,服务器端也收到数据,通过httpwatch也能观察到返回数据,但是HttpXmlClientHandle中的messageReceived方法始终不会被调用。

所以应该改成下面的样子。

public class HttpXmlResponseDecoder extends
        AbstractHttpXmlDecoder<FullHttpResponse> {
        ......

运行效果

先启动Server

再启动客户端,可以看到客户端已经收到返回的数据

当然在这之前,服务器端也正常收到数据了。

演示代码地址

https://coding.net/u/javacore/p/netty-http/git/tree/master/src/main/java/netty_http_xml

书中的代码不可尽信

https://github.com/hannibalhuang/nettybooksource