[common] add DesktopConnection

This commit is contained in:
2019-05-21 17:44:48 +03:00
parent 7984d8282c
commit a5722dfa9d
29 changed files with 646 additions and 217 deletions

View File

@@ -7,7 +7,6 @@ import promhx.Promise;
import protohx.Message;
import ru.m.connect.IConnection;
class BaseConnection<O:Message, I:Message> implements IConnection<O, I> {
public var handler(default, null):Signal<ConnectionEvent>;
public var sendHandler(default, null):Signal<O>;
@@ -17,12 +16,11 @@ class BaseConnection<O:Message, I:Message> implements IConnection<O, I> {
private var connectDeferred:Deferred<IConnection<O, I>>;
public function new(i:Class<I>) {
queue = new PacketQueue<I>(i);
public function new(inputFactory:Class<I>) {
queue = new PacketQueue<I>(inputFactory);
handler = new Signal<ConnectionEvent>();
sendHandler = new Signal<O>();
receiveHandler = new Signal<I>();
connectDeferred = new Deferred();
}
public function connect():Promise<IConnection<O, I>> {

View File

@@ -5,7 +5,6 @@ import haxe.io.Bytes;
import promhx.Promise;
import protohx.Message;
enum ConnectionEvent {
CONNECTED;
DISCONNECTED;

View File

@@ -0,0 +1,78 @@
package ru.m.connect.desktop;
import cpp.vm.Thread;
import haxe.io.BytesOutput;
import haxe.Timer;
import promhx.Deferred;
import promhx.Promise;
import protohx.Message;
import ru.m.connect.IConnection;
import sys.net.Host;
import sys.net.Socket;
class DesktopConnection<O:Message, I:Message> extends BaseConnection<O, I> {
private var host:String;
private var port:Int;
private var socket:Socket;
private var reader:Thread;
public function new(host:String, port:Int, inputFactory:Class<I>) {
super(inputFactory);
this.host = host;
this.port = port;
connected = false;
socket = new Socket();
socket.setFastSend(true);
socket.output.bigEndian = false;
socket.input.bigEndian = false;
sendHandler.connect(_send);
}
override public function connect():Promise<IConnection<O, I>> {
connectDeferred = new Deferred();
try {
if (connected) {
connectDeferred.resolve(this);
} else {
socket.connect(new Host(host), port);
connected = true;
reader = Thread.create(_read);
connectDeferred.resolve(this);
}
} catch (error:Dynamic) {
Timer.delay(function() connectDeferred.throwError(error), 1);
}
return connectDeferred.promise();
}
override public function disconnect():Void {
socket.close();
connected = false;
handler.emit(DISCONNECTED);
}
private function _read():Void {
try {
while (connected) {
socket.waitForRead();
var size = socket.input.readUInt16();
var data = socket.input.read(size);
var packet:I = Type.createInstance(queue.packetClass, []);
packet.mergeFrom(data);
receiveHandler.emit(packet);
}
} catch (error:Dynamic) {
handler.emit(ERROR(error));
}
}
private function _send(packet:O):Void {
var out = new BytesOutput();
packet.writeTo(out);
var bytes = out.getBytes();
socket.output.writeUInt16(bytes.length);
socket.output.write(bytes);
socket.output.flush();
}
}

View File

@@ -1,18 +1,18 @@
package ru.m.connect.flash;
import ru.m.connect.IConnection.ConnectionEvent;
import promhx.Promise;
import flash.utils.Endian;
import haxe.io.BytesOutput;
import protohx.Message;
import haxe.io.Bytes;
import flash.events.ErrorEvent;
import flash.events.ProgressEvent;
import flash.events.Event;
import flash.events.SecurityErrorEvent;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
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;
import ru.m.connect.IConnection;
class FlashConnection<O:Message, I:Message> extends BaseConnection<O, I> {
@@ -20,8 +20,8 @@ class FlashConnection<O:Message, I:Message> extends BaseConnection<O, I> {
private var port:Int;
private var socket:Socket;
public function new(host:String, port:Int, i:Class<I>) {
super(i);
public function new(host:String, port:Int, inputFactory:Class<I>) {
super(inputFactory);
this.host = host;
this.port = port;
connected = false;
@@ -37,14 +37,15 @@ class FlashConnection<O:Message, I:Message> extends BaseConnection<O, I> {
override public function connect():Promise<IConnection<O, I>> {
socket.connect(host, port);
connectDeferred = new Deferred();
return connectDeferred.promise();
}
override public function disconnect():Void {
if (socket.connected) {
socket.close();
//connected = false;
//handler.emit(ConnectionEvent.DISCONNECTED);
connected = false;
handler.emit(ConnectionEvent.DISCONNECTED);
}
}
@@ -52,13 +53,19 @@ class FlashConnection<O:Message, I:Message> extends BaseConnection<O, I> {
socket.close();
connected = false;
handler.emit(ConnectionEvent.ERROR(event));
connectDeferred.throwError(event);
if (connectDeferred != null) {
connectDeferred.throwError(event);
connectDeferred = null;
}
}
private function onConnect(_):Void {
connected = true;
handler.emit(ConnectionEvent.CONNECTED);
connectDeferred.resolve(this);
if (connectDeferred != null) {
connectDeferred.resolve(this);
connectDeferred = null;
}
}
private function onClose(_):Void {
@@ -86,4 +93,4 @@ class FlashConnection<O:Message, I:Message> extends BaseConnection<O, I> {
socket.writeBytes(cast bytes.getData());
socket.flush();
}
}
}

View File

@@ -2,11 +2,11 @@ package ru.m.connect.js;
import js.Browser;
import js.html.WebSocket;
import promhx.Deferred;
import promhx.Promise;
import protohx.Message;
import ru.m.Base64;
import ru.m.connect.IConnection.ConnectionEvent;
import ru.m.connect.IConnection;
class JsConnection<O:Message, I:Message> extends BaseConnection<O, I> {
@@ -14,8 +14,8 @@ class JsConnection<O:Message, I:Message> extends BaseConnection<O, I> {
private var port:Int;
private var socket:WebSocket;
public function new(host:String, port:Int, i:Class<I>) {
super(i);
public function new(host:String, port:Int, inputFactory:Class<I>) {
super(inputFactory);
this.host = host;
this.port = port;
connected = false;
@@ -38,11 +38,12 @@ class JsConnection<O:Message, I:Message> extends BaseConnection<O, I> {
socket.onclose = this.onClose;
socket.onerror = this.onError;
socket.onmessage = this.onSocketData;
connectDeferred = new Deferred();
return connectDeferred.promise();
}
override public function disconnect():Void {
socket.close();
socket.close(1000);
connected = false;
}
@@ -78,4 +79,4 @@ class JsConnection<O:Message, I:Message> extends BaseConnection<O, I> {
super.send(packet);
socket.send(WebSocketTools.packet2string(packet));
}
}
}

View File

@@ -4,7 +4,6 @@ import haxe.io.BytesOutput;
import protohx.Message;
import sys.net.Socket;
class NekoConnection<O:Message, I:Message> extends BaseConnection<O, I> {
public var socket(default, null):Socket;
@@ -30,4 +29,4 @@ class NekoConnection<O:Message, I:Message> extends BaseConnection<O, I> {
L.e('Proto', 'Error send packet: ${packet}', error);
}
}
}
}

View File

@@ -2,11 +2,10 @@ package ru.m.connect.neko;
import haxe.crypto.BaseCode;
import haxe.crypto.Sha1;
import protohx.Message;
import haxe.io.Bytes;
import protohx.Message;
import sys.net.Socket;
class NekoWebConnection<O:Message, I:Message> extends NekoConnection<O, I> {
private var opened:Bool;
@@ -180,4 +179,4 @@ class NekoWebConnection<O:Message, I:Message> extends NekoConnection<O, I> {
}
return null;
}
}
}

View File

@@ -1,18 +0,0 @@
package ru.m.tankz.network;
import ru.m.tankz.game.Game;
import ru.m.tankz.proto.core.GameProto;
class NetworkGame extends Game {
private static var TAG(default, never):String = 'NetworkGame';
public function load(proto:GameProto):Void {
L.w(TAG, 'load: ${proto}');
// ToDo:
}
public function export():GameProto {
return new GameProto();
}
}