XML over TCP

copy from : http://blog.csdn.net/wwwsq/article/details/5310165

当我们在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#写的,用其他语言也很容易实现同样的功能。

posted @ 2012-05-28 14:50  BinSys  阅读(586)  评论(0编辑  收藏  举报