PDA

Просмотр полной версии : Передача данных p2p


CARVILLE
22.04.2012, 16:28
доброго времени суток, уважаемые форумчане, недавно нашел несколько примеров создания чатов на флеше с использованием технологии RTMFP и p2p. Собс-но примеры для чатов были хорошими, и я решил немного углубится в эту тему. Вот код
public class main extends MovieClip {
var response:String;
var s:Socket;
var p2p:p2pConnect= new p2pConnect();
var Rpack,Spack:Object;
var Rp:ByteArray;
var r,r2:round;
var i=false;
var c:Controls = new Controls(stage);
var nc:NetConnection;
public function main() {
nc = new NetConnection();
//nc.addEventListener(NetStatusEvent.NET_STATUS, rtmfpHandler);
nc.connect("rtmfp://p2p.rtmfp.net/" + "*****************************");
connect_btn.addEventListener(MouseEvent.CLICK, createConnect);
addEventListener(Event.ENTER_FRAME,lookConnect);
// constructor code

}


function createConnect (e:MouseEvent) {
addChild(p2p);
}
function lookConnect (e:Event) {
if(p2p.Status=="Connected"){
connect_btn.removeEventListener(MouseEvent.CLICK, createConnect);
removeEventListener(Event.ENTER_FRAME,lookConnect);
netPlay();
}
}

function netPlay () {
gotoAndStop(2);

r=createRound (Math.random()*540,Math.random()*390);
addChild(r);
addEventListener(Event.ENTER_FRAME,readP2Packs)
p2p.sendP2Package(createP2Packs(r));
addEventListener(Event.ENTER_FRAME,moveO);
}

function moveO (e:Event) {
if(c.forward){r.y-=1;p2p.sendP2Package(createP2Packs(r));
};
if(c.back){r.y+=1;p2p.sendP2Package(createP2Packs(r));
};
if(c.lft){r.x-=1;p2p.sendP2Package(createP2Packs(r));
};
if(c.rght){r.x+=1;p2p.sendP2Package(createP2Packs(r));
};

}

function sendP2Packs(e:TimerEvent) {
p2p.sendP2Package(createP2Packs(r))
}
function readP2Packs(e:Event) {
Rpack=p2p.readP2Pakcage();
Rpack.pack.position=0;
if(!i){r2=createRound(Rpack.pack.readInt(),Rpack.y);addChild(r2);i=true}else{
r2.x=Rpack.pack.readInt();
r2.y=Rpack.pack.readInt()}
tt.text=(r2.x+" "+r2.y);
}
function createP2Packs(r:round):Object
{
var ba:ByteArray = new ByteArray();
ba.writeInt(int(r.x));
ba.writeInt(int(r.y));

var o:Object = new Object();
o.pack=ba;
return o;
}

function createRound (X:Number,Y:Number):round {
var ro=new round();
ro.x=X;
ro.y=Y;
return ro;
}
}
Немного пояснений: две проги конектятся друг к другу, каждая рисует свой кружок, координаты которого передает другой. пользователь с помощью клавиатуры изменяет координаты своего круга (WASD) и прога шлет новые координаты, и т.д. проблемма в том что проходит задержка время между изменением координат в одной и другой программе(где-то 0,5-1с). Собственно вопрос: есть ли какие-то способы уменьшения времени задержки, и лучшей синхронизации действий между приложениями. Если есть какие нить ссылки на инфу по этой теме буду премного благодарен:)

ramshteks
22.04.2012, 17:35
вы шлете данные по сети. Задержки неизбежны

CARVILLE
22.04.2012, 17:45
это понятно, я спрашивал есть ли какие-нить способы минимизировать задержки?

bublic_bicubic
22.04.2012, 17:59
есть вероятность, что из-за Rpack=p2p.readP2Pakcage(); происходят задержки
общение нужно сделать асинхронным
уменьшить объем передаваемых данных (за счет удаления лишних данных, например когда круг неподвижен или имеет постоянную скорость)

CARVILLE
22.04.2012, 19:50
а поподробней можно насчет асинхронности?
сама функция
private var p2pPackage:Object;
public function readP2Pakcage ():* {
return p2pPackage;
}

MigunovAlex
26.04.2012, 00:13
Лучше организовать через сокет, мое мнение

dsQuadro
26.04.2012, 13:53
спрашиваете про оптимизацию п2п, а сам класс отвечающий за п2п не включаете...

garymar
21.05.2012, 12:32
А почему не задействован нигде netGroup? Или тут его не видно? И почему не шлете данные через поток NetStream.send() ??? Это весь код? Через поток задержек невидно вообще. Я запускал 16 флешек одновременно - всё нормально, без задержек...

Партизан
21.05.2012, 13:21
Я вообще не понимаю как это у вас работает. Из всего, что вы спросили, к p2p из приведенного кода относится лишь nc который вы никак не используете, и некий загадочный p2pConnect, который как я предполагаю создает вообще другое подключение, так как из кода nc вы никуда не передаете. Событий ENTER_FRAME непонятное количество, и более непонятно почему именно этим событием вы постоянно заставляете ваш класс p2pConnect читать некий скорее еще не существующий объект. Пересмотрите логику вашего приложения. Слишком очевидны лишние действия, удаление которых возможно и повлияет на скорость приема/передачи.