今天花了大半天时间给前端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的群通信"指的是在编程领域中,使用C#和Erlang两种不同的编程语言进行集群或分布式系统间的通信。这两种语言各有特点,C#是微软开发的面向对象的编程语言,常用于Windows平台的开发,而Erlang则...
Windows下Erlang与C构建的节点通讯完整例子,包含cnode工程项目,erlang引用例子。 配套文章:http://blog.csdn.net/mycwq/article/details/40836273
本案例中,我们将探讨如何实现Erlang与C#之间的通信。Erlang是一种面向并发、容错性强的编程语言,常用于构建高可用性的系统;而C#则是一款广泛应用于Windows平台,具有强大库支持的.NET语言。两者之间的通信可以...
标题中的"C#版ErlangOtp跨平台通信框架(Java版的转译)"指的是一个用C#语言实现的框架,其目标是提供与Erlang OTP系统进行跨平台通信的能力。Erlang OTP(开放电信平台)是Erlang编程语言的一个核心组件,它包含了一...
通过本地进程通信、远程节点通信以及通过端口与外部系统通信,Erlang脚本可以满足各种复杂的通信需求。随着并发和分布式系统的不断发展,Erlang脚本在进程间通信中的应用将更加广泛和深入。通过实际的代码示例,我们...
它负责解释Erlang字节码,提供内存管理、垃圾回收和并发调度等功能。 ### 10. 语言特性 Erlang的语法简洁,支持模式匹配、函数式编程、列表处理和递归等特性。它的动态类型系统和强大的类型推断让代码更加灵活。 ...
**外部接口**:Erlang进程与外部世界的交互也依赖于消息传递,这保持了一致性,简化了系统的复杂性。 **Fail-fast原则**:Erlang倾向于快速暴露错误,以便开发者能尽早发现问题并修复。 **面向并发的编程**:...
这样的驱动库允许Erlang应用程序通过标准的数据库接口与MySQL进行通信。在Erlang中,这种接口通常遵循JDBC或ODBC风格的API,尽管Erlang并不直接支持这些接口,而是有类似的设计模式。 对接过程主要包括以下步骤: ...
Erlang B公式,也称为爱尔兰B公式,是通信网络中一个重要的理论工具,主要用于预测在给定服务速率下,多条电话线或信道如何有效地处理呼叫到达的流量。这个公式是由丹麦工程师A.K. Erlang在1909年提出的,它在现代...
2. **创建CNode**:详细解释如何创建一个CNode实例,连接到Erlang节点,并初始化必要的数据结构以进行通信。 3. **Erlang数据类型和API**:介绍CNode API,包括如何在C中表示和操作Erlang的数据类型(如整数、原子...
1. **并发模型**:Erlang的并发基于轻量级进程(Lightweight Processes, LSPs),这些进程间的通信通过消息传递实现,这与传统的线程模型不同,具有更好的隔离性和容错性。 2. ** OTP(Open Telecom Platform)**:...
**无线通信手册**通常会包含Erlang B模型的详细解释和应用实例,帮助工程师理解和计算通信网络的性能。在这个压缩包中,我们有一个名为"Erlang_B_model.pdf"的文件,它很可能是这样的手册的一部分,提供了关于Erlang...
标签中提到了“Erlang Rabbit 异步通讯”,这意味着讨论的重点是Erlang如何与RabbitMQ结合实现异步通信。RabbitMQ是一个开源的消息代理,它遵循Advanced Message Queuing Protocol (AMQP)标准,提供了一种可靠、高效...
Erlang客户端可以直接与Erlang服务器通信,而Java客户端则通过Jinterface与Erlang服务器交互。客户端负责显示聊天界面,接收用户输入,并将消息发送到服务器。 - **消息协议**:为了实现Erlang和Java之间的通信,...
本话题主要探讨了如何使用Erlang和Delphi这两种不同的编程语言实现多客户端间的通信,并且提及了Flash客户端的兼容性以及843端口的使用。下面我们将详细探讨这些知识点。 1. **Erlang**: Erlang是一种静态类型的...
Erlang支持编写外部接口程序(port drivers),它们可以用C语言等外部语言实现,以与外部世界通信。 #### 14. 系统监控和管理 Erlang的监控机制允许进程监控其它进程的状态,以便系统能够在进程失败时进行相应的...
9. **实时性与并发性**:Erlang的实时性使其在通信、物联网(IoT)和云计算等领域具有优势,因为这些领域需要快速响应和大规模并发处理能力。 通过对以上知识点的学习和实践,开发者可以利用Erlang的强大功能来创建高...
你可以使用protobuf在Erlang节点间交换消息,或者与其他支持protobuf的语言(如Java、Python等)进行通信。 7. **性能优化**:protobuf的优势在于其高效的序列化和反序列化算法,可以在保持数据紧凑的同时,快速地...
这两个模型由丹麦工程师Agner Krarup Erlang在20世纪初提出,至今仍广泛应用于现代通信网络的设计与优化。 Erlang B模型,也称为无阻塞模型,主要用于计算在给定呼叫到达率和系统容量下,系统不发生阻塞的概率。它...