AMF通信是如何工作的?

4 投票
2 回答
3236 浏览
提问于 2025-04-15 14:19

Flash是怎么通过AMF和服务器上的服务/脚本进行沟通的呢?

关于Python / Perl / PHP的AMF库,这些库比.NET / Java更容易开发:

  • 当Flash发送远程过程调用(Remote Procedure Call)时,它们会执行脚本文件吗?
  • 还是通过套接字(sockets)与作为服务运行的脚本类进行通信?

关于AMF的典型功能:

  • 数据是怎么传输的?是通过自动序列化的方法参数吗?
  • 服务器是怎么“推送”数据给客户端的?Flash动画需要通过套接字连接吗?

感谢你的时间。

2 个回答

4

Flash是如何通过AMF与服务器上的服务/脚本进行通信的?

数据是通过TCP/IP连接传输的。有时候会使用现有的HTTP连接,而在其他情况下,会为AMF数据打开一个新的TCP/IP连接。当HTTP或额外的TCP连接被打开时,可能会使用套接字接口。AMF肯定是通过某种TCP连接传输的,而套接字接口几乎是打开这种连接的唯一方式。

传输的“数据”包括一些ECMA脚本(也就是Javascript)数据类型,比如“整数”、“字符串”、“对象”等等。

关于对象如何编码成二进制的技术规范,Adobe发布了一份说明文档:AMF 3.0 规范在Adobe.com

一般来说,使用AMF的客户端/服务器系统的工作流程大致是这样的:

  1. 客户端显示一些用户界面,并打开一个TCP连接到服务器。
  2. 服务器向客户端发送一些数据,客户端更新其用户界面。
  3. 如果用户发出指令,客户端会通过TCP连接向服务器发送一些数据。
  4. 重复步骤2-3,直到用户退出。

举个例子,如果用户在界面上点击“发送邮件”按钮,那么客户端代码可能会这样写:

public class UICommandMessage extends my.CmdMsg
{
   public function UICommandMessage(action:String, arg: String)
   {
      this.cmd = action;
      this.data = String;
   }
}

然后稍后:

UICommandMessage msg = new UICommandMessage("Button_Press", "Send_Mail");
server_connection.sendMessage(msg);

在服务器代码中,服务器也在监控连接,以接收传入的AMF对象。它接收到消息后,会将控制权交给一个合适的响应函数。这被称为“分发消息”。

如果你能提供更多关于你想要实现的目标的信息,我可以给你更有用的细节。

8

我知道的唯一一个AMF库是PyAMF,用起来非常不错。下面是关于PyAMF的一些问题的回答:

  • 我想你可以把它当作脚本来运行(你是指像CGI那样吗?),但我觉得最简单的方法是专门为AMF请求设置一个应用服务器。

  • 最简单的方法是用纯Python定义函数,PyAMF会把这些函数包装起来,以便处理进出的AMF数据。

  • 如果你需要的话,可以通过套接字进行通信,但我还是觉得用纯Python函数最简单;套接字的一个用途是保持一个开放的连接,并向客户端“推送”数据,看看这个例子。

这里有一个在localhost:8080上提供的三个简单AMF服务的例子:

from wsgiref import simple_server
from pyamf.remoting.gateway.wsgi import WSGIGateway

## amf services ##################################################

def echo(data):
    return data

def reverse(data):
    return data[::-1]

def rot13(data):
    return data.encode('rot13')

services = {
    'myservice.echo': echo,
    'myservice.reverse': reverse,
    'myservice.rot13': rot13,
}

## server ########################################################

def main():
    app = WSGIGateway(services)

    simple_server.make_server('localhost', 8080, app).serve_forever()

if __name__ == '__main__':
    main()

我绝对推荐PyAMF。可以看看这些例子,了解它的功能和代码样子。

撰写回答