【问题标题】:How does AMF communication work?AMF 通信如何工作?
【发布时间】:2010-11-28 04:58:20
【问题描述】:

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

关于 Python / Perl / PHP 的 AMF libraries 比 .NET / Java 更容易开发:

  • 每当 Flash 发送远程过程调用时,它们是否会执行脚本文件?
  • 或者它们是否通过套接字与作为服务运行的脚本类进行通信?

关于典型的 AMF 功能:

  • 如何传输数据?是通过自动序列化的方法参数吗?
  • 如何将服务器“push”发送给客户端? Flash 电影必须连接到套接字上吗?

感谢您的宝贵时间。

【问题讨论】:

    标签: python flash perl actionscript-2 amf


    【解决方案1】:

    我熟悉的唯一 AMF 库是 PyAMF,到目前为止,它的使用非常好。以下是 PyAMF 问题的答案:

    • 我想你可以将它作为脚本运行(你的意思是像 CGI 一样吗?),但最简单的 IMO 是专门为 AMF 请求设置应用服务器

    • 最简单的方法是在纯 python 中定义函数,PyAMF 包装这些函数以序列化传入/传出的 AMF 数据

    • 如果需要,您可以通过套接字进行通信,但同样,使用纯 Python 函数是最简单的;套接字的一种用途是保持打开的连接并将数据“推送”到客户端,请参阅this 示例

    以下是在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。查看examples 了解它的功能以及代码的外观。

    【讨论】:

      【解决方案2】:

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

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

      传输的“数据”由 ECMA 脚本 (Javascript(tm)) 数据类型组成,例如“整数”、“字符串”、“对象”等。

      关于如何将对象编码为二进制的技术规范,Adobe 发布了一个规范:AMF 3.0 Spec at Adobe.com

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

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

      例如,如果用户单击 UI 中的“发送邮件”按钮,则客户端代码可能会这样做:

      公共类 UICommandMessage 扩展了 my.CmdMsg
      {
         公共函数 UICommandMessage(action:String, arg:String)
         {
            this.cmd = 动作;
            this.data = 字符串;
         }
      }

      然后:

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

      在服务器代码中,服务器正在监视连接以及传入的 AMF 对象。它接收消息,并将控制权传递给适当的响应函数。这称为“发送消息”。

      有了更多关于你想要完成的事情的信息,我可以给你更多有用的细节。

      【讨论】:

        猜你喜欢
        • 2011-09-12
        • 1970-01-01
        • 2013-07-21
        • 2011-06-11
        • 2016-07-15
        • 1970-01-01
        • 2013-02-06
        • 1970-01-01
        • 2018-08-29
        相关资源
        最近更新 更多