2010-04-26 1 views
1

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

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

  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 на клиенте.

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

ответ

1

Связался Том Krcha через твиттер (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

почему бы вам не отправить nearID к серверу путем вызова удаленного метода через sendStream.send?

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

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

Greetz
back2dos

+0

NetStream sendStream доступен только на сервер и установлен на * публиковать *, так что я только способен передавать данные от сервера к клиенту в этом потоке (и, следовательно, только nearID сервера, который клиент уже знает, так как он использовал его для подключения к серверу). – andsve

+0

@andsve: ответ обновлен. – back2dos

+0

У меня нет NetGroup.Neighbor.Connect (должен ли я?), Я получаю NetConnection.Connect.Success (от Stratus), а затем пару событий NetStream.Publish. * NetStream.Play. *, Но ни один из они включают peerID из того, что я могу понять. :( – andsve

 Смежные вопросы

  • Нет связанных вопросов^_^