Flex - XMLSocket 截断 XML 的最后结束标记 - 为啥?
Posted
技术标签:
【中文标题】Flex - XMLSocket 截断 XML 的最后结束标记 - 为啥?【英文标题】:Flex - XMLSocket truncates the final closing tag of the XML - why?Flex - XMLSocket 截断 XML 的最后结束标记 - 为什么? 【发布时间】:2011-01-22 18:15:45 【问题描述】:我有一个项目尝试使用 XMLSocket 将 XML 发送到另一端监听它的服务器。
申请文件是:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
import MyConnection;
[Bindable]
public var conn:MyConnection = new MyConnection(33333);
]]>
</mx:Script>
<mx:VBox>
<mx:Button label="Click me" buttonDown="conn.sendXml()" />
</mx:VBox>
</mx:Application>
MyConnection.as 是这样的:
package
import flash.errors.*;
import flash.events.*;
import flash.net.XMLSocket;
public class MyConnection
private var hostName:String = "localhost";
private var port:uint = 33333;
private var socket:XMLSocket;
private var xmlData:XML;
public function MyConnection(port:int)
super();
this.port = port;
socket = new XMLSocket();
configureListeners(socket);
/**
* @throws IOError
*/
public function sendXml():void
xmlData =
<body>
<action>Hello</action>
<name>Kittie</name>
</body>
socket.connect(hostName, port);
/**
* @param dispatcher IEventDispatcher
*/
private function configureListeners(dispatcher:IEventDispatcher):void
dispatcher.addEventListener(Event.CLOSE, closeHandler);
dispatcher.addEventListener(Event.CONNECT, connectHandler);
dispatcher.addEventListener(DataEvent.DATA, dataHandler);
dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler);
dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
private function closeHandler(event:Event):void
trace("closeHandler: " + event);
private function connectHandler(event:Event):void
trace("connectHandler: " + event);
socket.send(xmlData);
socket.close();
xmlData = null;
private function dataHandler(event:DataEvent):void
trace("dataHandler: " + event);
private function ioErrorHandler(event:IOErrorEvent):void
trace("ioErrorHandler: " + event);
private function progressHandler(event:ProgressEvent):void
trace("progressHandler loaded:" + event.bytesLoaded + " total: " + event.bytesTotal);
private function securityErrorHandler(event:SecurityErrorEvent):void
trace("securityErrorHandler: " + event);
您可能会看到,这与语言参考中的 XMLSocket 示例非常相似。
但是,嗅探服务器接收到的数据,我得到了一个没有结束标记的截断 XML
Got connection from 127.0.0.1
<body>
<action>Hello</action>
<name>Kittie</name>
127.0.0.1 disconnected
而结束标签会出现在下次发送数据时,即
Got connection from 127.0.0.1
</body><body>
<action>Hello</action>
<name>Kittie</name>
127.0.0.1 disconnected
任何想法为什么会发生这种情况?有什么建议吗?
我必须在每个请求上打开和关闭套接字,但即使为了测试而尝试不这样做也无济于事
谢谢!
卡纳夫
【问题讨论】:
【参考方案1】:在您的个人情况下我可能是错误的,但通常使用 Socket 连接时,您的服务器应该设置为接收可能被拆分的数据包。例如,如果您的数据比数据包可以容纳的长,那么下一个数据包将是前一个交换的延续。
这在 Wireshark 中查看原始套接字时最为明显,您可以看到 TCP 连续数据包。
我还注意到您正在使用 E4X 来定义您的 XML,您可能希望正确结束您的定义:
xmlData = <body>
<action>Hello</action>
<name>Kittie</name>
</body>;
并使用 toXMLString 函数调用它:
socket.send(xmlData.toXMLString());
【讨论】:
以上是关于Flex - XMLSocket 截断 XML 的最后结束标记 - 为啥?的主要内容,如果未能解决你的问题,请参考以下文章
ActionScript 3 XMLSocket 的策略文件问题