Beetle在TCP通讯中使用AMF3协议和Flash通讯
2012-10-23 22:27
288 查看
Flash是现有网页中最流行的富客户端表现软件,所以组件支持Flash对象协议通讯也是非常有必要的事情.由于组件可以通过扩展协议分析器来兼容不同协议处理,所以可以通过使用FluorineFx就可以简单地实现基于AMF3的协议和Flash进行TCP通讯.如果有了解之前的Protobuf的扩展,那扩展AMF3也是很简单的事情.
定义协议格式
同样在交互前要明确一下协议的格式先,只有这样才可以方便的进行代码编写实现.
协议比较简分别消息总长度和内容,内容即是AMF3协议数据.
实现具体的分析器和消息适配器
协议制定后就可以进行分析器的实现,采用头4字节描述大小,所以分析器从HeadSizeOfPackage基础类派生下载重写相关方法即可;完整实现代码如下:
Flash端协议分析器
package
{
import flash.net.Socket;
import flash.utils.ByteArray;
import flash.utils.Endian;
import mx.controls.Alert;
import mx.graphics.shaderClasses.ExclusionShader;
public class HeadSizeOfPackage
{
public function HeadSizeOfPackage()
{
}
private var mMessageReceive:Function;
//消息接收回调函数
public function get MessageReceive():Function
{
return mMessageReceive;
}
public function set MessageReceive(value:Function):void
{
mMessageReceive = value;
}
private var mReader:ByteArray = new ByteArray();
private var mWriter:ByteArray = new ByteArray();
private var mSize:int=0;
//导入当前Socket接收的数据
public function Import(socket:Socket):void
{
socket.endian = Endian.LITTLE_ENDIAN;
while(socket.bytesAvailable>0)
{
if(mSize==0)
{
mSize= socket.readInt()-4;
mReader.clear();
}
if(socket.bytesAvailable>= mSize)
{
socket.readBytes(mReader,mReader.length,mSize);
var msg:Object = mReader.readObject();
if(MessageReceive!=null)
MessageReceive(msg);
mSize=0;
}
else{
mSize= mSize-socket.bytesAvailable;
socket.readBytes(mReader,mReader.length,socket.bytesAvailable);
}
}
}
//发磅封装的协议数据
public function Send(message:Object,socket:Socket):void
{
socket.endian = Endian.LITTLE_ENDIAN;
mWriter.clear();
mWriter.writeObject(message);
socket.writeInt(mWriter.length+4);
socket.writeBytes(mWriter,0,mWriter.length);
socket.flush();
}
}
}
运行效果
总结
组件通过使用FluorineFx就可以简单实现和Flash进行AMF3的通讯,FluorineFx对AMF3的支持不错,不过应该组件似乎已经很久没有更新,在看他的源码时发现其性能还有很大的优化空间.如果使用FluorineFx的朋友对他的性能不感不理想,可以通过内存分析工具来分析一下大体可以找到慢的一些原因.
相关文章推荐
- Beetle使用FluorineFx和Flash进行AMF3通讯
- Beetle可靠、高性能的.Net Socket Tcp通讯组件 支持flash amf3,protobuf,Silverlight,windows phone
- Beetle在TCP通讯中使用协议分析器和自定义协议对象
- QQ使用了什么通讯协议?为什么要这样做?为什么采用 UDP 协议,而不采用 TCP 协议实现?
- wp8使用Beetle.NetPackage实现基于TCP通讯的订单查询
- QQ使用了什么通讯协议?为什么要这样做?为什么采用 UDP 协议,而不采用 TCP 协议实现?
- Beetle在Tcp通讯中使用Protobuf
- windows phone使用Beetle实现对象交互的TCP通讯
- Beetle在TCP通讯中使用二进制序列化对象传输
- Beetle在Tcp通讯中使用Protobuf
- 使用TCP协议连续传输大量数据时,是否会丢包,应如何避免?
- 使用XMLSocket在Flash和本地程序之间进行通讯
- C#使用TCP/IP与ModBus进行通讯
- Silverlight使用RSA加密socket tcp通讯数据
- 使用TCP协议连续传输大量数据时,是否会丢包,应如何避免
- Mysql服务器相互作用的通讯协议包括TCP/IP,Socket,共享内存,命名管道
- 再议IIC协议与设计【2】--使用GPIO实现IIC从机通讯源码分析与测试
- 使用UDP协议与韩国OACIS压机通讯
- unity中使用protobuffer作为网络通讯封包协议的实现和流程
- Android 中使用TCP、UDP协议