2012-04-05 13 views
1

送信側のデータがクライアント側(Flash/Flex)で切り捨てられているソケットに問題があります。私のサーバーによって送信されたデータは完全なものであり、しかし、フラッシュは、データを読み込むためのイベントを発生させる前に、適切な時間待機しません。この結果、データが完全に読み込まれなくなり、その後、オブジェクトを解析することができなくなります。オブジェクトをより小さなまとまりにする可能性を模索していますが、できるだけ軽量にするというアイデアは、一時的な解決策にパッチを当てるよりもむしろ機能するようになるでしょう。Flex 4.6ソケット受信バッファサイズを増やす

一部のコンピュータではすべてのデータを受信でき、他のコンピュータでは切り捨てられているため(バッファが適切だがフラッシュisn理由を問わずにイベントを発送するのに適切な時間を待っている)誰かが何かアイデアを持っているなら、私は大いに感謝するだろう!

+2

をあなたはおそらく、「受信バッファサイズ」を増やす必要はありません。ここで

は、私が使用している実装です。一度にすべてのデータが到着するわけではありません(いつものように - TCPソケットで)。 –

答えて

2

実装のコードが表示されていないと、利用可能なバイトのように見えるか、合計バイトが考慮されていません。

package 
{ 
    import flash.events.Event; 
    import flash.events.EventDispatcher; 
    import flash.events.IOErrorEvent; 
    import flash.events.ProgressEvent; 
    import flash.events.SecurityErrorEvent; 
    import flash.net.Socket; 

    public class WebRequestService extends EventDispatcher 
    { 

     //------------------------------ 
     // model 
     //------------------------------ 

     protected var hostname:String; 

     protected var port:uint; 

     public var requestMessage:String; 

     public var responseMessage:String; 

     private var _socket:Socket; 


     //------------------------------ 
     // lifecycle 
     //------------------------------ 

     public function WebRequestService(hostname:String, port:uint, requestMessage:String) 
     { 
      this.hostname = hostname; 
      this.port = port; 
      this.requestMessage = requestMessage; 

      _socket = new Socket(); 
      _socket.addEventListener(Event.CONNECT, socketConnectHandler); 
      _socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler); 
      _socket.addEventListener(Event.CLOSE, socketCloseHandler); 
      _socket.addEventListener(IOErrorEvent.IO_ERROR, socketErrorHandler); 
      _socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, socketSecurityErrorHandler); 

      _socket.connect(hostname, port); 
     } 

     protected function socketConnectHandler(event:Event):void 
     { 
      responseMessage = ""; 
      _socket.writeUTFBytes(requestMessage); 
      _socket.flush(); 
     } 

     protected function socketDataHandler(event:ProgressEvent):void 
     { 
      while (_socket.bytesAvailable > 4) 
      { 
       responseMessage += _socket.readUTFBytes(_socket.bytesAvailable); 
      } 
     } 

     protected function socketCloseHandler(event:Event):void 
     { 
      dispose(); 
     } 

     protected function socketErrorHandler(event:IOErrorEvent):void 
     { 
      trace("socket error."); 
     } 

     protected function socketSecurityErrorHandler(event:SecurityErrorEvent):void 
     { 
      trace("socket security error."); 
     } 

     public function dispose():void 
     { 
      if (!_socket) 
       return; 

      if (_socket.connected) 
       _socket.close(); 

      _socket.removeEventListener(Event.CONNECT, socketConnectHandler); 
      _socket.removeEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler); 
      _socket.removeEventListener(Event.CLOSE, socketCloseHandler); 
      _socket.removeEventListener(IOErrorEvent.IO_ERROR, socketErrorHandler); 
      _socket.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, socketSecurityErrorHandler); 
     } 

    } 
} 
+0

興味深い...私はreadUTFBytesのwhileループを考慮していませんでした。これはエレガントなソリューションのようです...私はそれがうまくいくかどうかを見ていきます! –

+1

32ビット - 少なくとも解釈可能なメモリセグメント。 –

+0

確かな答え...巨大なヘルプとありがとう – binarygiant

関連する問題