日期:2014-05-20  浏览次数:20829 次

Netty怎么传输很长的xml字符串
条件:
1. 例如xml有10000个字符
2. 使用StringDecoder和StringEncoder

当传递这个xml字符串时,由于太长,会被当作多条消息来处理,即一次性得不到整个xml的内容。

解决方法:
1. 自己实现通讯协议,在消息头加上消息的长度。
    缺点,使用如telnet测试的时候,由于没法在输入的字符串里加入消息长度而得到不服务器的反馈,
    再如用HTTP等直接访问得到的消息是:消息长度头+消息内容,也没法直接使用。
    只能在自己的程序之间使用这种协议, 不能提供给第三方直接访问,例如在浏览器里使用AJAX返回xml。

2. 有没有更好的办法(或者netty已经提供,但是我没找到),即不需要如1那样自定义消息的格式,
    而又能传递大的字符串,像浏览器那样使用AJAX向服务器请求一个大的xml字符串,我们得到的是一个完整的xml,而没有产生分包粘包的现象。
netty

------解决方案--------------------
等高手把。。。。
------解决方案--------------------
我们以前碰到过类似的问题,不过不用NETTY,不过这个应该跟通信库关系不大吧?能不能试试用gzip压缩后发送?
------解决方案--------------------


引用:
有个折中的办法,先对xml的内容使用base64编码,然后使用pipeline.addLast("frameDecoder", new DelimiterBasedFrameDecoder(1024, Delimiters.lineDelimiter()));
这样也可以解决长字符串的问题,但是更多的网络流量,Telnet等也可以进行测试。

------解决方案--------------------
其实我不是很明白问题在哪里,当然我没用过netty,也许理解有偏差
按我理解,telnet用的是deliminator方式来区分消息,如果你的xml是字符编码,应该可以通过返回xml文件本身和消息分隔符做到。http本身是一个有content-length的协议,ajax测试的话你的xml sender只是需要设置相应的html response头部,然后把xml追加入数据区即可。我猜telnet才是你真正需要做base64的原因。不过好消息是,你可能不需要base64转码。如果你打算用utf-8,就不需要base64了。

其实如果是我做这个项目,我会写一个转码adapter,不管是两个程序还是作为一个组件。你懂的。这样最灵活

------解决方案--------------------
引用:
Quote: 引用:

其实我不是很明白问题在哪里,当然我没用过netty,也许理解有偏差
按我理解,telnet用的是deliminator方式来区分消息,如果你的xml是字符编码,应该可以通过返回xml文件本身和消息分隔符做到。http本身是一个有content-length的协议,ajax测试的话你的xml sender只是需要设置相应的html response头部,然后把xml追加入数据区即可。我猜telnet才是你真正需要做base64的原因。不过好消息是,你可能不需要base64转码。如果你打算用utf-8,就不需要base64了。

其实如果是我做这个项目,我会写一个转码adapter,不管是两个程序还是作为一个组件。你懂的。这样最灵活

如果你打算用utf-8,就不需要base64了。
UTF-8与Base64不是同一个范畴的东西,互不矛盾。

1. http本身是一个有content-length的协议
2. telnet用的是deliminator方式来区分消息

嗯,问题在这里,想统一起来处理,估计不行,对网络协议了解得不是很多,所以很多软件即要提供自己的通讯协议又同时要提供HTTP服务。

我说utf-8不需要base64是因为xml本身是文本,而utf-8的编码中不包含telnet协议中使用的特殊字节。有可能是我理解错了,你的base64不是这个用途?

应用层的网络协议里面,deliminator和content-length是两种截然不同的协议,在我做过的项目中没有统一的解决方案,只能提供多个外部接口协议了。
不知道有没有“大统一”协议的思路,我想不到
------解决方案--------------------
你可以去看看IBM的WebSphere MQ,我们现在做的项目的网络传输就是使用MQ队列实现的,传输的也是xml报文。我们定义最大可以传输20M大小的xml数据。应该可以解决绝大部分的问题了。
------解决方案--------------------
其实我没玩过telnet,大致看了一下这里http://support.microsoft.com/kb/231866/zh-cn,下面有几个例子,客户端貌似显示了中文并包括换行符,所以我理解xml应该也同样能传输并显示
------解决方案--------------------
不会,过来学习.
------解决方案--------------------
嘛,解决了就好