AMF通信是如何工作的?
2 个回答
4
Flash是如何通过AMF与服务器上的服务/脚本进行通信的?
数据是通过TCP/IP连接传输的。有时候会使用现有的HTTP连接,而在其他情况下,会为AMF数据打开一个新的TCP/IP连接。当HTTP或额外的TCP连接被打开时,可能会使用套接字接口。AMF肯定是通过某种TCP连接传输的,而套接字接口几乎是打开这种连接的唯一方式。
传输的“数据”包括一些ECMA脚本(也就是Javascript)数据类型,比如“整数”、“字符串”、“对象”等等。
关于对象如何编码成二进制的技术规范,Adobe发布了一份说明文档:AMF 3.0 规范在Adobe.com
一般来说,使用AMF的客户端/服务器系统的工作流程大致是这样的:
- 客户端显示一些用户界面,并打开一个TCP连接到服务器。
- 服务器向客户端发送一些数据,客户端更新其用户界面。
- 如果用户发出指令,客户端会通过TCP连接向服务器发送一些数据。
- 重复步骤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。可以看看这些例子,了解它的功能和代码样子。