6

を使用してAS3(AIR)クライアントにファイルを送信するC#サーバーを作成することができましたsockets。AS3側では、flash.net.Socketライブラリを使用してを介してデータを受信して​​いますTCP

仕組みは次のとおりです
。->サーバーの電源を入れ、クライアントをリッスンします(さらに、接続されているデバイスのリストを作成できます)。
->クライアントの電源を入れると、データが自動的に受信されます。

データを受信するためのトリガーイベントはクライアントで行われます。つまり、サーバーをオンにするだけで、クライアントがオンになるとデータを取得し、次のイベントをトリガーします。

socket.addEventListener(Event.CONNECT, onConnect); -> to connect to the server  
socket.addEventListener(Event.SOCKET_DATA, onDataArrival); -> to receive the data  

今、私は何か違うことをしたいです。クライアントでトリガーしたくない、サーバーでトリガーしたい、つまり、クライアントをオンにして、サーバーにデータを取得するクライアントを配置したい。

では、なぜ私はクライアントをクライアント/サーバーにしようとしているのですか?私のサーバーは1台のマシンであり、クライアントはサーバーに接続するXXXのモバイルデバイスであるため、これを実現するための私のアプローチです。

flash.net.ServerSocketそれで、私が今言ったことを考えると、私はライブラリ を使用して、私が望むように動作するAS3クライアント/サーバーアプリを作成することができました。

まず、クライアントに聞いてもらいます。

serverSocket.bind(portNumber, "10.1.1.212");
serverSocket.addEventListener(ServerSocketConnectEvent.CONNECT, onConnectServer);
serverSocket.listen();

そして、私はを使用してデータを受け取りますflash.net.Socket Event.SOCKET_DATA

そして、それはほとんどそれです。私が望むように動作します。
ただし、flash.net.ServerSocketモバイルデバイスとの互換性はまだありません...

だからここに私の問題があります:C#サーバー(接続されたデバイスのリストを作成できるようにクライアントをリッスンする必要があります)からAS3(AIR)クライアントにファイルを送信する必要がありますが、どのクライアントがデータを取得しているかを定義する必要がありますサーバーであり、クライアントはいつでもそのデータを受信できるように準備する必要があるため、リッスンしますが、それらはたくさんあるので、私はそれらをクライアントと見なします。

そして私の質問は、AS3のサーバーソケットを使用せずに、クライアントに着信接続をリッスンさせ、イベントが発生したときにイベントをトリガーさせる方法はありますか?

また、C#サーバー<-> AS3クライアント/サーバーロジックを使用せずに私の目標を達成するための別のアプローチがある場合は、遠慮なく意見を述べてください。

4

1 に答える 1

6

はい。クライアントは、flash.net.Socketdoc)またはflash.net.XMLSocketdoc )を介してサーバーに接続する必要があります。ほとんどの場合、必要なサーバーは1つだけで、多くのクライアントが接続できます。両端にサーバーがある理由は完全には明らかではありませんか?

編集:

以下は、を使用してサーバーからのメッセージを継続的にリッスンしているクライアントの簡単な例ですSocket。これはサーバーに接続し、データを(無期限に)待機します。データのチャンクが受信されると(この場合、文字列が改行文字で終了することを期待しています)、データはイベントとともに渡されます。

このアプローチを試しても成功しなかった場合は、エラーがあるかどうか、または接続が閉じられていないかどうかを確認する必要があります。

ドキュメントクラス:

package  {
    import flash.display.Sprite;

    public class Main extends Sprite {
        protected var socket:SocketTest;

        public function Main() {
            this.socket = new SocketTest();
            this.socket.addEventListener(SocketMessageEvent.MESSAGE_RECEIVED, onSocketMessage);
            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クラス:

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

    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クラス:

package  {
    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;
        }
    }
}

テストとして、5秒ごとにメッセージを送信するようにサーバーを設定しました。これは、コンソールの出力です。

Socket connected
21:36:24 Incoming message: Message from server: 0
21:36:29 Incoming message: Message from server: 1
21:36:34 Incoming message: Message from server: 2
21:36:39 Incoming message: Message from server: 3
21:36:44 Incoming message: Message from server: 4
21:36:49 Incoming message: Message from server: 5
于 2012-12-19T14:50:15.730 に答える