这半年来一直在搞AS3的socket,包含同C++和Java之间的通信,在这里,公开一下,个人的研究成果:
两个类:ChatPacket.as 和 ChatDataHandler 是我聊天的自定义的包。
其中主要难点还是在于封包和解包的过程,封包就不用说了,关键是解包:
socket接受的数据不是按照你服务端发送时候,完整的过来,有时候会先接受一部分,推进socket里面,然后在过一会儿继续推进,所以需要进行一个完整的解包处理。
首先是包定义
/**
* mark:short = 0x4235
* size:short
* chanel:byte;
* data:String
* end:short = 0x5324
* @author chzcb
* @email chzcb2008@gmail.com
*
*/
public class ChatPacket implements IPacket
{
private var _mark:int = 0x4235;
private var _size:int;
private var _channel:int;
private var _content:ByteArray;
private var _end:int = 0x5324;
private var _bytes:ByteArray;
//一下略过1000字,呵呵
}
头标识和尾标识自己定义哈……
接下来是关键部分解包
public function handler(socket:Socket):void
{
if(socket.bytesAvailable){
//读进缓存
socket.readBytes(buffer,buffer.length,socket.bytesAvailable);
//从缓存头开始进行读取
buffer.position = 0;
while(buffer.bytesAvailable){
mark = buffer.readUnsignedShort();
if(mark == 0x4235){
size = buffer.readUnsignedShort();
if(buffer.bytesAvailable<size+3){//如果缓存的长度不足内容+频道+尾标识的总长度,就等待数据
buffer.position = 0;
return;
}
channel = buffer.readUnsignedByte();//频道
content.clear();
if(size>0)
buffer.readBytes(content,0,size);
end = buffer.readUnsignedShort();
if(end == 0x5324){
var packet:ChatPacket = new ChatPacket();
packet.channel = channel;
packet.content = content;
var event:NetEvent = new NetEvent(NetEvent.SEND_PACKAGE);
event.data = packet;
socket.dispatchEvent(event);
}
else
{
throw new Error("包不完整");
}
}
else
{
throw new Error("包头错误");
}
}
buffer.clear();
}
}
这就是我的解包处理了,进过测试应该没有问题,拿出来跟大家交流下……转载请说明出处哦,毕竟是我的个人成果嘛~牛人如果检查到可改进的地方还请说明下啦