- 浏览: 88123 次
- 性别:
- 来自: 北京
-
最新评论
-
A5121612886:
好文要顶!
Flash Builder 编译器选项 -
谁在哀伤望月:
非常好,谢谢分享
Flash builder4 插件终极破解方法
问题:
服务端Mina 前台接收Flex
参照的原型为http://www.klstudio.com/post/202.html
<[Socket
+AMF3]给合Flash的Socket和AMF3来尝试开发
web游戏
>
经过个人调试 分别在服务端和客户端收发消息时进行长度处理
但是在服务端大量发送数据
时,还是会发生客户端粘包的状况,导致发生错误,而且也比较频繁。
求服务端与客户端的收发代码
段。要实用的。
(最好是经过一定压力测试的。或者发上来我压一下。)
补充说明一次我打断点跟踪到的情况:
客户端接收到信息:
获取了长度:长度为34字节 查看socket里面也确实还有34字节的内容
但是这时候就读取object就会出现异常
flex
.messaging.io.UnknownTypeException: Unknown AMF type '120'
120这个就是34字节当中的第一个的内容 还有其他的比如 -124 之类的等等。
解答:
这个基本是socket编程都会遇到的经典问题
amf本身是一种2进制封装,连发时接收方可能会因为数据堆积在一起而分不清包的头尾,造成映射错误。
解决办法就是在发包前对amf进行简单封包,因为amf本身就是2进制格式,那么只需要在其之前写入amf长度(即正文长度),接收方,先读取包头的长度,再固定取出其后的正文。取完正文,再取包头,依次取完。
每个发出的包,结构为
struct
{
DWORD Data_LEN //包长
CHAR[..] //内容
}
理论说完,就给出关键代码,相信认真研究过socket的一看就知:
as3 ---> Server 发送部分
public function send(obj:Object) { var objByte:ByteArray = new ByteArray(); objByte.writeObject(obj); // objByte.compress(); //压缩,可以省略 var msgByte:ByteArray = new ByteArray(); msgByte.writeInt(objByte.length); msgByte.writeBytes(objByte, 0, objByte.length); sk.writeBytes(msgByte); sk.flush(); }
server --> as3 接收部分
//一接受到数据就尝试读 private function onSkData(e:ProgressEvent):void { this.readData(); } private function readData():void { //如果还没读过头部则读一次。 if (!this.isReadHead && this.sk.bytesAvailable > 4) { var lenByte:ByteArray = new ByteArray(); sk.readBytes(lenByte, 0, 4); this.msgLen = lenByte.readInt(); //trace("新的消息长度:" + this.msgLen); this.isReadHead = true; } //如果读了头部,并且当前可读长度大于等于消息长度,则开始读取 if (isReadHead && this.sk.bytesAvailable >= this.msgLen) { var objByte:ByteArray = new ByteArray(); sk.readBytes(objByte, 0, this.msgLen); this.isReadHead = false; //objByte.uncompress(); var obj:Object = objByte.readObject(); this.readMsg(obj); //读完了,可以去解释了 } //如果是读过头,则如果当前消息大于消息长度则再次调用读取,否则则判断是否可读头部 this.sk.bytesAvailable > 0 && this.readData(); }
至于server端,其原理是一样的,都是读的时候先读头,发的时候也是先发个头。
补充server端代码(C#,解码类为FluorineFx,仅供参考思路)
server -> as3 发送
public void send(object obj) { try { ByteArray objByte = new ByteArray(); objByte.WriteObject(obj); // objByte.Compress(); byte[] objBuff = new byte[objByte.Length]; objByte.Position = 0; objByte.ReadBytes(objBuff, (uint)0, (uint)objBuff.Length); ByteArray msgByte = new ByteArray(); msgByte.WriteInt(objBuff.Length); msgByte.WriteBytes(objBuff, 0, objBuff.Length); byte[] msgBuff = new byte[msgByte.Length]; msgByte.Position = 0; msgByte.ReadBytes(msgBuff, (uint)0, (uint)msgBuff.Length); //发送 this.ng.sk.BeginSend(msgBuff, 0, msgBuff.Length, SocketFlags.None, onSendOver, this.ng); } catch { Core.mainForm.addLog("发送失败"); } }
as3 -> server 接受
//接收完的回调 private void receOver(IAsyncResult ar) { NetGate ng = (NetGate)ar.AsyncState; int size = ng.sk.EndReceive(ar); // Core.mainForm.addLog("接受到总长度:" + size); int ind = 0; if (size > 0) { while (size > 0) { //读消息头 MemoryStream lenMs = new MemoryStream(ng.buff, ind, 4); ByteArray lenByte = new ByteArray(lenMs); Int32 len = lenByte.ReadInt(); // Core.mainForm.addLog("消息长度:" + len.ToString()); if (len == 0) { break; } //根据头长度取内容 MemoryStream ms = new MemoryStream(ng.buff, ind + 4, len); ByteArray ba = new ByteArray(ms); // ba.Uncompress(); object obj = ba.ReadObject(); this.readMsg(obj); ind += (len + 4); size -= (len + 4); } this.ng.buff.Initialize(); ng.sk.BeginReceive(this.ng.buff, 0, this.ng.buffSize, SocketFlags.None, this.onReceOver, this.ng); } else { ng.sk.Close(); this.offLine(); } }
发表评论
-
全面提升你的程序效率 之细说 bitmapdata AS3 Bitmap 抠图(透明部分)和碰撞(点击)检测
2012-06-05 09:54 7288如果你是刚接触as编程 ... -
PureMVC MultiCore报错 multitonKey for this Notifier not yet initialized!
2012-05-23 16:08 1044multitonKey for this Notifier n ... -
关于优化
2012-05-21 14:58 10271. Avoid the new operator whe ... -
AS3经验之谈
2012-05-11 10:56 1189【改变输出swf的尺度,背景颜色 ... -
AS3动态获得类名及类的方法
2012-05-08 13:50 28571.获得某个实例对象的类名:getQualifiedClass ... -
Flex 应用内存泄露的分析与诊断
2012-05-03 11:32 741http://www.ibm.com/developerwor ... -
Flash Builder 编译器选项
2012-05-02 10:30 6481-benchmark 输出性 ... -
【AS3】为什么AS3.0事件流机制会有捕获阶段、目标阶段、冒泡阶段三个阶段
2012-04-26 10:03 3890原问题:事件机制有三个步骤,捕获,目标和冒泡。请问,在目标阶段 ... -
[AS3]事件流那点事儿
2012-04-26 09:36 1284在群里有人问了个问 ... -
AS3事件中target和currentTarget的区别
2012-04-12 15:40 1987在事件处理过程中,会 ... -
ActionScript垃圾回收
2012-04-12 15:04 1455在《给AS程序员的一点建议一文 》中我提到了释放资源的重 ... -
updateAfterEvent的作用
2012-04-10 17:26 1290flash中一共有三个类具 ... -
深入理解flash重绘
2012-04-10 17:21 1227Flash Player 会以SWF内 ... -
[AS3]registerClassAlias的用法
2012-03-20 10:35 1132registerClassAlias在利用AMF3进行序列话网 ... -
navigateToURL
2012-03-09 15:51 1215navigateToURL整理总结一些关于navigate ... -
flash中cacheAsBitmap的使用
2012-03-09 11:59 872缓存显示对象 如果 Flash 中的设计尺寸增大,无论创建 ... -
Debug和Release之本质区别
2012-02-27 11:41 1231关于Debug和Release之本质区别 使用条件编译来完成区 ... -
AS3中super的用法[转自A闪]
2012-02-13 10:19 1292super它到底是什么?这是我第一个问题,在帮助中石这样说明的 ... -
AS3.0的Dictionary类
2012-02-10 11:00 849AS3中的Dictionary类(flash. ... -
AS3中public internal private protected的区别
2012-02-10 10:43 2583protected Java與AS3中的 ...
相关推荐
Socket编程与AMF3在IT领域是两个重要的概念,它们分别代表了网络通信的基础和一种高效的数据序列化机制。在本文中,我们将深入探讨这两个技术,并结合提供的资源,即一篇名为“socket+AMF3”的博客文章,来理解它们...
Java Socket AMF3 Flash Game Framework 是一个专门为Flash游戏设计的后端框架,它结合了Java技术和AMF3编码,使得游戏开发者能够构建交互性强、安全可靠的Web游戏。在这个框架中,Java作为服务器端语言,提供了稳定...
AMF3,全称为Action Message Format 3,是Adobe Flex和Flash Player之间进行数据序列化和通信的一种高效格式。在标题“amf3_spec_05_05_08.zip_AMF3_above flash player_player”中,我们可以理解这是关于AMF3规范的...
AMF3(Action Message Format version 3)协议是Adobe公司为Flash Player和Flex应用程序之间通信设计的一种二进制数据交换格式。它旨在提高数据传输效率,同时保持足够的灵活性以适应不同类型的复杂数据结构。AMF3...
AMF3 协议中文版定义 AMF(Action Message Format,动作信息格式)是一种压缩的二进制格式,用于序列化 ActionScript 对象图。序列化后的 AMF 编码对象图可以用来持久化,并在不同的会话中获得应用的公共状态,或者...
AMF3(Action Message Format version 3)是Adobe公司开发的一种二进制数据序列化格式,主要用于Flash Player和Flex应用程序与服务器之间的数据交换。在C++编程环境中,AMF3库可以帮助开发者高效地处理这种数据格式...
标题中的“Flex + Zend AMF + MYSQL + WAMP 新手指南”揭示了本文将要讨论的是一个关于构建基于Web的应用程序的技术栈,其中包含了前端、后端和数据库的相关技术。让我们逐一深入理解这些技术。 1. **Flex**: ...
AMF3,全称为Action Message Format 3,是Adobe公司为Flash Player和Flex应用程序之间进行数据交换设计的一种高效二进制序列化格式。这个“AMF3 C++ 源码(修改版)”提供了对AMF3协议的C++实现,支持序列化和对象化...
AMF3(Action Message Format version 3)是Adobe公司开发的一种二进制数据序列化格式,主要用于Flash Player与服务器之间的数据交换。它提高了数据传输效率,支持多种数据类型,包括基本类型、对象、数组、日期等。...
### AMF3 格式详解 #### 一、引言 **AMF3**(Action Message Format 3)是 Adobe 公司推出的一种紧凑的二进制格式,用于序列化 ActionScript 对象图。一旦对象图被序列化为 AMF 编码,就可以在不同的会话之间持久...
### AMF3 Specification详解 #### 一、简介 ##### 1.1 目的 Action Message Format (AMF) 是一种紧凑的二进制格式,用于序列化 ActionScript 对象图。一旦序列化,AMF 编码的对象图可用于跨会话持久存储和检索应用...
### AMF3 Specification详解 #### 1. 引言 ##### 1.1 目的 Action Message Format (AMF) 是一种紧凑的二进制格式,用于序列化 ActionScript 对象图。一旦序列化,AMF 编码的对象图可以用于在不同会话之间持久化和...
5. **AMF3.Server**:这部分可能是一个实现AMF3协议的服务端组件,负责处理AMF3格式的请求和响应,可能包含AMF3数据的解析、业务逻辑处理和结果返回等功能。 6. **AMF3**:这个文件可能包含了AMF3协议的相关代码或...
PHP的amfext扩展,pecl.php.net上提供的0.9.2无法兼容php5.4+的版本,这个资源能确保amfext扩展在php5.4+的环境下编译成功。 本人分别在php5.4/5.5的生产环境中使用,一切正常,各位可以放心使用。
6. **AMF版本**:AMF有多个版本,如AMF0和AMF3,其中AMF3提供了更好的性能和更多的数据类型支持。 在AMF-1.4.33.zip文件中,可能包含以下内容: 1. **库文件**:可能包含AMF的编程库,比如AS3或PHP的实现,供...
虽然AMF1.0相比AMF0增加了对XML和XMLList的支持,但在后来的AMF3版本中,这些功能得到了更全面的优化,因此AMF1.0现在较少被使用。 在"AMF1.0(AMP).zip"这个压缩包中,我们可以推测包含的是与AMF1.0相关的源代码...
Lua-Amf 是一个专为 Lua 语言设计的AMF(Action Message Format)解析库,它使得在 Lua 环境中处理AMF3格式的数据变得简单高效。AMF是一种二进制序列化格式,常用于Flash与服务器之间的数据交换,如Adobe的Flex和...
### AMF3 (Action Message Format 3) 概述与技术细节 #### 一、AMF3 简介 AMF3(Action Message Format 3)是一种用于序列化ActionScript对象图的紧凑型二进制格式。它主要用于在客户端与服务器端之间高效地传输...
AMF有多种版本,包括AMF0和AMF3,AMF.NET应该支持这两种格式,以适应不同场景的需求。AMF0是早期版本,主要应用于Flash Player 8及更早版本,而AMF3则在Flash Player 9及以后版本中广泛使用,提供了更高效的数据编码...