浏览器扩展的Flash播放器API

浏览器扩展的Flash播放器API,api,flash,browser,haxe,Api,Flash,Browser,Haxe,假设我们在一个网站上托管了一个基于Flash的P2P多玩家游戏。是否可以创建一个浏览器扩展来监听Flash应用程序中发生的事情?例如,我想知道一个玩家何时连接到一个房间,被踢或被禁止,或者干脆自己离开。很抱歉,这不是一个具体的问题,但我需要一个开始的方向。提前谢谢 我可以看到一些在Flash和浏览器插件之间通信的方法 一种是打开本地机器上运行的服务器的套接字。由于安全性沙箱,这可能不是最简单的方法,但如果可行的话,这当然可能是一种值得尝试的方法,因为您已经编写了套接字处理代码,并且侦听/写入额外

假设我们在一个网站上托管了一个基于Flash的P2P多玩家游戏。是否可以创建一个浏览器扩展来监听Flash应用程序中发生的事情?例如,我想知道一个玩家何时连接到一个房间,被踢或被禁止,或者干脆自己离开。很抱歉,这不是一个具体的问题,但我需要一个开始的方向。提前谢谢

我可以看到一些在Flash和浏览器插件之间通信的方法

一种是打开本地机器上运行的服务器的套接字。由于安全性沙箱,这可能不是最简单的方法,但如果可行的话,这当然可能是一种值得尝试的方法,因为您已经编写了套接字处理代码,并且侦听/写入额外的套接字并不十分复杂。对于这种方法,您只需要插件开始监听套接字,并让flash小程序连接到它

另一种方法可能是尝试在cookie中传递消息。不过,我敢肯定这会引起很多悲伤

另一种方法,我怀疑这可能是更容易的途径,就是使用
ExternalInterface
类在Flash和JavaScript之间进行通信,然后从JavaScript到插件。如果您可以在web上找到一个副本,Adobe的IntrovertIM示例应该会让您开始学习

在Flash中,创建两个函数,一个是
jsToSwf(command:String,args:Array):Dynamic
函数,用于处理从JS发送到该回调的传入消息,另一个是
swfToJs(command:String,args:Array=null):Dynamic
函数,它调用
Flash.external.ExternalInterface.call(“swfToJs”,command,args)

要设置它,您需要执行以下操作:

if (flash.external.ExternalInterface.available) {
  flash.external.ExternalInterface.addCallback("jsToSwf", jsToSwf);
  swfToJs("IS JS READY?");
}
/** Get ref to specified SWF file.
// Unfortunately, document.getElementById() doesn't
// work well with Flash Player/ExternalInterface. */
function getSwf(movieName) {
    result = '';
    if (navigator.appName.indexOf("Microsoft") != -1) {
        result = window[movieName];
    } else {
        result = document[movieName];
    }
    return result;
}
(addCallback的两个参数是JS中调用的函数和Flash中调用的函数。它们不一定是同一个参数,但它们的作用有点道理)

在JS中,您需要相同的函数:
函数swfToJs(command,params)
从Flash接受命令和参数列表;和
jsToSwf(command,params)
调用
getSwf(“Furcadia”).jsToSwf(command,params)

getSwf(“name”)
应该是:

if (flash.external.ExternalInterface.available) {
  flash.external.ExternalInterface.addCallback("jsToSwf", jsToSwf);
  swfToJs("IS JS READY?");
}
/** Get ref to specified SWF file.
// Unfortunately, document.getElementById() doesn't
// work well with Flash Player/ExternalInterface. */
function getSwf(movieName) {
    result = '';
    if (navigator.appName.indexOf("Microsoft") != -1) {
        result = window[movieName];
    } else {
        result = document[movieName];
    }
    return result;
}
唯一微妙的一点是,你需要做一点握手,以确保每个人都在听。因此,当您准备好Flash时,它会调用
swfToJs(“JS准备好了吗?”)然后JS端在得到该命令后,用
jsToSwf(“JS准备好了!”)进行回复收到后,Flash用
swfToJs(“Flash准备好了!”)确认收到
现在,你有了Flash和JS的对话。但是JS如何与浏览器扩展对话呢?还有,你是说扩展,还是附加,因为两者是不同的!好吧,这就变成了另一堆蠕虫,因为你没有指定哪个浏览器

每个浏览器处理事情的方式都不同。例如,Mozilla将
port.emit()
/
port.on()
和较旧的
postMessage()
作为JS与加载项通信的API

不过,我认为ExternalInterface让我们把一个难题(Flash到外部代码通信)简化为一个更简单的问题(Js到外部代码通信)