Netty怎么传输很长的xml字符串
条件:
1. 例如xml有10000个字符
2. 使用StringDecoder和StringEncoder
当传递这个xml字符串时,由于太长,会被当作多条消息来处理,即一次性得不到整个xml的内容。
解决方法:
1. 自己实现通讯协议,在消息头加上消息的长度。
缺点,使用如telnet测试的时候,由于没法在输入的字符串里加入消息长度而得到不服务器的反馈,
再如用HTTP等直接访问得到的消息是:消息长度头+消息内容,也没法直接使用。
只能在自己的程序之间使用这种协议, 不能提供给第三方直接访问,例如在浏览器里使用AJAX返回xml。
2. 有没有更好的办法(或者netty已经提供,但是我没找到),即不需要如1那样自定义消息的格式,
而又能传递大的字符串,像浏览器那样使用AJAX向服务器请求一个大的xml字符串,我们得到的是一个完整的xml,而没有产生分包粘包的现象。
------解决方案--------------------等高手把。。。。
------解决方案--------------------我们以前碰到过类似的问题,不过不用NETTY,不过这个应该跟通信库关系不大吧?能不能试试用gzip压缩后发送?
------解决方案--------------------
------解决方案--------------------其实我不是很明白问题在哪里,当然我没用过netty,也许理解有偏差
按我理解,telnet用的是deliminator方式来区分消息,如果你的xml是字符编码,应该可以通过返回xml文件本身和消息分隔符做到。http本身是一个有content-length的协议,ajax测试的话你的xml sender只是需要设置相应的html response头部,然后把xml追加入数据区即可。我猜telnet才是你真正需要做base64的原因。不过好消息是,你可能不需要base64转码。如果你打算用utf-8,就不需要base64了。
其实如果是我做这个项目,我会写一个转码adapter,不管是两个程序还是作为一个组件。你懂的。这样最灵活
------解决方案--------------------
我说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应该也同样能传输并显示
------解决方案--------------------不会,过来学习.
------解决方案--------------------嘛,解决了就好