0 votes

Flex - XMLSocket tronque la dernière balise de fermeture du XML - pourquoi ?

J'ai un projet qui essaie d'envoyer un XML en utilisant XMLSocket à un serveur qui l'écoute de l'autre côté.

Le dossier de candidature est :

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

Et MyConnection.as est :

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);
        }
 }
}

Comme vous pouvez probablement le constater, cet exemple est très similaire à celui de XMLSocket dans la référence du langage.

Cependant, en reniflant les données reçues par le serveur, j'obtiens un XML tronqué sans la balise de fermeture.

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

Et la balise de fermeture apparaîtra sur l'envoi de données suivant, c'est-à-dire

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

Une idée de la raison pour laquelle cela se produit ? Vous avez des suggestions ?

Je dois ouvrir et fermer le socket à chaque demande, mais même en essayant de ne pas le faire pour le bien du test, cela n'a pas aidé

Merci !

karnaf

0voto

Robin Duckett Points 1417

Je peux me tromper dans votre cas particulier, mais en travaillant avec des connexions Socket en général, votre serveur devrait être configuré pour recevoir des paquets qui peuvent être divisés. Par exemple, si vos données sont plus longues que ce que le paquet peut contenir, alors le paquet suivant sera une continuation de l'échange précédent.

C'est ce que l'on voit le plus clairement en visualisant les sockets bruts dans Wireshark, vous êtes capable de voir les paquets de continuation TCP.

Je remarque également que vous utilisez E4X pour définir votre XML, vous pourriez vouloir terminer correctement votre définition :

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

Et l'appeler en utilisant la fonction toXMLString :

socket.send(xmlData.toXMLString());

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X