Простое двунаправленное общение через P2P NetStream - PullRequest
1 голос
/ 26 апреля 2010

Я изучал поддержку P2P во Flash 10, используя сервис Adobe Stratus. Я успешно смог отправить данные от одного пользователя другому, но проблема в том, что я не понял, как отправить данные обратно каким-либо простым способом (или как своего рода ответ на первый вызов).

Что я сейчас делаю;

  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 от клиента к серверу (например, опубликовать на клиенте и воспроизвести на сервере). Но для этого серверу необходимо знать nc.nearID на клиенте.

    Можно ли получить этот идентификатор, не заставляя пользователя вручную копировать его с клиента на сервер? Или есть ли более простой способ для клиента вернуться к пропущенному серверу?

Ответы [ 2 ]

1 голос
/ 26 апреля 2010

С Томом Крчем связался через твиттер (http://twitter.com/tomkrcha/status/12882755421): он сказал мне, чтобы я посмотрел в свойство onPeerConnected (...) NetStream, и оно сработало.

FarID на подписчике NetStream решил мой вопрос;

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");
0 голосов
/ 26 апреля 2010

почему вы не отправляете nearID на сервер, вызывая удаленный метод через sendStream.send?

edit: извините, не совсем понял. Я предлагаю, вы слушаете клиентские соединения на сервере. NetGroup.Neighbor.Connect должно быть то, что вам нужно:
Отправляется, когда сосед подключается к этому узлу. Свойство info.neighbor: String является групповым адресом соседа. Свойство info.peerID: String является идентификатором соседа.

edit: если вы получаете какие-либо события при подключении клиентов, то вы можете извлечь всех клиентов и использовать их farNonce на сервере, который является nearNonce подключенного потока на клиенте.

Greetz
back2dos

...