package; import haxe.ds.IntMap; import haxe.ds.Vector; import haxe.io.Bytes; import lime.app.Application; import peote.net.PeoteServer; import peote.io.PeoteBytesOutput; import peote.io.PeoteBytesInput; class Server { public static var MAX_VIEWS_PER_CLIENT:Int = 3; public static var MAX_CLIENTS:Int = 128; var peoteServer:PeoteServer; var netView:Vector; var onViewDisconnect:ViewInterface-> Void; public function new() {} public function open (server:String, port:Int, joint:String, onViewConnect:ViewInterface->Void, onViewDisconnect:ViewInterface->Void):Void { this.onViewDisconnect = onViewDisconnect; netView = new Vector( MAX_CLIENTS * MAX_VIEWS_PER_CLIENT ); peoteServer = new PeoteServer({ onCreateJoint: function(jointNr:Int) { trace("new channel " + jointNr + " created"); }, onCreateJointError: function(errorNr:Int) { trace("canĀ“t create channel. error:" + errorNr); }, onUserConnect: function(jointNr:Int, userNr:Int) { trace("onUserConnect: jointNr=" + jointNr + ", userNr=" + userNr); // TODO: // no or corrupt data -> logout-timer }, onUserDisconnect: function(jointNr:Int, userNr:Int, reason:Int) { trace("onUserDisconnect: jointNr=" + jointNr + ", userNr=" + userNr + ", reason=" + reason); for (i in 0...MAX_VIEWS_PER_CLIENT) { if (netView.get(userNr * MAX_VIEWS_PER_CLIENT + i) != null) onViewDisconnect(netView.get(userNr * MAX_VIEWS_PER_CLIENT + i)); } }, onData: function(jointNr:Int, userNr:Int, bytes:Bytes ) { trace("User " + userNr + "sends some bytes on channel " + jointNr); // TODO: erstes byte ist immer view-nr, // wenn die noch nicht ex. dann neuen anlegen! var viewNr:Int = bytes.get(0); if (viewNr > MAX_VIEWS_PER_CLIENT) { // COMMUNICATIONPROBLEM } var view = netView.get(userNr * MAX_VIEWS_PER_CLIENT + viewNr); if (view == null) { var view = new NetView(peoteServer, userNr); netView.set(userNr * MAX_VIEWS_PER_CLIENT + viewNr, view); onViewConnect(view); } else { // ansonsten schauen von welchem netView.model // welche Funktion+params aufgerufen werden soll //view.???(???) } } }); peoteServer.createJoint(server, port, joint); } public function close():Void { peoteServer.deleteJoint(); for (userNr in 0...MAX_CLIENTS) { for (i in 0...MAX_VIEWS_PER_CLIENT) { if (netView.get(userNr * MAX_VIEWS_PER_CLIENT + i) != null) onViewDisconnect(netView.get(userNr * MAX_VIEWS_PER_CLIENT + i)); } } } }