摘抄:
ActionScript3+Java(包括任何后台服务器语言)网游戏数据同步问题一直是众多开发人员在开发中常遇到的一个头痛问题,现贴些经验供大家参考参考。
关于TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。
出现粘包现象的原因是多方面的,它既可能由发送方造成,也可能由接收方造成。发送方引起的粘包是由TCP协议本身造成的,TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据。若连续几次发送的数据都很少,通常TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包数据。接收方引起的粘包是由于接收方用户进程不及时接收数据,从而导致粘包现象。这是因为接收方先把收到的数据放在系统接收缓冲区,用户进程从该缓冲区取数据,若下一包数据到达时前一包数据尚未被用户进程取走,则下一包数据放到系统接收缓冲区时就接到前一包数据之后,而用户进程根据预先设定的缓冲区大小从系统接收缓冲区取数据,这样就一次取到了多包数据(图1所示)。
粘包情况有两种,一种是粘在一起的包都是完整的数据包(图1、图2所示),另一种情况是粘在一起的包有不完整的包(图3所示),此处假设用户接收缓冲区长度为m个字节。
不是所有的粘包现象都需要处理,若传输的数据为不带结构的连续流数据(如文件传输),则不必把粘连的包分开(简称分包)。但在实际工程应用中,传输的数据一般为带结构的数据,这时就需要做分包处理。
在处理定长结构数据的粘包问题时,分包算法比较简单;在处理不定长结构数据的粘包问题时,分包算法就比较复杂。特别是如图3所示的粘包情况,由于一包数据内容被分在了两个连续的接收包中,处理起来难度较大。实际工程应用中应尽量避免出现粘包现象。
为了避免粘包现象,可采取以下几种措施。一是对于发送方引起的粘包现象,用户可通过编程设置来避免,TCP提供了强制数据立即传送的操作指令push,TCP软件收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓冲区满;二是对于接收方引起的粘包,则可通过优化程序设计、精简接收进程工作量、提高接收进程优先级等措施,使其及时接收数据,从而尽量避免出现粘包现象;三是由接收方控制,将一包数据按结构字段,人为控制分多次接收,然后合并,通过这种手段来避免粘包。
以上提到的三种措施,都有其不足之处。第一种编程设置方法虽然可以避免发送方引起的粘包,但它关闭了优化算法,降低了网络发送效率,影响应用程序的性能,一般不建议使用。第二种方法只能减少出现粘包的可能性,但并不能完全避免粘包,当发送频率较高时,或由于网络突发可能使某个时间段数据包到达接收方较快,接收方还是有可能来不及接收,从而导致粘包。第三种方法虽然避免了粘包,但应用程序的效率较低,对实时应用的场合不适合。
一种比较周全的对策是:接收方创建一预处理线程,对接收到的数据包进行预处理,将粘连的包分开。对这种方法我们进行了实验,证明是高效可行的。
分享到:
相关推荐
D--R&Ve--zon-2020ve--zon数据泄露调查报告(英文)-2020.8-67页精品报告2020.pdf
★ 不能载入支持库“じ☆ve Hebe支持库1.0版”,其文件名为“じ☆ve Hebe.fne”,数字签名为“{EEEEEEEE-3B3B-0051-3C8E-9CF37CE396F5}”,请确认易语言中是否安装了此支持库。资源作者:。易语言官方论坛。资源界面...
封装了几个的API函数,简单测试一下!じ☆ve Hebe。 操作系统支持: Windows
Proxmox VE 7.2-1官方镜像
Ve--zon-2020年数据泄露调查报告(英文)-2020.8-119页精品报告2020.pdf
由于上传限制,可是化插件压缩成了6个包: VE(1):emf-sdo-runtime-2.2.0.zip VE(2): GEF-runtime-3.2.zip VE(3): VE-Automated-Tests-1.2.3_jem.zip VE(4): VE-examples-1.2.3_jem.zip VE(5):VE-...
eclipse 3.3的可视化编程利器——VE,需要的几个插件之一,全部需要的插件列表:emf-sdo-runtime-2.2.0,GEF-runtime-3.2,VE-runtime-1.2.3_jem,VE-SDK-1.2,注意版本!
eclipse可视化插件安装必备插件之一:VE-SDK-1.2。eclipse全部可视化插件正确配置是eclipse-SDK-3.2-win32,emf-sdo-runtime-2.2.0,GEF-runtime-3.2,VE-runtime-1.2,VE-SDK-1.2
Java JDK/JRE要高于version 1.4.2。 然后安装Eclipse,然后安装EMF(Eclipse Modeling Framework)和GEF(Graphical Editor Framework)。 之后才能安装Visual Editor相关的东西,包括runtime、SDK、examples和Junit...
NORCO-830VE——基于Socket-478架构的Pentium V处理器的CPU卡.pdf
yiren-p8Yii-ve2467575-x64.apk
じ☆ve Hebe支持库
STM32_F4VE--核心板原理图
VE-SDK-1.1.0.1VE-SDK-1.1.0.1VE-SDK-1.1.0.1VE-SDK-1.1.0.1
J2EE插件_VE-SDK-1.2.zip
VE-SDK-1.2.3_jem.zip
eclipse配置VE之4(可选),中文语言包
最新版 Proxmox 7.0 安装镜像文件,因上传大小限制,分成了两个文件
eclipse可视化插件安装必备插件之一:VE-runtime-1.2.3。eclipse全部可视化插件正确配置是eclipse-SDK-3.2-win32,emf-sdo-runtime-2.2.0,GEF-runtime-3.2,VE-runtime-1.2.3(或者VE-runtime-1.2),VE-SDK-1.2