ZendAMF - 所有这些流量是什么?

时间:2011-08-08 16:42:32

标签: php flex flash-builder zend-amf

我正在使用ZendAMP php和Flex(Flash Builder 4)。它工作得很好,但我注意到当我查看我的flex应用程序和ZendAMF之间的流量时,即使我没有在我的代码中请求通信,也会有数据包移动。

例如,这就是我的服务在flex中的样子:

var activityLogService:RemoteObject = new RemoteObject("zend");
activityLogService.showBusyCursor=true;
activityLogService.endpoint="http://myserver:80/amf/";
activityLogService.source="ActivityLogService";

然后在设置addlistener后调用activityLogService.getRecord(myPassedParams)之类的内容。

当我使用fiddler之类的东西观看网络流量时,我可以看到我的请求并且回复了。

但是,我也看到这些请求数据包不包含我的zend服务对象的名称:

�����null�/1����
���
�Mflex.messaging.messages.CommandMessageoperationcorrelationIdmessageIdtimeToLivetimestampdestinationheaders    bodyclientIdI3961D727-35B9-F41C-713A-AA42625FCFD9��

%DSMessagingVersion DSIdnil

回复的回复也很模糊:

�����
/1/onResult������
�Uflex.messaging.messages.AcknowledgeMessagecorrelationIdclientIddestinationmessageIdtimestamptimeToLiveheaders bodyI3961D727-35B9-F41C-713A-AA42625FCFD9I53D9441D-E1DC-4829-9B3F-000040DA9368I1322EAF2-B588-9929-0AC4-000013A22D80131282149600�

这些只是某种“保持活跃”的消息吗?

如果有,有办法关闭它们吗?

另外,如果是这样,有没有办法可以使用它们在服务器端保持某种会话活着(也许这就是它们的用途)?

1 个答案:

答案 0 :(得分:0)

RemoteObject AMF实现要求服务器端实现是有状态的。这被定义为协议的一部分,所以你应该跟哪个后端无关紧要(即,我的经验是在BlazeDS,LCDS和WebOrb中,但它应该与PHP相同)

当您的应用程序首次对RemoteObject进行AMF调用时,它会检查客户端是否设置了DSid值。这实际上是一个唯一的ID,用于标识服务器的Flex客户端。

如果没有,则发出呼叫以获取新的DSid,并且所有出站呼叫都将暂停,直到该呼叫返回。从那时起,DSid将在AMF数据包的标头中的所有出站呼叫上传递。

如果您曾在客户端重置DSid(通过调用FlexClient.getInstance().id = 'nil'),则此过程将重复进行。 (即,所有呼叫将再次暂停,直到服务器向客户端发出新的DSid。)

基本上,这些是AMF协议工作所需的内部消息