views:

167

answers:

1

Hi all,

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

The application file is:

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

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

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

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

Thanks!

karnaf

A: 

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.

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

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

And call it using the toXMLString function:

socket.send(xmlData.toXMLString());
Robin Duckett