今天花了大半天时间给前端flash同学解释TCP相关的原理和细节,并陪同一起写完了与erlang服务器的通信模块
flash socket一般2种,xmlSocket和 socket(binary),xmlsocket基本也是flash自己封装的啦
由于服务器是用的erlang,erlang已经提供了处理TCP协议,自动拆解包头的方法,也就是
{packet,N}这种用法了,那自然就用不着自己去做底层粘包,判断packet是否是一个完整应用层协议包的细节了
也就是说,服务器端和flash通信 格式是这样的:
------------------------
|N bytes header| body |
------------------------
我指定的是2个字节头
本来flash端也有一个简单的方法,可以自动拆解包头的,就是用readUTF方法,它实际对应的是这2次调用
header = socket.readShort(); //readShort在flash里是读2个字节
bytes = socket.readMultiByte(header,"utf-8")
但是实际上,它做的还不够(可能是erlang做的太好了),实际如果我们通信的字节数能保持在 1K 字节以内,那么是没问题的
但是如果通信的应用层协议数据包字节数超过了1K,就有问题了,实际是TCP MSS(Max Segment Size)的问题
flash也是封装成事件机制的,有数据可读会回调一个onSocketData方法,但是这时socket 接收缓冲区数据未必完全接收了一个应用层数据包,所以读到一个头后,按照头里指定的字节数去读取body,而缓冲区里没那么多数据,结果报错(这个是解释给前端同学的,做服务器端开发的就当我是废话好了)
flash端最终处理的代码是:
private function onSocketData(e:ProgressEvent):void
{
getTcpData();
}
private function getTcpData():void
{
if(_tcp_short == 0){
_tcp_short = _socket.readShort();
}
if(_socket.bytesAvailable >= _tcp_short ){
var s:String = _socket.readMultiByte(_tcp_short,"utf-8");
//recv packet,do your thing
}
_tcp_short = 0;
if(_socket.bytesAvailable > 2) {
getTcpData();
}
}
_tcp_short是一个全局变量,在递归中用于记录上一次读的包头大小
流程基本就是,flash当socket接收缓冲区里有数据时通知调用onSocketData,于是我们先读下包头,知道包体有多少字节,然后判断缓冲区剩下的字节是否够,不够就等待下次数据到达,够就读包头定义的那么多字节,然后继续递归判断(可以继续当我是废话)
本来一直是想避免让前端flash同学处理这样的低层协议细节的,所以如果没必要还是尽量减小应用层协议包的大小,这样直接readUTF,writeUTF就全搞定了,还是比较方便的
另外用flash的xmlSocket应该也不错的,那个是以\0作为应用层packet的分隔
分享到:
相关推荐
C#与Erlang的群通信。http://www.cnblogs.com/hejava/p/3473235.html
Windows下Erlang与C构建的节点通讯完整例子,包含cnode工程项目,erlang引用例子。 配套文章:http://blog.csdn.net/mycwq/article/details/40836273
基于Erlang的即时通信系统并发性能研究,杨杰,张淼,为了提升即时通信服务的并发性能以及鲁棒性,以适应日益庞大的网络用户量,本文根据Erlang语言的特性,设计了特殊的进程监管机制以
c# 版ErlangOtp跨平台通信框架(Java版的转译)
erlang与C#一次通信,地址http://www.cnblogs.com/hejava/
erlang入门电子书 erlang编程 Introducing Erlang,作者Simon.St.Laurent
Linux下傻瓜式安装erlang
Erlang与Mysql对接,必须添加的。
Erlang与云计算.pdf(确保可以打开)Erlang与云计算.pdf(确保可以打开)Erlang与云计算.pdf(确保可以打开)
erlang与rabbitmq官方下载教程,官方网站,与寻找资源步骤
erlang 安装包
基于Erlang的XMPP即使通信系统的研究与实现
Erlang并发编程,Erlang程序设计,Erlang中文手册。 学习erlang的好资料。 Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此...
Erlang及其应用Erlang及其应用Erlang及其应用
erlang程序设计 erlang入门手册
erlang25.0 windows版本
erlang otp25 win安装包
●外部接口-Erlang进程与外部世界之间的通讯使用和在Erlang进程之间相同的消息传送机制。 ●Fail-fast(中文译为速错),即尽可能快的暴露程序中的错误。 ●面向并发的编程(COP concurrency-oriented programming) ...
erlang22最新下载包 erlang22.1.tar.gz erlang22最新下载包 erlang22最新下载包
ErlangB和ErlangC计算工具(exe可执行文件+excel两个) ErlangB和ErlangC计算工具(exe可执行文件+excel两个)