通过设备与桌面Air App进行通信

时间:2013-04-15 17:32:58

标签: actionscript-3 flash air

我一直在寻找一些关于如何做到这一点的例子 - 但我能找到的唯一信息并没有真正让我清楚。

我希望有人可以提供一些见解。

我目前有一个我不久前制作的空气应用程序。空中应用程序在第3帧停止,我必须使用鼠标单击继续。我想要做的是当我点击设备(手机/平板电脑)上加载的html页面上的btn时前进到下一帧。 Air App本身将一直运行。

我有一个服务器设置,所以我可以从我的设备(本地网络)访问html按钮。

我还实现了此http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/Socket.html#includeExamplesSummary以查看它与我的服务器的交互方式。当我运行air app时,我可以看到它调用服务器,air应用程序会在调试器输出中从服务器打印一些结果。但实际上,这不是我想要做的。它只是表明发生了一些连接。但流程都错了。

所以我的问题是。谁能给我一些关于如何从同一网络中的另一台设备触发Air App中的帧的详细信息?其他设备不需要任何闪光灯。只需一个简单的html按钮即可。

感谢

1 个答案:

答案 0 :(得分:0)

我说你有两条可能的路线。

  1. 在您的服务器上创建一个脚本,以启动与您的航空应用程序的连接。例如,使用php和socket,链接将类似于http://myserver/nextslide.php,然后可以连接到您选择的TCP端口上的air应用程序。这里有很多选项,具体取决于您的服务器以及您可用的脚本语言。

  2. 将您的航空应用程序设置为Web服务器,以允许您的浏览器直接发送HTTP请求。例如,有一个非常简单的空中HTTP服务器here(它不过是一个套接字服务器,它在每个请求结束时关闭连接)。你仍然可以像现在一样从主Web服务器提供你的html,但是当你在HTTP标题中找到相关的URI时,你只需要从air app中的HTTP服务器移动到下一张幻灯片。如果您只需要它在您的本地网络中工作,这就是我想要的。


  3. 上面选项2的示例as3代码,使用带有FlashDevelop的空气投影仪测试:

    package 
    {
        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.ProgressEvent;
        import flash.events.ServerSocketConnectEvent;
        import flash.net.ServerSocket;
        import flash.net.Socket;
        import flash.utils.ByteArray;
    
        public class Main extends Sprite 
        {
            private var serverSocket:ServerSocket;
            private var port:int = 8080;
    
            public function Main():void 
            {
                listen();
            }
    
            private function listen():void
            {
                try
                {
                    serverSocket = new ServerSocket();
                    serverSocket.addEventListener(Event.CONNECT, socketConnectHandler);
                    serverSocket.bind(port);
                    serverSocket.listen();
                    trace("Listening on port " + port + "...\n");
                }
                catch (error:Error)
                {
                    trace("Failed to open server socket");
                }
            }
    
            private function socketConnectHandler(event:ServerSocketConnectEvent):void
            {
                var socket:Socket = event.socket;
                socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
            }
    
            private function socketDataHandler(event:ProgressEvent):void
            {
                try
                {
                    var socket:Socket = event.target as Socket;
                    var bytes:ByteArray = new ByteArray();
                    socket.readBytes(bytes);
                    var request:String = "" + bytes;
                    trace(request);
                    var url:String = request.substring(4, request.indexOf("HTTP/") - 1);
    
                    socket.writeUTFBytes("HTTP/1.1 200 OK\n");
                    socket.writeUTFBytes("Content-Type: text/plain\n\n");
    
                    if (url == "/next")
                    {
                        socket.writeUTFBytes("next frame triggered");
    
                        var someMovie:MovieClip = new MovieClip(); //define this as a reference to the movie clip you want to control
                        someMovie.nextFrame();
                    }
                    else
                    {
                        socket.writeUTFBytes("The url is " + url);
                    }
    
                    socket.flush();
                    socket.close();
                }
                catch (error:Error)
                {
                    trace(error);
                }
            }
        }
    }