PDA

Просмотр полной версии : [p2p] Проблема с организацией потоков


AlexCooper
19.10.2011, 13:59
Здравствуйте.
Пишу р2р-шный камчат, проблемы возникают при созданию обратного слушателя "сидера" от "пира".

Сид
public function initConnection():void{

trace('initconnect');

nc = new NetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS,ncStatus);
nc.connect(SERVER_ADDRESS+DEVELOPER_KEY);
}

public function ncStatus(event:NetStatusEvent):void{

trace(event.info.code);

myPeerID = nc.nearID;

initSendStream();
}

public function initSendStream():void{

trace("initSendStream");

sendStream = new NetStream(nc,NetStream.DIRECT_CONNECTIONS);
sendStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
sendStream.publish(myPeerID);

var sendStreamClient:Object = new Object();

sendStreamClient.onPeerConnect = function(callerns:NetStream):Boolean{


farPeerID = callerns.farID;

trace("onPeerConnect "+farPeerID);
initRecvStream();
//var metaData:Object = new Object();
//metaData.title = "myStream";
//metaData.width = Camera.getCamera().width;
//metaData.height = Camera.getCamera().height;

//sendStream.send("@setDataFrame", "onMetaData", metaData);

return true;
}

sendStream.client = sendStreamClient;

}

public function initRecvStream():void{

recvStream = new NetStream(nc,farPeerID);
recvStream.addEventListener(NetStatusEvent.NET_STATUS,netStatusHandler2);
recvStream.play("c-channel");
var r = new Object();
recvStream.client = r;

}

public function receiveSomeData(str:String):void{
email.text=str;
}

public function sendSomeData():void{
//sendStream.send("receiveSomeData",txtSendData.text);
//txtSendData.text='';
}

public function netStatusHandler2(event:NetStatusEvent):void{
//trace("reciver");
//trace(event.info.code);
}
public function netStatusHandler(event:NetStatusEvent):void{
trace(event.info.code);

if (event.info.code == "NetConnection.Connect.Success") {
trace('softid');
}

if (event.info.code == "NetStream.Publish.Start")
{
if (stats!='set')
{
stats='set';


sendStream.attachCamera( Camera.getCamera() );
sendStream.attachAudio( Microphone.getMicrophone() );

softid = (_sharedObj.data.softid) ? _sharedObj.data.softid: "";

var loader:URLLoader = new URLLoader();

loader.addEventListener( Event.COMPLETE, servComplete );

loader.dataFormat = URLLoaderDataFormat.VARIABLES;

trace("***Publish start\n***");
trace("SoftID -> "+softid);
trace("StreamID -> "+nc.nearID);

//loader.load( new URLRequest("http://localhost/demo/setid.php?softid="+softid+"&streamid="+nc.nearID+"&email="+email.text ) );

}
}


}
Пир

function initConnection():void{

trace('initconnect');

if(peep!=""){
farPeerID = peep;
}
nc = new NetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS,ncStatus);
nc.connect(SERVER_ADDRESS+DEVELOPER_KEY);
}

function ncStatus(event:NetStatusEvent):void{

trace(event.info.code);

myPeerID = nc.nearID;

txtFingerprint.text = myPeerID;
initSendStream();
initRecvStream();

}

function initSendStream():void{

trace("initSendStream");

sendStream = new NetStream(nc,NetStream.DIRECT_CONNECTIONS);
sendStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
sendStream.publish("c-channel");

var sendStreamClient:Object = new Object();

sendStreamClient.onPeerConnect = function(callerns:NetStream):Boolean{

farPeerID = callerns.farID;

trace("onPeerConnect "+farPeerID);

return true;
}

sendStream.client = sendStreamClient;

}
senders.addEventListener(MouseEvent.CLICK,sending);

function sending(eve:Event):void
{
trace("sending");
sendStream.send("receiveSomeData","sending");
}

function initRecvStream():void{

var customClient:Object = new Object();
customClient.onMetaData = metaDataHandler;

recvStream = new NetStream(nc,farPeerID);
recvStream.addEventListener(NetStatusEvent.NET_STATUS,netStatusHandler);


recvStream.client = {onMetaData:ns_onMetaData, onCuePoint:ns_onCuePoint};

recvStream.play(farPeerID);
video.attachNetStream(recvStream);

function metaDataHandler(infoObject:Object):void
{
trace(infoObject.width);
trace(infoObject.height);
}
}

function ns_onMetaData(item:Object):void {

trace("metaData");

video.width = item.width;
video.height = item.height;

video.x = (stage.stageWidth - video.width) / 2;
video.y = (stage.stageHeight - video.height) / 2;

}


function ns_onCuePoint(item:Object):void {
trace("cuePoint");
trace(item.name + "\t" + item.time);
}

function onMetaData(info:Object):void {
trace("width: " + info.width);
trace("height: " + info.height);
}

function receiveSomeData(str:String):void{

}

function sendSomeData():void{
//sendStream.send("receiveSomeData",txtSendData.text);
//txtSendData.text='';
}

function netStatusHandler(event:NetStatusEvent):void{
trace(event.info.code);

if (event.info.code == "NetConnection.Connect.Success") {


}

}
Цепь последовательности:
Сид получает от стратуса ИД записывает его в БД и начинает трансляцию.
Пир считывает БД подключается к Сид и начинает воспроизводить видеопоток.
Сид определивши подключение Пира создаёт для слушатель, который должен принимать и отдавать команды, свойства от/к Пира/у.

При моей реализации Сид сходит с ума, получая практически постоянно netStatusHandler2