Показать сообщение отдельно
Старый 18.04.2012, 04:52
syegorius вне форума Посмотреть профиль Отправить личное сообщение для syegorius Найти все сообщения от syegorius
  № 5  
Ответить с цитированием
syegorius

Регистрация: Nov 2010
Сообщений: 91
спасибо за ссылку, хотя вообще-то парень рассказывает про класс P2PGame, исходников которого нет, а есть только swc и ломай голову как оттуда достать код, а хотя именно в этом классе как раз то, что мне нужно. тем не менее пошатался и нашел у него же небольшой туториал http://www.flashrealtime.com/basics-of-p2p-in-flash/. все понятно и даже у меня самого получилось.

в итоге начал переделывать то, что у него под себя и сразу же возникло несколько вопроса (огромная просьба не игнорировать их и помочь разобраться, как никак тема интересная, а нормальной доходчивой информации нетак уж и много):

вот то что я сделал из того что было в туториале:

Код AS3:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" width="0" height="0" creationComplete="js()" layout="absolute">
	<mx:Script>
		<![CDATA[
			import flash.external.*;
 
			private const SERVER_ADDRESS:String = "rtmfp://p2p.rtmfp.net/850ecff774ce98e0c0c765f3-29ce3314ba14/";
			private var nc:NetConnection;
			private var myPeerID:String; 
			private var farPeerID:String;
			private var sendStream:NetStream; 
			private var recvStream:NetStream;
 
			private function initConnection():void{
				nc = new NetConnection();
				nc.addEventListener(NetStatusEvent.NET_STATUS,ncStatus);
				nc.connect(SERVER_ADDRESS);
			}
 
			private function ncStatus(event:NetStatusEvent):void{
				myPeerID = nc.nearID; //getting current user id
				var res:String = ExternalInterface.call("ncStatus",myPeerID);
			}
 
			private function setFarPeerID(jsFarPeerID:String):void{
				farPeerID = jsFarPeerID; //setting remote user id
			}
 
			private function initSendStream(jsFarPeerID:String):void{
				setFarPeerID(jsFarPeerID);
				sendStream = new NetStream(nc,NetStream.DIRECT_CONNECTIONS);
				sendStream.publish("media");
				var sendStreamClient:Object = new Object();
				sendStreamClient.onPeerConnect = function(callerns:NetStream):Boolean{
					farPeerID = callerns.farID;
					return true;
				}
				sendStream.client = sendStreamClient;
			}
 
			private function initReceiveStream(jsFarPeerID:String):void{
				setFarPeerID(jsFarPeerID);
				recvStream = new NetStream(nc,farPeerID);
				recvStream.play("media");
				recvStream.client = this;
			}
 
			public function receiveSomeData(str:String):void{
				var res:String = ExternalInterface.call("receiveSomeData",str);
			}
 
			private function sendSomeData(str:String):void{
				sendStream.send("receiveSomeData",str);
			}
 
			public function jsInitConnection():void{
				ExternalInterface.addCallback("initConnection",initConnection);
			}
 
			public function jsInitSendStream():void{
				ExternalInterface.addCallback("initSendStream",initSendStream);
			}
 
			public function jsInitReceiveStream():void{
				ExternalInterface.addCallback("initReceiveStream",initReceiveStream);
			}
 
			public function jsSetFarPeerID():void{
				ExternalInterface.addCallback("setFarPeerID",setFarPeerID);
			}
 
			public function jsSendSomeData():void{
				ExternalInterface.addCallback("sendSomeData",sendSomeData);
			}
 
			public function js():void{
				jsInitConnection();
				jsInitSendStream();
				jsInitReceiveStream();
				jsSetFarPeerID();
				jsSendSomeData();
			}
		]]>
	</mx:Script>
</mx:Application>
и собственно вопросы:

первый вопрос: в туториале был показан пример в котором клиент может получить информацию только от одного клиента и точно также может передать информацию только одному клиенту. естественно так как обо всем выше перечисленном я узнал только на днях в моей версии так же клиент может получить информацию только от одного клиента и обратно. в ссылке предыдущего поста как раз речь идет о том чтобы получать инфо не от одного, а от нескольких пользователей, но так как код нужного класса не посмотреть прошу помощи у вас - как в этих двух функциях заменить farPeerID на койлибо мультиID или массив или вообщем не знаю что еще можно придумать:

Код AS3:
 
                        private var farPeerID:String;
 
                        private function initSendStream(jsFarPeerID:String):void{
				setFarPeerID(jsFarPeerID);
				sendStream = new NetStream(nc,NetStream.DIRECT_CONNECTIONS);
				sendStream.publish("media");
				var sendStreamClient:Object = new Object();
				sendStreamClient.onPeerConnect = function(callerns:NetStream):Boolean{
					farPeerID = callerns.farID;
					return true;
				}
				sendStream.client = sendStreamClient;
			}
 
			private function initReceiveStream(jsFarPeerID:String):void{
				setFarPeerID(jsFarPeerID);
				recvStream = new NetStream(nc,farPeerID);
				recvStream.play("media");
				recvStream.client = this;
			}
 
                        private function setFarPeerID(jsFarPeerID:String):void{
				farPeerID = jsFarPeerID; //setting remote user id
			}
второй (возможно слегка не по теме и многие начнут смеяться): я использую swfObject для вставки swf и здесь мне нужно вызывать функции внутри моего swf-приложения из яваскрипта. раньше никогда этого не делал. загуглил. попал на эту статью http://livedocs.adobe.com/flex/3/htm...guments_5.html. тут говорится, что id у object и name в embed должны быть одинаковыми. использую mozilla и swfObject() создает просто тег object, без embed внутри него, а тем более без атрибута name внутри. скажите, как установить настройки swfObject() так что бы вставлялся тег object вместе с embed и атрибутом name в embed.
пока ищу решение проблемы попробовал просто написать:
Код:
<object id="p2p" type="application/x-shockwave-flash" data="myfile.swf">
       <embed name='p2p' src='p2p2.swf' />
</object>
и в яваскрипте:
Код:
$(document).ready(function(){
	p2p.initConnection()
})
в фаербаге написало:
"Элемент доступен по идентификатору/имени в глобальной области видимости. Используйте вместо этого соответствующий стандарту W3C метод document.getElementById()."

попробовал:
Код:
$(document).ready(function(){
	var p2p=document.getElementById('p2p');
	p2p.initConnection()
})
в фаербаге написало:
"p2p.initConnection is not a function"

и еще много чего пробовал но так ничего и не вызвалось...

что не так?

третий вопрос: в своей переделке я использую import flash.external.ExternalInterface; и похоже из-за этого приложение раздуло с 50кб аж до 278кб или не из-за этого? что так сильно может придавать вес приложению?

четвертый вопрос: в функции initConnection() каждое приложение получает свой уникальный id. как долго этот id действителен?

пятый вопрос: сегодня где-то наткнутся на информацию, что данные передаются по протоколу udp или по какому-то производному от него протоколу, который блокируются многими фаерволами. как часто такое случается и что делать в таких случаях? можно ли каким-то образом это обойти? все что предполагается передавать между клиентами это небольшие json-массивы весом не более 1кб.

заранее спасибо за ответы!


Последний раз редактировалось syegorius; 18.04.2012 в 05:21.