1

IRC クライアントで実行されている Python スクリプトから送信されたテキスト文字列を Adob​​e Flash ドキュメントに読み込む簡単な方法を見つけようとしているので、フラッシュ内での表示方法を選択できます。

Mrs の助けを借りて次の AS3 コードを作成しましたが、次のエラーが表示されます。

エラーが発生しました: [IOErrorEvent type="ioError" bubbles=false cancelable=false eventPhase=2 text="エラー #2031: ソケット エラー。URL: 127.0.0.1"]

Flash ファイルのドキュメント クラス (最初に Flash ドキュメントに読み込まれる):

package
{
    import Mrs.SocketMessageEvent;
    import Mrs.SocketTest;

    import flash.display.Sprite;
    import flash.system.Security;

    public class Temp_Example2 extends Sprite
    {
        protected var socket:SocketTest;
        public function Temp_Example2()
        {
            this.socket = new SocketTest();
            this.socket.addEventListener(SocketMessageEvent.MESSAGE_RECEIVED, onSocketMessage);
            flash.system.Security.allowDomain("*");
            flash.system.Security.allowInsecureDomain("*");
            this.socket.connect("127.0.0.1", 7001);
        }

        protected function onSocketMessage(e:SocketMessageEvent):void 
        {
            var date:Date = new Date();
            trace(date.hoursUTC + ":" + date.minutesUTC + ":" + date.secondsUTC + " Incoming message: " + e.message);
        }
    }
}

SocketTest クラス (Mrs サブフォルダー内):

package Mrs
{
    import flash.errors.IOError;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.events.ProgressEvent;
    import flash.events.SecurityErrorEvent;
    import flash.net.Socket;

    public class SocketTest extends Socket 
    {
        protected var _message:String;

        public function SocketTest() 
        {
            super();
            this._message = "";

            this.addEventListener(Event.CONNECT, socketConnected);
            this.addEventListener(Event.CLOSE, socketClosed);
            this.addEventListener(ProgressEvent.SOCKET_DATA, socketData);
            this.addEventListener(IOErrorEvent.IO_ERROR, socketError);
            this.addEventListener(SecurityErrorEvent.SECURITY_ERROR, socketError);
        }

        protected function socketData(event:ProgressEvent):void 
        {
            var str:String = readUTFBytes(bytesAvailable);

            //For this example, look for \n as a message terminator
            var messageParts:Array = str.split("\n");

            //There could be multiple messages or a partial message, 
            //pass on complete messages and buffer any partial
            for (var i = 0; i < messageParts.length; i++) 
            {
                this._message += messageParts[i];
                if (i < messageParts.length - 1) 
                {
                    this.notifyMessage(this._message);
                    this._message = "";
                }
            }
        }

        protected function notifyMessage(value:String):void 
        {
            this.dispatchEvent(new SocketMessageEvent(SocketMessageEvent.MESSAGE_RECEIVED, value));
        }

        protected function socketConnected(event:Event):void 
        {
            trace("Socket connected");
        }

        protected function socketClosed(event:Event):void 
        {
            trace("Connection was closed");
            //TODO: Reconnect if needed
        }

        protected function socketError(event:Event):void 
        {
            trace("An error occurred:", event);
        }
    }
}

SocketMessageEvent クラス (再び Mrs サブフォルダーにあります):

package Mrs
{
    import flash.events.Event;

    public class SocketMessageEvent extends Event
    {
        public static const MESSAGE_RECEIVED:String = "messageReceived";

        protected var _message:String;

        public function SocketMessageEvent(type:String, message:String = "", bubbles:Boolean = false, cancelable:Boolean = false)
        {
            super(type, bubbles, cancelable);
            this._message = message;
        }

        public function get message():String
        {
            return this._message;
        }
    }
}

私が見たところ、これはコンパイルオプションエラーである可能性があると示唆する人もいましたが、変更するオプションを見つける方法がわかりません。

4

1 に答える 1

1

まず、XMLSocket を使用する必要があります。\n によるメッセージの分割のネイティブ実装があります。素敵できれい:)

あなたの問題については、サーバーがオンになっていないことは明らかです。そうである場合は、同じアドレスとポートにバインドされていることを確認してください。問題はサーバー側にある可能性がありますが、確認するコードがなければわかりません。おそらく、サーバーがサイレント クラッシュを起こしたのではないでしょうか? おそらく、startServer() などのメソッドを忘れたか、何らかの理由で忘れてしまったのでしょうか。

于 2013-05-30T14:08:00.020 に答える