Flash AS3 socket 通訊自定協議之實現readline功能的思路

 

使用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
			}
		}
		

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章