XML over TCP

本文介绍了一种在TCP上传输XML消息的有效方法。通过检查XML的根节点和结束标签,可以确定消息是否完整接收。这种方法适用于只有一个根节点且格式固定的XML消息。

当我们在TCP上传输XML消息时,我们会遇到一点麻烦,因为我们很难根据XML协议去判断一条消息是否结束。

如果要完整的支持XML over TCP,只有两种办法:

1,加一个header去标明数据的长度

2,加一个delimiter去标明数据的结束

这两种方法都不够优雅。我们不需要一个通用的方法,我们只要一个最适合我们的方法。

通常,我们能够自定义数据的格式,而且我们通常一条消息只有一个root node,那么我们可以试试下面的函数:

//return length of the xml message //return -1 for invalid data //return 0 for not fully received int GetXmlLen(string buf, string rootName) { string head = "<" + rootName; if (buf.Length < head.Length) { //not fully recved return 0; } if (!buf.StartsWith(head)) { //invalid return -1; } int idx = buf.IndexOf('>'); if (idx < 0) { //not fully recved return 0; } if (buf[idx-1] == '/') { //empty root element return (idx + 1); } string tail = "</" + rootName + ">"; idx = buf.IndexOf(tail); if (idx < 0) { //not fully recved return 0; } return (idx + tail.Length); }

要求:XML消息只有一个root node,rootName不是任何子节点的名字,而且消息是以"/>"或者"</rootName>"结尾。

这并不是很苛刻的要求,大多数基于XML的协议实际上就是这样的。

如果你的XML协议满足上述要求,那么当你在TCP上传输XML的时候,就可以试试我的函数。

PS:这个示例函数是用C#写的,用其他语言也很容易实现同样的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值