通过P2P NetStream轻松实现双向通信

时间:2010-04-26 11:43:36

标签: flex flash p2p netstream stratus

我一直在使用Adobe Stratus服务研究Flash 10中的P2P支持。我已成功地将数据从一个用户发送到另一个用户,我的问题是我还没有弄清楚如何以一些简单的方式发回数据(或者作为对第一次调用的某种响应)。

我目前在做什么;

  1. 首先与Stratus服务建立连接

    nc = new NetConnection();
    nc.addEventListener(NetStatusEvent.NET_STATUS, ncStatusHandler);
    nc.connect(APPLICATION_URL + DEVELOPER_KEY);
    
  2. 在“服务器”方面,我做了:

    sendStream = new NetStream(nc, NetStream.DIRECT_CONNECTIONS);
    sendStream.addEventListener(NetStatusEvent.NET_STATUS, sendStreamHandler);
    sendStream.publish("file");
    

    在“客户”方面:

    // remoteFileID.text is manually copied by the user from the server (which is nc.nearID).
    recvStream = new NetStream(nc, remoteFileID.text); 
    recvStream.client = this;
    recvStream.addEventListener(NetStatusEvent.NET_STATUS, recvStreamHandler);
    recvStream.play("file");
    
  3. 然后我在客户端上调用远程函数:

    ...
    sendStream.send("aRemoteFunction", parameterData);
    ...
    
  4. 现在我的问题;我想从客户端到服务器做同样的事情,通知一切顺利,或者出现故障。根据我的理解,我将不得不从客户端到服务器设置一个新的NetStream(即客户端上的发布和服务器上的 play )。但要实现此目的,服务器需要知道客户端上的 nc.nearID

    是否可以在不强制用户手动将其从客户端复制到服务器的情况下获取该ID?或者,客户端是否有更简单的方式与我缺少的服务器通话?

2 个答案:

答案 0 :(得分:1)

通过Twitter联系Tom Krcha(http://twitter.com/tomkrcha/status/12882755421):他告诉我要查看NetStream的 onPeerConnected(...)属性并且它有效。

订阅者NetStream上的farID解决了我的问题;

var c:Object = new Object;
c.onPeerConnect = function(subscriber:NetStream):Boolean {
    trace("far id: " + subscriber.farID); // This farID will be the nearID of the connecting "client".

    recvStream = new NetStream(nc, subscriber.farID);
    recvStream.client = this;
    recvStream.addEventListener(NetStatusEvent.NET_STATUS, netRecvStreamHandler);
    recvStream.play("response");

    return true;
};

sendStream = new NetStream(nc, NetStream.DIRECT_CONNECTIONS);
sendStream.client = c;
sendStream.addEventListener(NetStatusEvent.NET_STATUS, netSendStreamHandler);
sendStream.publish("file");

答案 1 :(得分:0)

为什么不通过sendStream.send调用远程方法将nearID发送到服务器?

编辑抱歉,不太明白。我建议你在服务器上监听客户端连接。 NetGroup.Neighbor.Connect应该是您所需要的:
当邻居连接到此节点时发送。 info.neighbor:String属性是邻居的组地址。 info.peerID:String属性是邻居的对等ID。

编辑:如果您在客户端连接时收到任何事件,那么您可以检索all clients,并在服务器上使用他们的farNonce,即{{ 1}}客户端上连接的流。

格尔茨
back2dos