一个xmpp协议的解析
  <iq id='yhc13a95' type='set'>
     <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'>
       <resource>balcony</resource>
     </bind>
   </iq>
   <message from='[email protected]/balcony'
            id='ju2ba41c'
            to='[email protected]'
            type='chat'
            xml:lang='en'>
     <body>Art thou not Romeo, and a Montague?</body>
   </message>在长连接里,需要分成iq和message两个包,想实现一个xml格式的协议解析,没接触过,不知道如何入手。最好是实现通用的xml解析,如果有难度,那么实现固定的</iq>、</message>等结尾如何实现,或者有没有介绍一下如何访问socket接收缓冲区的原理的文章也行。

解决方案 »

  1.   

    用json撒   添加一个json.net
    添加你的 IP  和 Msg  还可以添加其他什么用户之类的信息
    通过json获取某一个key,它的value不就是你要的
      

  2.   

    不就是传输过程中一种格式,是自己定义格式,推荐json。方便好用,可以简化很多。
    如果别人写的,你来发送信息的,那格式就已经被别人定死了
      

  3.   

    这是xmpp协议,协议就是说用xml格式来发数据,所以没有包长度的概念,需要自己判断xml节是否结束,可长可短,有子元素,可嵌套。我就是想通过读取缓冲区,判断是否一个xml节结束了,不知道怎么写。
      

  4.   

    这个xml是字符串我知道,接收缓冲区里当然是字节流,是utf8编码的字节流。
      

  5.   

    传输不都是要转换byte[]发送的
    只是之前生成的格式是一个XML,还是字符串,你是吧这个字符串转换成byte[]发送撒
    你转换完成之后,获取这个byte[]的长度
    新建一个 byte[] resultData = new byte[8 + data.Length];
    前8个byte存储你的XML长度,位数不到用“0"补齐
    获取时候先获取8位长度的byte得到总长度,再获取这个长度的值
    不就你要的XML
    还有一种就是每次获取固定长度,遇到结尾是</xml>就表示是一个完整的XML
      

  6.   

    唉,这个xmpp协议是个开放协议,我是做服务器端,怎么能要求客户端加一个长度信息呢,况且xml格式本身已经包含结束信息了。
      

  7.   

    收到的内容压队列,有收到数据的时候循环尝试去取固定的结尾,比如"</xml>",取到队列不再有内容为止
      

  8.   


    这是个大道理,我就是不太明白细节,缓冲区是给什么概念,环形的吗?读取以后自动自动指针的?xml的结尾并不固定,那是不是还要循环比较,是要转换为字节在比较吗?比较的时候读取缓冲区是不是就把指针移动了,那是不是还要另外备份一份读取出来的字节?
      

  9.   

    每次while循环不是要先定义一个比如byte[1024]缓冲吗
    循环每次得到的值去判断有没</xml> 结束符,有就是一个XML
    之后还有值 就是下一个XML了撒
      

  10.   

    .net框架中默认内置的xml解析并不支持这类操作。你可以选择第三方的 forward-only 模式的解析器。
      

  11.   

    你可以搜索一种.net下可用的开源Sax分析器。这类分析器的特点是,可以给一个stream参数就立刻开始分析(不等stream关闭),并且每当分析出一个节点时就会采取事件通知的方式让你的程序立刻响应。