【问题标题】:Easy bidirectional communication via P2P NetStream通过 P2P NetStream 轻松进行双向通信
【发布时间】:2010-04-26 11:43:35
【问题描述】:

我一直在使用 Adob​​e 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(即客户端上的 publish 和服务器上的 play)。但要做到这一点,服务器需要知道客户端上的 nc.nearID

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

【问题讨论】:

    标签: apache-flex flash p2p netstream stratus


    【解决方案1】:

    通过 twitter (http://twitter.com/tomkrcha/status/12882755421) 联系了 Tom Krcha:他告诉我查看 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");
    

    【讨论】:

      【解决方案2】:

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

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

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

      问候
      back2dos

      【讨论】:

      • NetStream sendStream 只对服务器可用并且设置为 publish,所以我只能在这个流上从服务器向客户端发送数据(因此只有服务器的 nearID,客户端已经知道它,因为它使用它连接到服务器)。
      • 我没有得到任何 NetGroup.Neighbor.Connect(我应该吗?),我得到 NetConnection.Connect.Success(来自 Stratus),然后是几个 NetStream.Publish.* NetStream.Play .* 事件,但它们都不包含我能理解的 peerID。 :(
      • 再次感谢您的回答,但无法让它返回正确的 ID。 farNonce 确实返回了一个 ID,但不是客户端的正确 ID。然而,我确实从 Tom Krcha 的推特上得到了回复,该回复确实有效(twitter.com/tomkrcha/status/12882755421),很快就会在这里发布答案。再次感谢您的帮助!
      猜你喜欢
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 2020-05-16
      • 1970-01-01
      • 2018-04-26
      • 2015-04-29
      • 1970-01-01
      相关资源
      最近更新 更多