diff --git a/src/common/haxe/ru/m/connect/PacketUtil.hx b/src/common/haxe/ru/m/connect/PacketUtil.hx new file mode 100644 index 0000000..be47c1c --- /dev/null +++ b/src/common/haxe/ru/m/connect/PacketUtil.hx @@ -0,0 +1,20 @@ +package ru.m.connect; + +import haxe.io.Bytes; +import haxe.io.BytesOutput; +import protohx.Message; + +class PacketUtil { + + public static function fromBytes(bytes:Bytes, factory:Class

):P { + var packet:P = Type.createInstance(factory, []); + packet.mergeFrom(bytes); + return packet; + } + + public static function toBytes(packet:P):Bytes { + var out = new BytesOutput(); + packet.writeTo(out); + return out.getBytes(); + } +} diff --git a/src/common/haxe/ru/m/connect/desktop/DesktopConnection.hx b/src/common/haxe/ru/m/connect/desktop/DesktopConnection.hx index 08862bd..2048080 100644 --- a/src/common/haxe/ru/m/connect/desktop/DesktopConnection.hx +++ b/src/common/haxe/ru/m/connect/desktop/DesktopConnection.hx @@ -1,7 +1,6 @@ package ru.m.connect.desktop; import cpp.vm.Thread; -import haxe.io.BytesOutput; import haxe.Timer; import promhx.Deferred; import promhx.Promise; @@ -58,8 +57,7 @@ class DesktopConnection extends BaseConnection { socket.waitForRead(); var size = socket.input.readUInt16(); var data = socket.input.read(size); - var packet:I = Type.createInstance(queue.packetClass, []); - packet.mergeFrom(data); + var packet:I = PacketUtil.fromBytes(data, queue.packetClass); receiveHandler.emit(packet); } } catch (error:Dynamic) { @@ -68,9 +66,7 @@ class DesktopConnection extends BaseConnection { } private function _send(packet:O):Void { - var out = new BytesOutput(); - packet.writeTo(out); - var bytes = out.getBytes(); + var bytes = PacketUtil.toBytes(packet); socket.output.writeUInt16(bytes.length); socket.output.write(bytes); socket.output.flush(); diff --git a/src/common/haxe/ru/m/connect/fake/FakeConnection.hx b/src/common/haxe/ru/m/connect/fake/FakeConnection.hx index 9d6b657..bd44fd4 100644 --- a/src/common/haxe/ru/m/connect/fake/FakeConnection.hx +++ b/src/common/haxe/ru/m/connect/fake/FakeConnection.hx @@ -4,7 +4,6 @@ import ru.m.connect.IConnection.ConnectionEvent; import promhx.Promise; import protohx.Message; - class FakeConnection extends BaseConnection { override public function connect():Promise> { diff --git a/src/common/haxe/ru/m/connect/flash/FlashConnection.hx b/src/common/haxe/ru/m/connect/flash/FlashConnection.hx index 0269d90..7d33d33 100755 --- a/src/common/haxe/ru/m/connect/flash/FlashConnection.hx +++ b/src/common/haxe/ru/m/connect/flash/FlashConnection.hx @@ -8,7 +8,6 @@ import flash.events.SecurityErrorEvent; import flash.net.Socket; import flash.utils.Endian; import haxe.io.Bytes; -import haxe.io.BytesOutput; import promhx.Deferred; import promhx.Promise; import protohx.Message; @@ -76,21 +75,19 @@ class FlashConnection extends BaseConnection { private function onSocketData(_):Void { try { - var b = new flash.utils.ByteArray(); - socket.readBytes(b); - var bs = Bytes.ofData(cast b); - pushData(bs); + var data = new flash.utils.ByteArray(); + socket.readBytes(data); + var bytes = Bytes.ofData(data); + pushData(bytes); } catch (error:Dynamic) { handler.emit(ConnectionEvent.ERROR(error)); } } private function _send(packet:O):Void { - var out = new BytesOutput(); - packet.writeTo(out); - var bytes = out.getBytes(); + var bytes = PacketUtil.toBytes(packet); socket.writeShort(bytes.length); - socket.writeBytes(cast bytes.getData()); + socket.writeBytes(bytes.getData()); socket.flush(); } } diff --git a/src/common/haxe/ru/m/connect/js/JsConnection.hx b/src/common/haxe/ru/m/connect/js/JsConnection.hx index 9d5b763..3c4da44 100644 --- a/src/common/haxe/ru/m/connect/js/JsConnection.hx +++ b/src/common/haxe/ru/m/connect/js/JsConnection.hx @@ -1,11 +1,12 @@ package ru.m.connect.js; +import haxe.io.Bytes; import js.Browser; +import js.html.BinaryType; import js.html.WebSocket; import promhx.Deferred; import promhx.Promise; import protohx.Message; -import ru.m.Base64; import ru.m.connect.IConnection; class JsConnection extends BaseConnection { @@ -32,8 +33,8 @@ class JsConnection extends BaseConnection { override public function connect():Promise> { var self = this; - var decodeBytes = Base64.decodeBase64; socket = buildSocket(host, port); + socket.binaryType = BinaryType.ARRAYBUFFER; socket.onopen = this.onConnect; socket.onclose = this.onClose; socket.onerror = this.onError; @@ -67,8 +68,8 @@ class JsConnection extends BaseConnection { private function onSocketData(event:Dynamic):Void { try { - var data:String = event.data; - var packet:I = WebSocketTools.string2packet(data, queue.packetClass); + var bytes = Bytes.ofData(event.data); + var packet:I = PacketUtil.fromBytes(bytes, queue.packetClass); receive(packet); } catch (error:Dynamic) { handler.emit(ConnectionEvent.ERROR(event)); @@ -77,6 +78,7 @@ class JsConnection extends BaseConnection { override public function send(packet:O):Void { super.send(packet); - socket.send(WebSocketTools.packet2string(packet)); + var bytes = PacketUtil.toBytes(packet); + socket.send(bytes.getData()); } } diff --git a/src/common/haxe/ru/m/connect/neko/NekoConnection.hx b/src/common/haxe/ru/m/connect/neko/NekoConnection.hx index f6709bd..53626a3 100755 --- a/src/common/haxe/ru/m/connect/neko/NekoConnection.hx +++ b/src/common/haxe/ru/m/connect/neko/NekoConnection.hx @@ -1,6 +1,5 @@ package ru.m.connect.neko; -import haxe.io.BytesOutput; import protohx.Message; import sys.net.Socket; @@ -19,9 +18,7 @@ class NekoConnection extends BaseConnection { private function _send(packet:O):Void { try { - var b = new BytesOutput(); - packet.writeTo(b); - var bytes = b.getBytes(); + var bytes = PacketUtil.toBytes(packet); socket.output.writeUInt16(bytes.length); socket.output.write(bytes); socket.output.flush(); diff --git a/src/common/haxe/ru/m/connect/neko/NekoWebConnection.hx b/src/common/haxe/ru/m/connect/neko/NekoWSConnection.hx similarity index 82% rename from src/common/haxe/ru/m/connect/neko/NekoWebConnection.hx rename to src/common/haxe/ru/m/connect/neko/NekoWSConnection.hx index ea797f8..84c4aa3 100644 --- a/src/common/haxe/ru/m/connect/neko/NekoWebConnection.hx +++ b/src/common/haxe/ru/m/connect/neko/NekoWSConnection.hx @@ -3,10 +3,11 @@ package ru.m.connect.neko; import haxe.crypto.BaseCode; import haxe.crypto.Sha1; import haxe.io.Bytes; +import haxe.io.BytesBuffer; import protohx.Message; import sys.net.Socket; -class NekoWebConnection extends NekoConnection { +class NekoWSConnection extends NekoConnection { private var opened:Bool; @@ -16,12 +17,8 @@ class NekoWebConnection extends NekoConnection { } override private function _send(packet:O):Void { - try { - var data = WebSocketTools.packet2string(packet); - writeData(data, socket); - } catch (error:Dynamic) { - L.e('Proto', 'Error send packet: ${packet}', error); - } + var data = PacketUtil.toBytes(packet); + writeData(data, socket); } override public function pushData(bytes:Bytes):Void { @@ -36,13 +33,12 @@ class NekoWebConnection extends NekoConnection { } else { var data = parseData(bytes); if (data != null) { - var packet:I = WebSocketTools.string2packet(data, queue.packetClass); + var packet:I = PacketUtil.fromBytes(data, queue.packetClass); receive(packet); } } } - private function encodeBase64(content:String):String { var suffix = switch (content.length % 3) { @@ -73,8 +69,8 @@ class NekoWebConnection extends NekoConnection { socket.output.writeString(s); } - private function writeData(data:String, socket:sys.net.Socket, isServer = true):Void { - socket.output.writeByte(0x81); + private function writeData(data:Bytes, socket:sys.net.Socket, isServer = true):Void { + socket.output.writeByte(130); var len = 0; if (data.length < 126) len = data.length; @@ -97,7 +93,7 @@ class NekoWebConnection extends NekoConnection { } if (isServer) { - socket.output.writeString(data); + socket.output.writeBytes(data, 0, data.length); } else { var mask = [ Std.random(256), Std.random(256), Std.random(256), Std.random(256) ]; @@ -105,29 +101,29 @@ class NekoWebConnection extends NekoConnection { socket.output.writeByte(mask[1]); socket.output.writeByte(mask[2]); socket.output.writeByte(mask[3]); - var maskedData = new StringBuf(); + var maskedData = new BytesBuffer(); for (i in 0...data.length) { - maskedData.addChar(data.charCodeAt(i) ^ mask[i % 4]); + maskedData.addByte(data.get(i) ^ mask[i % 4]); } - socket.output.writeString(maskedData.toString()); + socket.output.writeBytes(maskedData.getBytes(), 0, maskedData.length); } } - private function parseData(bytes:Bytes):String { + private function parseData(bytes:Bytes):Bytes { var p = 0; var opcode = bytes.get(p++); if (opcode == 0x00) { - var s = ""; + var data = new BytesBuffer(); var b:Int; while ((b = bytes.get(p++)) != 0xFF) { - s += String.fromCharCode(b); + data.addByte(b); } - return s; + return data.getBytes(); } - // 0x81 = fin & text - if (opcode == 0x81) { + // 130 = binary data + if (opcode == 130) { var len = bytes.get(p++); // mask @@ -158,13 +154,13 @@ class NekoWebConnection extends NekoConnection { //Lib.println("mask = " + mask); - var data = new StringBuf(); + var data = new BytesBuffer(); for (i in 0...len) { - data.addChar(bytes.get(p++) ^ mask[i % 4]); + data.addByte(bytes.get(p++) ^ mask[i % 4]); } //Lib.println("readed = " + data.toString()); - return data.toString(); + return data.getBytes(); } else { throw "Expected masked data."; } diff --git a/src/server/haxe/ru/m/tankz/server/session/ProtoSession.hx b/src/server/haxe/ru/m/tankz/server/session/ProtoSession.hx index b3c4189..4bd78e7 100644 --- a/src/server/haxe/ru/m/tankz/server/session/ProtoSession.hx +++ b/src/server/haxe/ru/m/tankz/server/session/ProtoSession.hx @@ -1,10 +1,10 @@ package ru.m.tankz.server.session; -import ru.m.connect.neko.NekoWebConnection; import haxe.io.Bytes; import protohx.Message; import ru.m.connect.IConnection; import ru.m.connect.neko.NekoConnection; +import ru.m.connect.neko.NekoWSConnection; import sys.net.Socket; class ProtoSession implements ISession { @@ -37,7 +37,7 @@ class ProtoSession implements ISession { return null; } if (StringTools.startsWith(str, "GET")) { - connection = new NekoWebConnection(socket, request); + connection = new NekoWSConnection(socket, request); } else { connection = new NekoConnection(socket, request); } diff --git a/src/server/haxe/ru/m/tankz/server/session/_Session.hx b/src/server/haxe/ru/m/tankz/server/session/_Session.hx index d6d6c74..9727a66 100755 --- a/src/server/haxe/ru/m/tankz/server/session/_Session.hx +++ b/src/server/haxe/ru/m/tankz/server/session/_Session.hx @@ -7,7 +7,7 @@ import com.hurlant.crypto.prng.Random; import haxe.io.Bytes; import ru.m.connect.IConnection; import ru.m.connect.neko.NekoConnection; -import ru.m.connect.neko.NekoWebConnection; +import ru.m.connect.neko.NekoWSConnection; import ru.m.tankz.proto.core.UserProto; import ru.m.tankz.proto.pack.CreateGameRequest; import ru.m.tankz.proto.pack.CreateGameResponse; @@ -72,7 +72,7 @@ class _Session { return; } if (StringTools.startsWith(str, "GET")) { - connection = new NekoWebConnection(socket, Request); + connection = new NekoWSConnection(socket, Request); } else { connection = new NekoConnection(socket, Request); }