【问题标题】:Netty Decoder for specific Xml Tags特定 Xml 标签的 Netty 解码器
【发布时间】:2019-01-15 19:26:57
【问题描述】:

我正在尝试使用运行 TCP 服务器的 netty 创建一个 TCP 服务器,侦听传入的 xml 字符串并将任何接收到的 xml 发送到所有打开的连接。

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 组。

有什么想法吗?对不起,如果我想要做的有点令人困惑。

【问题讨论】:

    标签: java xml tcp client-server netty


    【解决方案1】:

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

    【讨论】:

    • 你能澄清你的意思吗?有专门处理 xml 的组吗?编辑:澄清一下,我尝试过 StringDecoder 和 XmlDecoder,但实际上我根本没有得到任何数据。我认为这是因为它正在等待 xmls 而忽略其他所有内容。
    猜你喜欢
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 2018-04-12
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多