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

個々のケースでは間違っているかもしれませんが、一般的にソケット接続を使用する場合、分割される可能性のあるパケットを受信するようにサーバーを設定する必要があります。たとえば、パケットが保持できるよりもデータが長い場合、次のパケットは前の交換の続きになります。

これは、Wireshark で raw ソケットを表示するときに最も明確に見られます。TCP 継続パケットを確認できます。

また、E4X を使用して XML を定義していることにも気付きました。定義を適切に終了することをお勧めします。

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

toXMLString 関数を使用して呼び出します。

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