0

我有一个项目尝试使用 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

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

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

谢谢!

卡纳夫

4

1 回答 1

1

在您的个人情况下,我可能是错的,但通常使用 Socket 连接,您的服务器应该设置为接收可能被拆分的数据包。例如,如果您的数据长于数据包可以容纳的时间,那么下一个数据包将是前一个交换的延续。

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

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

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

并使用 toXMLString 函数调用它:

socket.send(xmlData.toXMLString());
于 2010-03-03T10:39:57.687 回答