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
			}
		}
		
发布了78 篇原创文章 · 获赞 76 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/qq_38288618/article/details/104067676
今日推荐