David, 
  We are able to have some synchronous behavior to sockets. What we do
is assign a unique ID with each request the client sends, and when the
server is done, it passes that id back.

So to further illustrate your example:
Client sends this:
<getServerData id="1" data="yourData"/>
The server would then send back:
<yourData id="1">blahblahblah</yourData>
<done id="1">

Then, on your onData() method, you can check all <done/> XML, get the
ID, and then use that ID to look up a callback function that you
registered with that ID.

Basically, all of our requests go through a Command which implements
the IResponder class, we register that class to a Singleton which
holds all the callback with the "id"...and when we see "<done/>", we
check to see if a callback is there and if so it calls it's method.
This ensures that all the data is back we want. Even if your
getServerData request returns multiple socket messages:

<getServerData id="1" data="yourData"/>
<yourData id="1">blahblahblah</yourData>
<yourData id="1">blahblahblah22222</yourData>
<yourData id="1">blahblahblah333333</yourData>
<done id="1">

Hope this helps.
-Kevin

--- In [email protected], "David Buitenveld"
<[EMAIL PROTECTED]> wrote:
>
> Hi all -
> 
> I am creating a server interface, one of whose implementations
> involves talking over a socket connection. I have a need for
> synchronous behavior - I call an API method, say
> getServerData(aParam), and I get back the result that I want. Not sure
> what a good way to do this with sockets would be since the receive
> data event makes them asynchronous in nature - can anyone point me
> to a good tutorial, or provide a hint?
> 
> Consider a made up example :
> 
> class SocketServer implements Server 
>   private var _lastResult:String;
> 
> // client calls this method and expects a result passed back
> public function getServerData(aParam:String): String {
>   _socket.addEventListener(ProgressEvent.SOCKET_DATA, onData);  
>   connectToSocket(someHost, somePort);
> 
>   _lastResult null;
>   issueCommandViaSocket(aParam);
> 
>   // sit around until we get data
>   while (_lastResult == null) ; 
>   return _lastResult;
> }
> 
> private function onData(e:ProgressEvent):void {
>   _lastResult= socket.readUTFBytes(socket.bytesAvailable);
> }
> 
> this works conceptually, except that the wait around part hangs the
> app.. if I remove that, then I can get the return value and log it in
> the onData method.. so, am I even on the right track here? Is there
> some way to have actionscript pause or wait until the desired event
> gets fired?
> 
> thanks for any thoughts -
> 
> david
>


Reply via email to