Flex - XMLSocket 会截断 XML 的最后一个结束标记 - 为什么? [英] Flex - XMLSocket truncates the final closing tag of the XML - why?

查看:21
本文介绍了Flex - XMLSocket 会截断 XML 的最后一个结束标记 - 为什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个项目,它尝试使用 XMLSocket 将 XML 发送到在另一端侦听它的服务器.

I have a project which tries to send an XML using XMLSocket to a server listening to it on the other side.

申请文件为:

<?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 是:

And MyConnection.as is:

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 示例非常相似.

As you can probably see, this is very similar to the XMLSocket example in the language reference.

然而,嗅探服务器接收到的数据,我得到了一个没有结束标记的截断的 XML

However, sniffing on the data received by the server, I get a truncated XML without the closing tag

Got connection from 127.0.0.1
<body>
  <action>Hello</action>
  <name>Kittie</name>
127.0.0.1 disconnected

并且结束标记将出现在下一次发送数据时,即

And the closing tag will appear on the next data sending, i.e.

Got connection from 127.0.0.1
</body><body>
  <action>Hello</action>
  <name>Kittie</name>
127.0.0.1 disconnected

任何想法为什么会发生这种情况?有什么建议吗?

Any ideas why this is happening? Any suggestions?

我必须在每次请求时打开和关闭套接字,但即使为了测试而尝试不这样做也无济于事

I have to open and close the socket on each request, but even trying not to do that for the sake of testing didn't help

谢谢!

卡纳夫

推荐答案

在您的个别情况下,我可能是错误的,但通常使用 Socket 连接,您的服务器应该设置为接收可能被拆分的数据包.例如,如果您的数据长度超过数据包所能容纳的长度,那么下一个数据包将是前一次交换的延续.

I may be wrong in your individual case, but working with Socket connections in general, your server should be set up to recieve packets that may be split. For example if your data is longer than the packet can hold, then the next packet will be a continuation of the previous exchange.

在 Wireshark 中查看原始套接字时最明显地看到这一点,您可以看到 TCP 连续数据包.

This is most obviously seen when viewing raw sockets in Wireshark, you are able to see TCP continuation packets.

我还注意到您使用 E4X 来定义您的 XML,您可能希望正确结束您的定义:

I also notice you're using E4X to define your XML, you may want to properly end your definition:

xmlData = <body>
 <action>Hello</action>
 <name>Kittie</name>
</body>;

并使用 toXMLString 函数调用它:

And call it using the toXMLString function:

socket.send(xmlData.toXMLString());

这篇关于Flex - XMLSocket 会截断 XML 的最后一个结束标记 - 为什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆