[common] PacketQueue fix
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
Reference in New Issue
Block a user