使用 tcp 套接字在 windows phone 7 上解析 xml 内容

Posted

技术标签:

【中文标题】使用 tcp 套接字在 windows phone 7 上解析 xml 内容【英文标题】:parsing xml content on windows phone 7 using tcp sockets 【发布时间】:2012-01-02 12:38:57 【问题描述】:

我正在开发适用于 Windows Phone 7 的应用程序。

我有一个使用 c# silverlight 中的 tcp 套接字解析 xml 流。我正在尝试使用 xmlreader 和内存流,但它没有帮助。当内存流被接收异步调用更新时,xmlreader 对该读取器没有影响。

请帮助我了解如何解析来自套接字的流式 xml。

我有一个这样的 xmlReader:

memoryStream= new MemoryStream();   
_xmlreader = XmlReader.Create(memoryStream, xmlReaderSettings, context);

现在 memoryStream 更新为:

byte []buffer = "initialized with some xml bytes such as <node1> data </node1>"

因为这个缓冲区由 xml 的套接字接收异步操作填充。 现在我需要更新我的数据。所以我这样做...

memoryStream = memoryStream.write(buffer,0,buffer.length);

现在当我这样做时 _reader.read 失败。我不知道为什么会这样。否则是否有像我们在android os中用于xml解析的xmlpullparser(sax)一样的东西

while (_reader.Read())
            
                switch (_reader.NodeType)
                
                    case XmlNodeType.Element:
                        
                            node = new XElement(_reader.Name);
                            xmlBuildStack.Push(node);

                        
                        break;

                    case XmlNodeType.EndElement:
                  .....

当我正在处理使用 xmpp xml 节的聊天应用程序时,是否有任何其他方法可以解析来自 tcp 套接字流的 xml。请帮我解决这个问题。

【问题讨论】:

嗨 Rakesh,你能试着澄清你的问题吗?您是否已经有一些代码可以分享,以显示您正在尝试做什么?这将使提供建议更容易。 尝试:先填充MemoryStream,再创建XmlReader。同时设置 stream.Position = 0;切换读/写时 我的流是一个 xml,它以碎片形式出现,即来自套接字的数据包。所以我需要用我收到的内容填充我的流。如果我先填充内存流然后创建 xmlreader。它不会完全填充目的。在第一次 receiveAsync 我得到一半的 xml 内容,在下一个 receiveAsyncs 我得到我的 xml需要附加到流中以使其成为正确的 xml 节的内容。如果这不是正确的方法,那我该怎么做。 不能每次收到新缓冲区时都创建一个新的 MemoryStream 和 XmlReader 吗? @KooKiz 实际上是 xml 内容来自 tcp 套接字。通过套接字到达的内容可能不是正确的 xml 内容,即 xml 可以在 2-3 次接收异步调用中到达。 【参考方案1】:

不幸的是,XmlReader 对于 XMPP 几乎毫无用处。它在处理任何输入之前缓冲到 4kB,无论您连接到它的流是什么。

即使是第一次向自己证明这一点,您也不应该编写一个将每个入站节填充到 4kB 的流,而只能在节边界上。

为了解决这个问题,我将 James Clark 的 XP 解析器的部分内容移植到了 C#。如果 LGPL 适合您,您可以将 xpnet 从 jabber-net 中提取出来(我还没有更新以支持 WinPhone7),或者如果您让整个库正常工作,请向我发送补丁。

【讨论】:

:我扩展了流以将其与 XmlReader 一起使用 ..而且似乎工作正常。【参考方案2】:

MemoryStream 无法按您希望的方式工作。当XmlReader 读取到当前末尾(即消耗所有当前数据)时,它会报告它已到达文件末尾。

您真正需要的是围绕 TCP 套接字包装一个流。可能最简单的方法是使用TcpClient 而不是原始套接字。 GetStream 方法会做你想做的事——提供一个流,你可以从中创建一个XmlReader

另一种选择是创建一种可以满足您要求的流。也就是说,它让一个线程输入数据,另一个线程取出数据。但是,直到生产者文件结束,消费者才会报告文件结束。

几个月前我写并发表了类似的东西。见Building a New Type of Stream。

老实说,不过……TcpClient 在这种情况下是我的首选。

【讨论】:

Jim Mischel : TcpClient api 不适用于 windows phone 7 mango 版本。 @rakesh kumar:NetworkStream 呢? msdn.microsoft.com/en-us/library/… @rakesh kumar:那么我看到的唯一解决方案是在创建MemoryStream 之前缓冲来自套接字的所有内容,或者使用我在那篇文章中展示的ProducerConsumerStream 之类的东西。 即使这样 XmlReader 将读取到最后,然后 xmlreader.read 将返回 false。 我尝试了你的(ProducerConsumerStream) 类,但是当我将它传递给 Xmlreader 时,它什么也没做。

以上是关于使用 tcp 套接字在 windows phone 7 上解析 xml 内容的主要内容,如果未能解决你的问题,请参考以下文章

Windows phone:无法使用套接字连接到计算机

Windows Phone 7:套接字编程

TCP协议的套接字编程

我无法将套接字 io 与 windows phone 8.1 C# 连接

82.基于tcp和udp协议的简单通信套接字编程

python基础之socket编程-------基于tcp的套接字实现远程执行命令的操作