让我们假设我们在网站上托管了一个基于P2P多人Flash游戏。是否可以创建一个可以监听Flash应用程序内容的浏览器扩展?例如,我想知道一个玩家何时连接到一个房间,被踢或被禁止,或者只是自己离开。对不起,这不是一个特定的问题,但我需要一个方向开始。提前谢谢!
答案 0 :(得分:0)
我可以看到一些在Flash和浏览器插件之间进行通信的方法。
一种是打开到本地计算机上运行的服务器的套接字。由于安全沙箱,这可能不是最简单的方法,但如果可行的话,它当然可能是一个,因为你已经编写了套接字处理代码,并且正在收听/写入其他代码插座并不是非常复杂。对于这种方法,你只需要你的插件就可以开始监听套接字,并让flash applet连接到它。
另一种方法可能是尝试在cookie中传递消息。但是很确定这会引起很多悲伤。
另一种方式,我怀疑这可能会变得更容易,就是使用ExternalInterface
类在Flash和JavaScript之间进行通信,然后从JavaScript到插件。如果您可以在网上找到副本,Adobe的IntrovertIM示例应该可以帮助您入门。
在Flash中,创建两个函数,一个jsToSwf(command:String, args:Array<String>):Dynamic
函数,用于处理发送给该回调的JS的传入消息,以及swfToJs(command:String, args:Array<String> = null):Dynamic
函数,该函数调用flash.external.ExternalInterface.call("swfToJs", command, args);
。
要进行设置,您需要执行以下操作:
if (flash.external.ExternalInterface.available) {
flash.external.ExternalInterface.addCallback("jsToSwf", jsToSwf);
swfToJs("IS JS READY?");
}
(addCallback
的两个参数是JS中调用的函数,以及它在Flash中调用的函数。它们不必是同一个东西,但它有点像他们这样做是有道理的)
在JS中,您需要相同的功能:function swfToJs(command, params)
接受来自Flash的命令和参数列表;和jsToSwf(command, params)
来电getSwf("Furcadia").jsToSwf(command, params);
。
getSwf("name")
可能应该是这样的:
/** 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("IS JS READY?");
,然后JS方面,在获取该命令时,使用jsToSwf("JS IS READY!");
回复然后获取该信息,Flash确认收到swfToJs("FLASH IS READY!");
并且双方都设置了国旗说他们现在很清楚发送他们喜欢的任何命令。
所以,你现在已经让Flash与JS交谈了。但JS如何与浏览器扩展进行对话?而且,你的意思是扩展或附加,因为有区别!好吧,由于你没有指定哪个浏览器,因此它成了一整套蠕虫。
每个浏览器处理事物的方式不同。例如,Mozilla有port.emit()
/ port.on()
和较旧的postMessage()
作为JS的API与附加组件进行通信。
尽管如此,我认为ExternalInterface让我们将一个难题(Flash-to-external-code comms)简化为一个更简单的问题(Js-to-external-code comms)。