我有一個多人遊戲,它從服務器讀取XML數據:信息bytesAvailable,的readUTF()和ProgressEvent.SOCKET_DATA
_socket = new Socket();
_socket.addEventListener(ProgressEvent.SOCKET_DATA, handleTcpData);
.....
private function handleTcpData(event:Event):void {
while (_socket.bytesAvailable) {
var str:String = _socket.readUTF();
updateGUI(str);
}
}
在大多數情況下,它工作正常,但有時用戶抱怨 遊戲掛起他們。他們能夠發送命令到 服務器,但從他們的描述我懷疑,上面的功能 不適合他們和updateGUI()
停止被稱爲。我認爲我的服務器(在Perl/C中, 非分叉,使用poll())效果很好,我必須在Flash端做一些錯誤的事情 。
在這裏撥打readUTF()
是個好主意嗎?很可能, 只有部分UTF字符串到達,然後Flash電影 會凍結在readUTF()
,不是嗎? (我從來沒有見過,雖然)
UPDATE:
是的,謝謝,我需要趕上EOFError
,也是我有一個郵件列表一個善意的提醒 ,我必須閱讀_socket.bytesAvailable
字節 到一個ByteArray
並與該工作(檢查我的完整消息 抵達) - 其他任何東西都不可靠。
所以我想出了這一點,但仍然有缺陷有:
private function handleTcpData(event:Event):void {
var len:uint;
if (0 == _socket.bytesAvailable)
return;
try {
_socket.readBytes(_ba, _ba.bytesAvailable, _socket.bytesAvailable);
// read the length of the UTF string to follow
while (_ba.bytesAvailable >= 2) {
len = _ba.readUnsignedShort();
// invalid length - reset
if (0 == len) {
trace('XXX invalid len = ' + len);
_ba.position = 0;
_ba.length = 0;
return;
}
if (_ba.bytesAvailable >= len) {
var str:String = _ba.readUTFBytes(len);
updateGUI(str);
// copy the remaining bytes
// (does it work? can it be improved?)
var newBA:ByteArray = new ByteArray();
newBA.readBytes(_ba);
_ba = newBA;
}
}
} catch(e:Error) {
trace('XXX ' + e);
_ba.position = 0;
_ba.length = 0;
return;
}
}
- 當有太多可用的字節數,例如800 和我的消息只有400個字節長,然後它Stucks。
另外我想知道,如果複製剩餘的字節可能是 改進(即沒有每次分配一個新的ByteArray)?
我經常可以重現這個漏洞,幸好
是的,謝謝,我的Perl服務器發送的前綴長度,這不是一個問題。 – 2010-02-23 21:39:38