用于特定Xml标签的Netty解码器

时间:2018-08-08 13:41:23

标签: java xml tcp client-server netty

我正在尝试使用运行TCP服务器的netty制造TCP服务器,侦听传入的xml字符串,并将接收到的xml发送到所有打开的Connections。

xml始终采用相同的格式(从开始到结束)。

除了处理自己的服务器连接之外,它还打开与第二台服务器的连接,该服务器执行相同的操作并在这两者之间池所有xml。 因此,基本上有一个ServerBootstrap可以侦听来自它侦听的任何Connection的传入XML数据,以及一个由应用程序管理的预定义连接。

我遇到的两个主要问题

a。)正确地侦听数据并根据xml标签定义传入的字符串。 我尝试在管道中使用XmlDecoder,但这似乎无济于事。实际上,我的ServerBootstrap只是不做任何事情而结束,是否应该出于侦听目的而阻塞?

这是我的服务器引导程序

try {
    ServerBootstrap bootstrap = new ServerBootstrap()
            .group(listenGroup, speakingGroup)
            .channel(NioServerSocketChannel.class)
            .localAddress(new InetSocketAddress("127.0.0.1", mListeningPort))
            .childHandler(new ChannelInitializer<SocketChannel>() {
                @Override
                protected void initChannel(SocketChannel ch) throws Exception {
                    ch.pipeline()
                            //.addLast("string-decoder", new StringDecoder())
                            .addLast("xml-decoder", new XmlDecoder())
                            .addLast(new ServerHandler());
                }
            });            
    ChannelFuture channelFuture = bootstrap.bind().syncUninterruptibly();
} finally {
    listenGroup.shutdownGracefully();
    speakingGroup.shutdownGracefully();
}

另一个问题是建立与镜像服务器的连接,并将其添加到ServerBootstrap的输出列表中。我自己对此进行了较少的测试,并且从理论上讲,返回常规ol'Bootstrap的接口应该可以工作,但是我不确定如何保持Bootstrap连接有效,或者以某种方式获取Channel是否更好,以及将其添加到ServerBootstraps组。

有什么想法吗?抱歉,这有点让我困惑。

1 个答案:

答案 0 :(得分:0)

我的猜测是xml解码器不支持您用来定界消息的括号。 (即您实际上不是在发送有效的xml)是否有理由不能仅使用包含整个消息的最外层xml组?