里面的重点是doDecode的返回值
这个方法的返回值是重点:
* 1、当内容刚好时,返回false,告知父类接收下一批内容
* 2、内容不够时需要下一批发过来的内容,此时返回false,这样父类 CumulativeProtocolDecoder
* 会将内容放进IoSession中,等下次来数据后就自动拼装再交给本类的doDecode
* 3、当内容多时,返回true,因为需要再将本批数据进行读取,父类会将剩余的数据再次推送本类的doDecode
public boolean doDecode(IoSession session, IoBuffer in,
ProtocolDecoderOutput out) throws Exception {
CharsetDecoder cd = charset.newDecoder();
if(in.remaining() > 0){//有数据时,读取4字节判断消息长度
byte [] sizeBytes = new byte[4];
in.mark();//标记当前位置,以便reset
in.get(sizeBytes);//读取前4字节
//NumberUtil是自己写的一个int转byte[]的一个工具类
int size = MinaUtil.byteArrayToInt(sizeBytes);
//如果消息内容的长度不够则直接返回true
if(size > in.remaining()){//如果消息内容不够,则重置,相当于不读取size
in.reset();
return false;//接收新数据,以拼凑成完整数据
} else{
byte[] bytes = new byte[size];
in.get(bytes, 0, size);
String content = new String(bytes,"UTF-8");
System.out.println("------------"+content);
if(null != content && content.length() > 0){
//AsResponse resCmd = new AsResponse();
//AsXmlPacker.parse(resCmd, xmlStr);
//if(resCmd != null){
// out.write(resCmd);
//}
//转发
byte[] data = content.getBytes();
IoBuffer buffer = MinaUtil.byteToIoBuffer(data, data.length);
out.write(buffer);
}
if(in.remaining() > 0){//如果读取内容后还粘了包,就让父类再给俺 一次,进行下一次解析
return true;
}
}
}
return false;//处理成功,让父类进行接收下个包
}
分享到:
相关推荐
在TCP/IP通信中,"粘包"问题是一个常见的现象,特别是在C#等编程语言中进行TCP编程时。TCP粘包是指发送方发送的多个数据包在接收方接收时被合并成一个大包,使得接收方无法正确区分各个独立的数据包。这种问题通常是...
C#解决socket通信过程中粘包分包问题,本项目是一个只有6个C#代码文件的开源小工程,用来学习基于TCP的套接字通信包,可以自定义通信协议,处理分包和粘包,内置一个服务端和客户端的套接字程序,也有测试代码和对应...
Socket 粘包问题的 3 种解决方案,最后一种最完美 在本文中,我们将讨论 Socket 粘包问题的 3 种解决方案,并详细解释每种解决方案的优缺点。最后,我们将介绍一种完美的解决方案,帮助开发者更好地解决 Socket ...
本篇文章将深入探讨如何使用Winsock解决TCP网络传输中的“粘包”问题。 首先,我们需要理解什么是“粘包”问题。在TCP/IP协议中,由于TCP的流式传输特性,连续发送的数据可能会被合并成一个大的数据段进行传输,这...
在TCP/IP通信中,"粘包"问题是一个常见的现象,主要出现在面向流的协议如TCP中。当多个数据包连续发送时,由于TCP的流水线特性,这些数据包可能会被合并成一个大的数据块,或者在接收端拆分不正确,导致接收方无法...
在Socket通信中,"粘包"问题是一个常见的挑战。所谓“粘包”,是指在网络传输过程中,由于TCP协议的流式特性,多个数据包可能会被合并成一个大的数据包进行传输,或者一个数据包被分割成多个小的数据包分别发送,...
本文将深入探讨“mina断包”和“粘包”问题,以及如何通过提供的mina_optimize代码解决这些问题。 首先,我们要理解什么是“断包”和“粘包”。在TCP/IP通信中,数据通常会被拆分成多个数据段进行传输,这在传输...
在某些需要精确控制数据传输的应用中,如游戏、实时通信等,解决TCP粘包和拆包问题是至关重要的。QT是一个跨平台的C++图形用户界面应用程序开发框架,它提供了丰富的网络编程接口,可以用来处理这个问题。 本文将...
### Socket编程TCP粘包问题及解决方案 #### 一、TCP粘包问题概述 TCP作为一种可靠的面向连接的传输层协议,提供了基于字节流的服务。在TCP传输过程中,发送方发送的数据被视为连续不断的字节流,而不是离散的消息...
Socket 粘包问题终极解决方案-Netty 版 Socket 粘包问题是指在使用 TCP 协议进行网络通讯时,由于 TCP 协议本身没有边界的概念,导致在传输数据时无法确定消息的边界,从而产生粘包和半包问题。本文将详细介绍 ...
TCP网络传输-粘包-问题研究 TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。出现粘包现象的原因是多方面的,它既可能由发送方造成,也可能由接收...
在计算机网络编程中,"粘包"问题是一个常见的现象,特别是在TCP协议中。TCP是一种面向连接的、可靠的传输层协议,它为了提高效率,会尽可能地将数据进行批量发送,而不是每次只发送一个数据包。这在某些情况下会导致...
使用Netty解决TCP粘包和拆包问题过程详解 Netty是一个流行的Java网络编程框架,提供了简洁、灵活的API来处理网络编程的各种问题。其中,解决TCP粘包和拆包问题是Netty的一个重要应用场景。本文将详细介绍使用Netty...
### Golang TCP粘包拆包问题的解决方法 #### 一、引言 在使用Go语言进行网络编程时,特别是TCP编程过程中,经常会遇到所谓的“粘包”与“拆包”问题。这些问题的发生通常会影响到数据的正确性以及系统的稳定性。...
在讨论智能公交调度系统中TCP粘包问题的解决方案之前,首先需要理解TCP粘包的概念及其成因。TCP粘包是指在网络通信中,发送方连续发送的多个数据包在接收方看来仿佛合并成了一个大包。这种现象使得接收方很难准确地...
### Netty精粹之TCP粘包拆包问题详解 #### 一、引言 在网络通信领域,尤其是在基于TCP协议的应用程序开发中,经常会遇到“粘包”和“拆包”的问题。这些问题虽然属于较为底层的技术细节,但对于保障数据传输的准确...