Flash as3 socket编程入门

什么是socket?

所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。AS3中我们一般使用的是基于TCP的流式socket。

TCP是一种流协议(stream protocol)。这就意味着数据是以字节流的形式传递给接收者的,没有固有的"报文"或"报文边界"的概念。

TCP是通过什么方式保证传输数据的可靠性的?

1、 应用数据被分割成TCP认为最适合发送的数据块。 2、 当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。 3、 当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒(一般200毫秒左右)。 4、 TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错, TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。 5、 既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要, TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。 6、 既然IP数据报会发生重复, TCP的接收端必须丢弃重复的数据。 7、 TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这将防止较快主机致使较慢主机的缓冲区溢出,比如,发送方要发送8Kb的数据到接收端,但接收端的缓冲区已经只剩下2K的空间了,那么发送方最多只能发2Kb的数据,那么这时候不得不把数据拆分发送。而为了防止网络的拥塞现象,TCP提出了一系列的拥塞控制机制与算法,比如Nagle算法等,这些也可以看做是产生半包,黏包现象的其中一方面因素吧。

flash如何通过socket和服务器建立连接?

Socket类通过 Socket.connect(ip, host)方法并监听网络连接时间消息。因为Flash Socket编程是一个异步的过程,connect()方法不会等到一个连接完成后再执行下一行代码的执行。所以在尝试一个新的Socket连接的时候我们最好先添加一个连接事件监听器(socket.addEventListener( Event.CONNECT, onConnect );)。

什么是封包和拆包?

流式socket是以字节流的形式传输信息的,跟水流一样,没有边界,要做什么操作,传了什么内容,哪里是事情的开头,哪里又是事情的结尾,我们完全是不知道的,所以我们一般在发送方需要对要传输的数据一定的格式,而接收方则按同样的规则解析这种格式,也就是我们常说的封包和拆包。也就是说我们处理字节流是以包为单位进行处理的。 一般是包头|Header|+包体|Body|+包尾|End|组成,有时候包尾部分也直接归入Body部分,形成|Header|+|Body|的结构。 包尾部分的信息一般用于校验包的完整性或者合法性等。 包头长度,信息字段的位置一般都是固定的,必须包含的字段一般有“包的长度(packetLen)”和“操作码(cmd)”,提供长度是为了方面我们解析数据包,而提供操作码是为了让程序知道,该条信息是要做什么操作。除以上两个字段,其他字段根据需要增减。

Socket如何处理数据?

既然上面我们人为的给数据进行了封包,那么我们处理数据就是以包为单位进行处理的。 1、 因为包头|Header|长度固定,当收到数据时,先检验缓冲区有效数据长度,是否大于等于包头长度,如果小于包头长度,则说明数据不够,则继续等待下一次数据的到来,如果大于包头长度,则读取包头长度的数据,并按一定的格式解析包头数据,从包头中获取到包的长度(packetLen),此时包头处理基本完毕。 2、 根据包头读取到的packetLen,从而计算出包体部分的数据长度(比如bodyLen),再判断缓存区剩余数据长度是否大于等于bodyLen,如果不是,同样等待,如果是,则从缓存区读出包体部分,进而按照一定的格式读取里面的数据(例如readInt(),readShort()…);此时包数据基本读取完毕! 3、 上面我们说过网络中的字节流没有界线的,因此我们该知道每次到达的数据,也就是缓冲区的数据,有可能不止一个数据包,因此需要循环执行 1,2步。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏社区的朋友们

对基于 TCP 的网络应用在 socket 非阻塞模式下 send 调用错误原因的深入分析

本文试图从 send 函数以及 TCP 协议两个点进行问题的分析,并复现出错误场景,最后针对导致错误的原因来给出解决方案。

3330
来自专栏Spark学习技巧

基石 | Flink Checkpoint-轻量级分布式快照

前面两篇,一篇是spark的driver的Checkpoint细节及使用的时候注意事项。一篇是flink的Checkpoint的一些上层解释。本文主要是将fli...

781
来自专栏Java Edge

大道缓存1 缓存特征2 缓存介质3 缓存分类和应用场景缓存实战

用户请求从界面(浏览器/App)到网络转发、应用服务再到存储(数据库或文件系统),然后返回到界面呈现内容。

361
来自专栏铭毅天下

Elasticsearch究竟要设置多少分片数?

0、引言 本文翻译自Elasticsearch20170918热乎的官方博客,原作者:Christian Dahlqvist。 在构建Elasticsearch...

60310
来自专栏desperate633

计算机网络之数据交换(电路交换,报文交换,分组交换)电路交换报文交换分组交换分组交换与电路交换

就要经过网络核心进行数据交换,数据不断从一个网络交换到另一个网络,直到到达目的主机。所以网络核心解决的基本问题就是数据交换。

611
来自专栏数据和云

内存为王:DBIM RAC Share Nothing架构的挑战和解决方案

陈焕生 Oracle Real-World Performance Group 成员,senior performance engineer,专注于 OLTP...

2555
来自专栏牛肉圆粉不加葱

Spark Streaming + Kakfa 编程指北

本文简述如何结合 Spark Streaming 和 Kakfa 来做实时计算。截止目前(2016-03-27)有两种方式:

844
来自专栏Java技术分享

Jedis 与 ShardedJedis 设计

Jedis作为推荐的java语言redis客户端,其抽象封装为三部分:

2165
来自专栏用户画像

北理(2014年)813计算机专业基础

1.理解数据结构的基本概念;掌握数据的逻辑结构、存储结构及其差异,以及各种基本操作的实现。

691
来自专栏杨建荣的学习笔记

海量数据迁移之分区表批量insert性能改进(r2笔记67天)

在平时的工作中接触到的分区表一般都比较大,而且分区也少则几十,多则几百,上千。 在数据迁移的时候,分区表的迁移更是块大骨头,因为数据量太大,而且有些分区表中还有...

2005

扫码关注云+社区