// (一) 正确的接收处理
// 接收网络数据,先接收数据包的长度,在根据数据包的长度值来接收数据包本身
// 解决了flex socket在接收数据过程中可能出现的数据粘包问题
private function socketDataHander(event:ProgressEvent):void {
_onReceive.call(null,"message");
if(!_msgBuffer) {
_msgBuffer = new ByteArray();
}
while(true) {
if(_msgLength == 0) {
if(_socket.bytesAvailable < 4) {
return;
}
_msgLength = _socket.readInt();
}
if(_socket.bytesAvailable < _msgLength) {
return;
}
_socket.readBytes(_msgBuffer,0,_msgLength);
var message:String = new String(_msgBuffer);
_onReceived.call(null,message);
_msgLength = 0;
_msgBuffer.clear();
}
// (二)错误的接收处理
// 按照如下的数据接收方式是错误的,我在实际的项目中就遇到过这样的数据接收错误现象, 分析如下:
// 假如存在这样一种情形:
// 服务器端将A数据包完整地写在了客户端socket的输入流中,同时还写入了B数据包的开头一部分数据,
// 此时在flex客户端将只会触发一次ProgressEvent.SOCKET_DATA事件,
// 即只有等到服务器端下一次发送数据并在客户端检测到ProgressEvent.SOCKET_DATA事件时,
// 客户端就会误以为这就是B数据包的开始,但实际上B数据包的头部已经在前一次接收时获取到了,
// 所以将导致数据包接收错误!
// 如果B数据包正好是触发下一次通信的关键,将导致整个通信中断,那是很悲剧的!
/* trace("Receive data ... ");
_onReceive.call(null,"message"); // 告诉调用者此时有数据需要接收
var availableBytes:uint = _socket.bytesAvailable;
// 读取消息头:即消息体的长度
if(!_readHead && availableBytes >= 4) {
_msgLength = _socket.readInt();
_readHead = true;
}
// 读取了消息头之后紧接着读取socket中的消息体数据
if(_readHead && _offet < _msgLength) {
var available:uint = _socket.bytesAvailable; // socket中当前还能读取的数据
var readBytes:uint = 0; // 本次需要读取的数据
if((_offet+available) >= _msgLength) { // 已经出现了粘包现象
readBytes = _msgLength - _offet;
}else {
readBytes = available;
}
if(!_msgBuffer) {
_msgBuffer = new ByteArray();
}
_socket.readBytes(_msgBuffer,_offet,readBytes);
_offet += readBytes;
// 接收完一个完成的数据包之后要立刻将该消息派发给上层进行处理
if(_offet == _msgLength) {
_msgBuffer.uncompress();
var message:String = new String(_msgBuffer);
_onReceived.call(null,message);
_msgBuffer.clear();
_msgLength = 0;
_offet = 0;
_readHead = false; // 需要读取下一个消息的消息头
}
} */
}
分享到:
相关推荐
C#解决socket通信过程中粘包分包问题,本项目是一个只有6个C#代码文件的开源小工程,用来学习基于TCP的套接字通信包,可以自定义通信协议,处理分包和粘包,内置一个服务端和客户端的套接字程序,也有测试代码和对应...
在Socket通信中,"粘包"问题是一个常见的挑战。所谓“粘包”,是指在网络传输过程中,由于TCP协议的流式特性,多个数据包可能会被合并成一个大的数据包进行传输,或者一个数据包被分割成多个小的数据包分别发送,...
在TCP/IP通信中,"粘包"问题是一个常见的现象,主要出现在面向流的协议如TCP中。当多个数据包连续发送时,由于TCP的流水线特性,这些数据包可能会被合并成一个大的数据块,或者在接收端拆分不正确,导致接收方无法...
### Socket编程TCP粘包问题及解决方案 #### 一、TCP粘包问题概述 TCP作为一种可靠的面向连接的传输层协议,提供了基于字节流的服务。在TCP传输过程中,发送方发送的数据被视为连续不断的字节流,而不是离散的消息...
Socket 粘包问题终极解决方案-Netty 版 Socket 粘包问题是指在使用 TCP 协议进行网络通讯时,由于 TCP 协议本身没有边界的概念,导致在传输数据时无法确定消息的边界,从而产生粘包和半包问题。本文将详细介绍 ...
最后,"解决TCP网络传输“粘包”问题TLV SOCKET通信服务器客户机函数流程.doc"很可能详细描述了如何在Winsock中实现TLV协议,以及客户端和服务器之间的通信流程。通常,这会涉及创建套接字、绑定、监听、连接等步骤...
Socket 粘包问题的 3 种解决方案,最后一种最完美 在本文中,我们将讨论 Socket 粘包问题的 3 种解决方案,并详细解释每种解决方案的优缺点。最后,我们将介绍一种完美的解决方案,帮助开发者更好地解决 Socket ...
SuperSocket是一个轻量级、高性能的.NET Socket服务器框架,它简化了Socket服务端的开发工作。本篇文章将深入探讨如何在使用SuperSocket.ClientEngine.Core库时,处理客户端的粘包和半包问题。 粘包和半包是网络...
在计算机网络编程中,TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议...以上就是关于C#中TCP Socket粘包处理的基本概念和解决方案,实践中,还需要结合具体的应用场景和需求进行优化设计。
本教程将深入探讨如何在Unity中实现Socket通信,包括TCP连接、粘包/拆包问题的解决方案。 一、TCP连接基础 TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在Unity中...
在TCP/IP通信中,"粘包"问题是一个常见的现象,特别是在C#等编程语言中进行TCP编程时。TCP粘包是指发送方发送的多个数据包在接收方接收时被合并成一个大包,使得接收方无法正确区分各个独立的数据包。这种问题通常是...
"Unity socket案例包含粘包处理"这个标题指向了一个具体的实例,它涉及到在网络通信中如何处理数据包的粘包问题。下面将详细介绍Unity中的Socket通信以及粘包处理的相关知识。 Unity中的Socket通信: Socket是网络...
Socket编程在TCP网络通信中是一项基础且重要的技术,而TCP粘包问题则是开发者在实际应用中经常遇到的一个挑战。TCP(传输控制协议)是面向连接的、可靠的传输协议,它在保证数据正确传输的同时,也可能因为其特性...
本文将深入探讨如何使用C#语言来实现Socket编程,特别是在处理异步通信和解决TCP粘包问题的第三阶段。C#提供了丰富的类库支持网络编程,使得开发者能够方便地构建基于TCP/IP的客户端和服务器应用。 首先,让我们...
本文将详细介绍如何使用QT来设计一个自定义协议,以解决TCP粘包和拆包的问题。 首先,我们需要理解TCP粘包和拆包的原因。TCP为了提高传输效率,会将较小的数据包合并成一个大包发送,或者将一个大的数据包拆分成多...
flex socket 2030 错误 粘包.txt 看完就明白了
总的来说,C#中的Socket通信协议设计需要考虑网络通信的基本原理,如TCP/IP协议栈的工作方式,以及如何通过合适的协议设计解决实际问题,如防止“粘包”。通过理解这些概念和技巧,开发者可以构建出高效、可靠的网络...
"Boostasio异步TCP通讯及tcp粘包解包解决方案" Boostasio异步TCP通讯是基于 Boost Asio 库实现的异步 TCP 通讯机制,...同时,我们还讨论了 TCP 粘包解包问题的解决方法,并提供了一个使用标记字段方法的示例代码。
在实际编程中,我们可以通过创建一个简单的DEMO来演示如何使用包头+包体的方法来解决粘包和拆包问题。具体步骤包括: 1. 定义数据包结构,如前面所述,包括4字节的包长度字段和实际的包内容。 2. 发送端根据实际...