[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;
import Reflect;
import haxe.io.Bytes;
import haxe.io.BytesBuffer;
import haxe.io.BytesInput;
@@ -9,12 +10,13 @@ class PacketQueue<P:Message> {
public var packetClass(default, null):Class<P>;
private var bytesBuff:Bytes;
private var buffer:BytesBuffer;
private var msgs:List<P>;
public function new(packetClass:Class<P>) {
this.packetClass = packetClass;
msgs = new List<P>();
buffer = new BytesBuffer();
}
public inline function hasMsg():Bool {
@@ -29,50 +31,41 @@ class PacketQueue<P:Message> {
msgs.add(msg);
}
public function addBytes(bytes:Bytes):Void {
if (bytes == null) {
return;
}
if (bytesBuff == null) {
bytesBuff = bytes;
} else {
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);
private function readPackage():Null<P> {
var bytes = buffer.getBytes();
var input = new BytesInput(bytes);
input.bigEndian = false;
if (input.length > 1) {
var packetSize = input.readUInt16();
if (input.length >= packetSize + 2) {
var packet:P = Type.createInstance(packetClass, []);
packet.mergeFrom(msgBytes);
addMsg(packet);
available -= packetSize;
} else {
break;
try {
packet.mergeFrom(input.read(packetSize));
buffer = new BytesBuffer();
buffer.add(input.read(input.length - (packetSize + 2)));
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 {
throw "Wrong available: " + available;
buffer = new BytesBuffer();
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 {
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 {
try {
var data = new flash.utils.ByteArray();
socket.readBytes(data);
var bytes = Bytes.ofData(data);
pushData(bytes);
} catch (error:Dynamic) {
L.w("Connection", "onSocketData ", error);
queue.clean();
//handler.emit(ConnectionEvent.ERROR(error));
}
}
private function _send(packet:O):Void {

View File

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

View File

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