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 的策略文件问题

PHP 读取原始发布数据,对于从Flash XmlSocket中获取XML非常有用。

Flex - 截断显示为字符串的十进制值

带有截断文本的 flex 布局的 Tailwind css

Flex:组合框控件的自定义项目渲染器截断文本

是否有可能增加 Flex 4 中火花标签截断提示的字体大小?