请问在长连接的socket里如何获取xml格式的数据

hztltgg 2013-04-15 08:55:56
一个xmpp协议的解析
  <iq id='yhc13a95' type='set'>
<bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'>
<resource>balcony</resource>
</bind>
</iq>
<message from='juliet@im.example.com/balcony'
id='ju2ba41c'
to='romeo@example.net'
type='chat'
xml:lang='en'>
<body>Art thou not Romeo, and a Montague?</body>
</message>

在长连接里,需要分成iq和message两个包,想实现一个xml格式的协议解析,没接触过,不知道如何入手。

最好是实现通用的xml解析,如果有难度,那么实现固定的</iq>、</message>等结尾如何实现,或者有没有介绍一下如何访问socket接收缓冲区的原理的文章也行。


...全文
299 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
随风suifeng 2013-04-17
  • 打赏
  • 举报
回复
嘿嘿
ewwe1 2013-04-17
  • 打赏
  • 举报
回复
接分
iceMung 2013-04-17
  • 打赏
  • 举报
回复
引用 1 楼 hztltgg 的回复:
看来又要散分了
接分+学习...
三五月儿 2013-04-17
  • 打赏
  • 举报
回复
学习中
  • 打赏
  • 举报
回复
你可以搜索一种.net下可用的开源Sax分析器。这类分析器的特点是,可以给一个stream参数就立刻开始分析(不等stream关闭),并且每当分析出一个节点时就会采取事件通知的方式让你的程序立刻响应。
  • 打赏
  • 举报
回复
.net框架中默认内置的xml解析并不支持这类操作。你可以选择第三方的 forward-only 模式的解析器。
adrianEvin 2013-04-16
  • 打赏
  • 举报
回复
每次while循环不是要先定义一个比如byte[1024]缓冲吗 循环每次得到的值去判断有没</xml> 结束符,有就是一个XML 之后还有值 就是下一个XML了撒
catchdream 2013-04-16
  • 打赏
  • 举报
回复
楼上说的没错。你得定义通讯协议,类似下面的东东,

adrianEvin 2013-04-16
  • 打赏
  • 举报
回复
不就是传输过程中一种格式,是自己定义格式,推荐json。方便好用,可以简化很多。 如果别人写的,你来发送信息的,那格式就已经被别人定死了
cheng2005 2013-04-16
  • 打赏
  • 举报
回复
数据协议和通讯协议是两种东西。 你给的这个是数据协议。而你需要关系的是通讯协议,简单来说,就是你的通讯模块需要知道那些数据是一包。
adrianEvin 2013-04-16
  • 打赏
  • 举报
回复
用json撒 添加一个json.net 添加你的 IP 和 Msg 还可以添加其他什么用户之类的信息 通过json获取某一个key,它的value不就是你要的
hztltgg 2013-04-16
  • 打赏
  • 举报
回复
看来又要散分了
hztltgg 2013-04-16
  • 打赏
  • 举报
回复
引用 10 楼 marclee44 的回复:
收到的内容压队列,有收到数据的时候循环尝试去取固定的结尾,比如"</xml>",取到队列不再有内容为止
这是个大道理,我就是不太明白细节,缓冲区是给什么概念,环形的吗?读取以后自动自动指针的?xml的结尾并不固定,那是不是还要循环比较,是要转换为字节在比较吗?比较的时候读取缓冲区是不是就把指针移动了,那是不是还要另外备份一份读取出来的字节?
Marky 2013-04-16
  • 打赏
  • 举报
回复
收到的内容压队列,有收到数据的时候循环尝试去取固定的结尾,比如"</xml>",取到队列不再有内容为止
hztltgg 2013-04-16
  • 打赏
  • 举报
回复
唉,这个xmpp协议是个开放协议,我是做服务器端,怎么能要求客户端加一个长度信息呢,况且xml格式本身已经包含结束信息了。
adrianEvin 2013-04-16
  • 打赏
  • 举报
回复
传输不都是要转换byte[]发送的 只是之前生成的格式是一个XML,还是字符串,你是吧这个字符串转换成byte[]发送撒 你转换完成之后,获取这个byte[]的长度 新建一个 byte[] resultData = new byte[8 + data.Length]; 前8个byte存储你的XML长度,位数不到用“0"补齐 获取时候先获取8位长度的byte得到总长度,再获取这个长度的值 不就你要的XML 还有一种就是每次获取固定长度,遇到结尾是</xml>就表示是一个完整的XML
hztltgg 2013-04-16
  • 打赏
  • 举报
回复
这个xml是字符串我知道,接收缓冲区里当然是字节流,是utf8编码的字节流。
hztltgg 2013-04-16
  • 打赏
  • 举报
回复
这是xmpp协议,协议就是说用xml格式来发数据,所以没有包长度的概念,需要自己判断xml节是否结束,可长可短,有子元素,可嵌套。我就是想通过读取缓冲区,判断是否一个xml节结束了,不知道怎么写。

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧