使用socket方式與flash通訊,
簡單字串協議,每行一個數據。如:
xxxx\nxxxx\nxxxx\n
當然,xxxx是個json數據也挺好,擴展數據維度。解析就不用費勁了。
socke流式傳輸數據會有 x\nxxx的情況出現,粘包問題也是必須處理的。
像java,c#,python客戶端程序一般會考慮到readline方法,然後解析json。但as3的socket接收方式,並沒有readline方法。
拈來兩句昔日曾經輝煌的 action script,
出個思路,實現readline功能同時能解決粘包問題,簡單造個輪子吧
var socket_times:int = 0;
var last_str:String = "";
function onSocketData(event:ProgressEvent):void
{
var bytes:ByteArray = new ByteArray();
while (socket.bytesAvailable)
{
socket.readBytes(bytes, 0, socket.bytesAvailable);
}
try
{
//trace("onSocketData" + bytes.length)
//模擬readline的功能
var _str:String = bytes.toString()
//注意這裏會有粘包情況,幾個包在一起,需要解析
var _datalist:Array = _str.split("\n");
_datalist[0] = last_str + _datalist[0];//接上不完整的包
last_str = _datalist.pop();//彈出不完整的包
if (_datalist.length ){
//存在完整包
//取最後一個數據來用。
var _lastdata = _datalist[_datalist.length - 1];
try{
socket_times++;
var _obj:Object=JSON.parse(_lastdata);
log(socket_times+" : "+bytes.length+" , "+_obj.t+" , "+_obj.d)
}catch(e){
//非json包
log(socket_times+" : "+_lastdata);
}
}
}
catch (event:Error)
{
log(socket_times+" : "+event);
//not string data
}
}