1

送信しているデータがクライアント側 (Flash/Flex) で切り捨てられるソケットに問題があります。私のサーバーから送信されたデータは完全で無傷ですが、フラッシュはデータを読み取るように指示するイベントを発生させる前に適切な時間を待機しません。これにより、データが完全に読み取られなくなり、(そのため) その後、オブジェクトを解析できなくなります。オブジェクトを小さなチャンクに分割する可能性を探っていますが、可能な限り軽量にすることを目的としているため、一時的な解決策にパッチを当てるよりも、想定どおりに動作させることをお勧めします。

一部のコンピューターはすべてのデータを受信でき、他のコンピューターはデータを切り捨てているため、受信「バッファー」と呼んでいるかどうかは完全にはわかりません (つまり、バッファーは適切ですが、フラッシュはデータを待機していません)。理由が何であれ、イベントをディスパッチするのに適切な時間)...誰かアイデアがあれば、私は大いに感謝します!

4

1 に答える 1

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

    }
}
于 2012-04-05T18:12:31.410 に答える