public class ExtendedClient { private var receivedData:ByteArray = new ByteArray(); private var length:int = -1; /** - */ private var client:Object; public function ExtendedClient(client:Object) { this.client = client; } /** * . * @param packet - . */ public function reciverLocalConnection(packet:ByteArray):void { // if(length == -1) length = packet.readUnsignedInt(); packet.readBytes(receivedData, receivedData.length, packet.length - packet.position); // if(receivedData.length == length) { // deserialization(receivedData); receivedData = new ByteArray(); length = -1; } } /** * . * @param receivedData - . */ protected function deserialization(receivedData:ByteArray):void { var parameters:Array = new Array(); var temp:ByteArray = new ByteArray(); while(receivedData.position != receivedData.length) { receivedData.readBytes(temp, 0, receivedData.readUnsignedInt() - 4); parameters.push(temp.readObject()); temp.clear(); } try { // (client[parameters[0]] as Function).apply(this, parameters.slice(1)); }catch(error:ReferenceError) { trace("Error:", error.message); } } }
public class ExtendedLocalConnect extends LocalConnection { private static const METHOD_NAME:String = "reciverLocalConnection"; /** */ private var _blockWeight:int; private var _complete:Boolean = true; public function ExtendedLocalConnect() { super(); } /** * . * @param localConnectionName - . * @param args - , . */ public function write(localConnectionName:String, ... args):void { // 63 _blockWeight = 40897 - localConnectionName.length - METHOD_NAME.length; _complete = false; var bytes:ByteArray = new ByteArray(); // bytes.writeUnsignedInt(0); // for(var i:int = 0, n:int = args.length; i < n; i++) { var startPosition:int = bytes.position; bytes.writeUnsignedInt(0); bytes.writeObject(args[i]); bytes.position = startPosition; // bytes.writeUnsignedInt(bytes.length - startPosition); bytes.position = bytes.length; } bytes.position = 0; // bytes.writeUnsignedInt(bytes.length - 4); bytes.position = 0; var bytesLength:int = bytes.length; var currentPosition:int = 0; var currentLength:int = bytesLength; while(currentLength > 0) { var packageLength:int = (currentLength > _blockWeight)? _blockWeight: currentLength; var packet:ByteArray = new ByteArray(); // bytes.readBytes(packet, 0, packageLength); currentPosition += packageLength; currentLength = bytesLength - currentPosition; if(!currentLength) _complete = true; // send(localConnectionName, METHOD_NAME, packet); } bytes.clear(); } public function set target(extendedClient:ExtendedClient):void { client = extendedClient; } public function get complete():Boolean { return _complete; } }
var extendedLocalConnection:ExtendedLocalConnect = new ExtendedLocalConnect(); var client:ExtendedClient = new ExtendedClient(this); extendedLocalConnection.target = client; // extendedLocalConnection.connect("myConnection"); // extendedLocalConnection.write("myConnection", "myFunction", data);
Source: https://habr.com/ru/post/246119/
All Articles