`

实例:Netty 处理TCP协议数据分包问题

阅读更多

一.Netty解决TCP协议数据分包问题思路

        我们知道通过TCP协议发送接收数据时,如果数据过大,接收到的数据会是分包的,比如:

                            +-----+-----+-----+

         发送数据是: | ABC | DEF | GHI |

                            +-----+-----+-----+

         而我们想接受到的数据是: | ABCDEFGHI |

        该如何处理这种情况呢?Netty提供了一个专门处理TCP协议数据的Handler:LengthFieldBasedFrameDecoder ,它的原理是服务器端和客户端约定一个协议格式:数据包=协议长度+协议体

        --------------------------------数据包------------------------------

        | 协议长度部分(接收数据长度) | 协议体部分(要接收的数据)|

        举个例子,假如我们的TCP客户端发送了10MB字节的数据,如何让Netty服务器一次就接收到这10MB数据呢?那就需要客户端告诉服务端我发送的数据大小是多少,即在发送的数据中加入一个“数据包长度”即可,上面提到的Handler就是用来和客户端约定这个协议格式的,它有几个参数,下面我介绍一下它的参数意义:

int maxFrameLength:定义接收数据包的最大长度,如果发送的数据包超过此值,则抛出异常;
int lengthFieldOffset:长度属性部分的偏移值,0表示长度属性位于数据包头部;
int lengthFieldLength:长度属性的字节长度,如果设置为4,就是我们用4个字节存放数据包的长度;
int lengthAdjustment:协议体长度调节值,修正信息长度,如果设置为4,那么解码时再向后推4个字节;
int initialBytesToStrip:跳过字节数,如我们想跳过长度属性部分。

 

二.实例-客户端发送10MB字节的数据,Netty服务端一次接收到全部10MB数据

        客户端:定义一个消息体,用头部四个字节存放数据包长度

public byte[] send(byte[] sendData) throws UnknownHostException, IOException {
	Socket socket = new Socket(serverIp, serverPort);
	OutputStream os = socket.getOutputStream();
	InputStream is = socket.getInputStream();
	byte resultArray[] = null;
	try {
		// 定义一个发送消息协议格式:|--header:4 byte--|--content:10MB--|
		// 获取一个4字节长度的协议体头
		byte[] dataLength = intToByteArray(4, sendData.length);
		// 和请求的数据组成一个请求数据包
		byte[] requestMessage = combineByteArray(dataLength, sendData);
		//发送数据-------------------------------
		os.write(requestMessage);
		os.flush();
		//接收数据-------------------------------
		resultArray = IOUtils.toByteArray(is);	
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		os.close();
		is.close();
		socket.close();
	}
	return resultArray;
}

        Netty服务端:定义一个LengthFieldBasedFrameDecoder(1024*1024*1024, 0, 4,0,4)),最大数据量是1GB,长度属性位于数据包头部,占4个字节,协议体调节值为0,跳过头部协议长度四个字节

@Override
public void initChannel(SocketChannel ch) throws Exception {
	ChannelPipeline pipeline = ch.pipeline();

	pipeline.addLast("framedecoder",new LengthFieldBasedFrameDecoder(1024*1024*1024, 0, 4,0,4));
	pipeline.addLast(new TCPServiceHandler());// 处理业务Handler
	

}

 

三.总结:客户端和服务端定义消息格式必须一致

 

文章来源:http://blog.csdn.net/suifeng3051/article/details/34444585

 

分享到:
评论

相关推荐

    跟闪电侠学Netty:Netty即时聊天实战与底层原理-book-netty.zip

    《跟闪电侠学Netty:Netty即时聊天实战与底层原理》是一本深入浅出的Netty技术指南,旨在帮助读者掌握Netty框架,并利用它实现即时聊天应用,同时理解其底层工作原理。Netty是Java领域的一款高性能、异步事件驱动的...

    netty-all-4.1.68.Final-API文档-中文版.zip

    Maven坐标:io.netty:netty-all:4.1.68.Final; 标签:netty、all、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...

    netty-codec-dns-4.1.65.Final-API文档-中英对照版.zip

    Maven坐标:io.netty:netty-codec-dns:4.1.65.Final; 标签:netty、codec、dns、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,...

    使用Netty解决TCP粘包和拆包问题过程详解

    TCP粘包和拆包问题是指在TCP协议中,一个完整的数据包可能被拆分成多个小包发送,或者多个小包被封装成一个大的数据包发送,这会导致数据的混乱和丢失。解决这个问题需要对TCP协议进行深入的理解和掌握。 TCP为什么...

    netty-codec-http2-4.1.74.Final-API文档-中文版.zip

    Maven坐标:io.netty:netty-codec-http2:4.1.74.Final; 标签:netty、codec、http2、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,...

    netty-all-4.1.27.Final-API文档-中文版.zip

    Maven坐标:io.netty:netty-all:4.1.27.Final; 标签:netty、all、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...

    netty-transport-native-unix-common-4.1.73.Final-API文档-中英对照版.zip

    Maven坐标:io.netty:netty-transport-native-unix-common:4.1.73.Final; 标签:common、native、transport、unix、netty、jar包、java、中英对照文档; 使用方法:解压翻译后的API文档,用浏览器

    netty-common-4.1.65.Final-API文档-中英对照版.zip

    Maven坐标:io.netty:netty-common:4.1.65.Final; 标签:netty、common、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的...

    netty-codec-haproxy-4.1.74.Final-API文档-中文版.zip

    Maven坐标:io.netty:netty-codec-haproxy:4.1.74.Final; 标签:netty、codec、haproxy、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译...

    netty-common-4.1.68.Final-API文档-中文版.zip

    Maven坐标:io.netty:netty-common:4.1.68.Final; 标签:netty、common、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码...

    使用netty实现TCP长链接消息写入kafka以及kafka批量消费数据

    标题"使用netty实现TCP长链接消息写入kafka以及kafka批量消费数据"揭示了这个项目的核心内容:通过Netty接收TCP长连接的数据,并将这些数据存储到Kafka中,同时利用Kafka的批量消费功能对数据进行处理。下面我们将...

    netty-resolver-4.1.68.Final-API文档-中文版.zip

    Maven坐标:io.netty:netty-resolver:4.1.68.Final; 标签:netty、resolver、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的...

    netty-resolver-dns-4.1.65.Final-API文档-中英对照版.zip

    Maven坐标:io.netty:netty-resolver-dns:4.1.65.Final; 标签:netty、resolver、dns、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化...

    netty-resolver-dns-4.1.68.Final-API文档-中文版.zip

    Maven坐标:io.netty:netty-resolver-dns:4.1.68.Final; 标签:netty、resolver、dns、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,...

    netty-handler-proxy-4.1.68.Final-API文档-中文版.zip

    Maven坐标:io.netty:netty-handler-proxy:4.1.68.Final; 标签:netty、handler、proxy、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译...

    netty搭建TCP、UDP服务

    它简化了网络编程,特别是对于TCP和UDP协议的处理,使得开发者能够轻松地搭建面向物联网(IoT)设备的上行和下行通信服务。 在TCP(传输控制协议)方面,Netty提供了全面的API来创建服务器和客户端。TCP是一种面向...

    netty-codec-http-4.1.27.Final-API文档-中英对照版.zip

    Maven坐标:io.netty:netty-codec-http:4.1.27.Final; 标签:netty、codec、http、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,...

    netty-resolver-dns-4.1.74.Final-API文档-中英对照版.zip

    Maven坐标:io.netty:netty-resolver-dns:4.1.74.Final; 标签:netty、resolver、dns、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化...

    netty-codec-http-4.1.73.Final-API文档-中文版.zip

    Maven坐标:io.netty:netty-codec-http:4.1.73.Final; 标签:codec、http、netty、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档...

    netty-codec-mqtt-4.1.73.Final-API文档-中文版.zip

    Maven坐标:io.netty:netty-codec-mqtt:4.1.73.Final; 标签:codec、mqtt、netty、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档...

Global site tag (gtag.js) - Google Analytics