[common] PacketQueue fix

This commit is contained in:
2019-05-29 16:09:46 +03:00
parent 241499bc2d
commit c7946ef1da
5 changed files with 39 additions and 52 deletions

View File

@@ -1,5 +1,6 @@
package ru.m.connect; package ru.m.connect;
import Reflect;
import haxe.io.Bytes; import haxe.io.Bytes;
import haxe.io.BytesBuffer; import haxe.io.BytesBuffer;
import haxe.io.BytesInput; import haxe.io.BytesInput;
@@ -9,12 +10,13 @@ class PacketQueue<P:Message> {
public var packetClass(default, null):Class<P>; public var packetClass(default, null):Class<P>;
private var bytesBuff:Bytes; private var buffer:BytesBuffer;
private var msgs:List<P>; private var msgs:List<P>;
public function new(packetClass:Class<P>) { public function new(packetClass:Class<P>) {
this.packetClass = packetClass; this.packetClass = packetClass;
msgs = new List<P>(); msgs = new List<P>();
buffer = new BytesBuffer();
} }
public inline function hasMsg():Bool { public inline function hasMsg():Bool {
@@ -29,50 +31,41 @@ class PacketQueue<P:Message> {
msgs.add(msg); msgs.add(msg);
} }
public function addBytes(bytes:Bytes):Void { private function readPackage():Null<P> {
if (bytes == null) { var bytes = buffer.getBytes();
return; var input = new BytesInput(bytes);
} input.bigEndian = false;
if (bytesBuff == null) { if (input.length > 1) {
bytesBuff = bytes; var packetSize = input.readUInt16();
} else { if (input.length >= packetSize + 2) {
var buffer = new BytesBuffer();
buffer.add(bytesBuff);
buffer.add(bytes);
bytesBuff = buffer.getBytes();
}
if (bytesBuff == null || bytesBuff.length < 1) {
return;
}
var available = bytesBuff.length;
var bi = new BytesInput(bytesBuff);
bi.bigEndian = false;
while (available > 0) {
var packetSize = bi.readUInt16();
available -= 2;
if (packetSize <= available) {
var msgBytes = bi.read(packetSize);
var packet:P = Type.createInstance(packetClass, []); var packet:P = Type.createInstance(packetClass, []);
packet.mergeFrom(msgBytes); try {
addMsg(packet); packet.mergeFrom(input.read(packetSize));
available -= packetSize; buffer = new BytesBuffer();
} else { buffer.add(input.read(input.length - (packetSize + 2)));
break; return packet;
} catch (error:Dynamic) {
L.w("PacketQueue", "readPackage ", error);
buffer = new BytesBuffer();
return null;
} }
} }
if (available == 0) {
bytesBuff = null;
} else if (available > 0) {
if (bytesBuff.length != available) {
var pos = bytesBuff.length - available;
bytesBuff = bytesBuff.sub(pos, available);
} }
} else { buffer = new BytesBuffer();
throw "Wrong available: " + available; buffer.add(bytes);
return null;
}
public function addBytes(bytes:Bytes):Void {
buffer.add(bytes);
var packet = readPackage();
while (packet != null) {
msgs.add(packet);
packet = readPackage();
} }
} }
public function clean():Void { public function clean():Void {
bytesBuff = null; buffer = new BytesBuffer();
} }
} }

View File

@@ -74,16 +74,10 @@ class FlashConnection<O:Message, I:Message> extends BaseConnection<O, I> {
} }
private function onSocketData(_):Void { private function onSocketData(_):Void {
try {
var data = new flash.utils.ByteArray(); var data = new flash.utils.ByteArray();
socket.readBytes(data); socket.readBytes(data);
var bytes = Bytes.ofData(data); var bytes = Bytes.ofData(data);
pushData(bytes); pushData(bytes);
} catch (error:Dynamic) {
L.w("Connection", "onSocketData ", error);
queue.clean();
//handler.emit(ConnectionEvent.ERROR(error));
}
} }
private function _send(packet:O):Void { private function _send(packet:O):Void {

View File

@@ -51,8 +51,8 @@ typedef TankConfig = {
var speed:Float; var speed:Float;
var bullet:BulletConfig; var bullet:BulletConfig;
var bullets:Int; var bullets:Int;
var hits:Int;
var skin:String; var skin:String;
@:optinal var hits:Int;
@:optinal var upgrade:TankType; @:optinal var upgrade:TankType;
@:optinal var downgrade:TankType; @:optinal var downgrade:TankType;
@:optinal var score:Int; @:optinal var score:Int;

View File

@@ -163,7 +163,7 @@ presets:
- {<<: *team_human} - {<<: *team_human}
- id: bot - id: bot
spawnInterval: 3000 spawnInterval: 3000
life: 1 life: 10
players: players:
- {<<: *bot, index: 0, control: bot-stupid} - {<<: *bot, index: 0, control: bot-stupid}
- {<<: *bot, index: 1, control: bot-stupid} - {<<: *bot, index: 1, control: bot-stupid}