`
vista_move
  • 浏览: 30010 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

通信框架netty5.0教程三:TCP粘包/拆包问题

阅读更多
  熟悉TCP编程的读者可能都知道,无论是服务端还是客户端,当我们读取或者发送消息的时候,都需要考虑TCP底层的粘包/拆包机制。如果不考虑TCP粘包的问题,就可能导致读取数据的错误。本文将讲解如何使用Netty5.0解决TCP粘包/拆包问题。

  netty5.0中有一个非常方便的传输解析器:LengthFieldBasedFrameDecoder。下面是LengthFieldBasedFrameDecoder的构造方法
/**
     * Creates a new instance.
     *
     * @param maxFrameLength
     *        the maximum length of the frame.  If the length of the frame is
     *        greater than this value, {@link TooLongFrameException} will be
     *        thrown.
     * @param lengthFieldOffset
     *        the offset of the length field
     * @param lengthFieldLength
     *        the length of the length field
     * @param lengthAdjustment
     *        the compensation value to add to the value of the length field
     * @param initialBytesToStrip
     *        the number of first bytes to strip out from the decoded frame
     */
    public LengthFieldBasedFrameDecoder(
            int maxFrameLength,
            int lengthFieldOffset, int lengthFieldLength,
            int lengthAdjustment, int initialBytesToStrip) {
        this(
                maxFrameLength,
                lengthFieldOffset, lengthFieldLength, lengthAdjustment,
                initialBytesToStrip, true);
    }

  maxFrameLength:数据包最大允许长度
  lengthFieldOffset:长度字段的偏移量
  lengthFieldLength:长度字段的长度
  lengthAdjustment:补位值
  initialBytesToStrip:从解码器中剔除的长度(设置为上面长度字段的长度)

  这样看来,只需在netty服务端添加一个解析器就可以解决TCP粘包问题。服务端代码就不全贴上来了,只贴上有变动的部分,不明白的读者请看一下前两篇netty文章。
bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
				@Override
				protected void initChannel(SocketChannel socketChannel)
						throws Exception {
					ChannelPipeline p = socketChannel.pipeline();

					// 定义传输解析器,数据包前加4个字节表示包的总长度
					p.addLast(new LengthFieldBasedFrameDecoder(1024 * 1024, 0,
							4, 0, 4));

					// 维持心跳
					p.addLast(new IdleStateHandler(15, 30, 30, TimeUnit.SECONDS));
					p.addLast(new NettyIdleStateHandler());

					p.addLast(new NettyServerHandler());
				}
			});


添加解析器后,只需要按照约定往服务器发送数据包时在数据包头部添加一个值来说明后面数据的字节长度即可。

客户端发送数据包时格式如下:
public static ByteBuf newProtocol(String message)
			throws UnsupportedEncodingException {

		byte[] req = message.getBytes(Constant.UTF8);
		ByteBuf pingMessage = Unpooled.buffer();
		pingMessage.writeInt(req.length);
		pingMessage.writeBytes(req);

		return pingMessage;
	}


  如此TCP粘包/拆包问题即可轻松愉快的解决。
分享到:
评论

相关推荐

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

    使用Netty解决TCP粘包和拆包问题过程详解 Netty是一个流行的Java网络编程框架,提供了简洁、灵活的API来处理网络编程的各种问题。其中,解决TCP粘包和拆包问题是Netty的一个重要应用场景。本文将详细介绍使用Netty...

    unity实现Socket通讯(内含tcp粘包/拆包解决)

    本教程将深入探讨如何在Unity中实现Socket通信,包括TCP连接、粘包/拆包问题的解决方案。 一、TCP连接基础 TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在Unity中...

    Netty粘包-拆包应用案例及解决方案分析.docx

    Netty 作为一个高性能的网络通信框架,提供了多种解决 TCP 粘包/拆包问题的方法。 一、TCP 粘包/拆包的基础知识 TCP 是一个“流”协议,没有界限的一串数据。TCP 底层并不知道上层业务逻辑,它会根据 TCP 缓冲区...

    Netty精粹之TCP粘包拆包问题

    ### Netty精粹之TCP粘包拆包问题详解 #### 一、引言 在网络通信领域,尤其是在基于TCP协议的应用程序开发中,经常会遇到“粘包”和“拆包”的问题。这些问题虽然属于较为底层的技术细节,但对于保障数据传输的准确...

    c++服务器 拆包粘包 过程

    在计算机网络编程中,"拆包"和"粘包"是TCP协议中常见的问题,尤其在C++服务器开发中,理解并处理好这两个概念对于构建高效稳定的网络服务至关重要。TCP是一种面向连接的、可靠的传输层协议,它通过流式传输确保数据...

    Netty 粘包/半包原理与拆包实战 源码

    本实例是《Netty 粘包/半包原理与拆包实战》 一文的源代码工程。 大家好,我是作者尼恩。 在前面的文章中,完成了一个高性能的 Java 聊天程序,尼恩已经再一次的进行了通讯协议的选择。放弃了大家非常熟悉的json ...

    Netty5.0Jar包和4.03API文档

    Netty 5.0 的 JAR 包包含了该版本的全部类和库,开发者可以直接引入到他们的项目中,以利用 Netty 提供的各种网络通信功能。这些功能包括但不限于 TCP、UDP、HTTP、WebSocket 等多种协议的支持,以及零拷贝技术、...

    Netty5.0TCP/IP上传大文件

    在这个“Netty5.0TCP/IP上传大文件”的示例中,我们将探讨如何利用Netty5.x版本处理大文件的上传,特别关注拆包和合并的技术。 在TCP/IP通信中,数据通常被分成多个数据段进行传输,这是因为TCP协议是基于流的,...

    面试题:聊聊TCP的粘包、拆包以及解决方案.docx

    TCP的粘包和拆包是网络编程中遇到的常见问题,尤其在基于TCP协议的通讯中,如RPC框架和Netty等。TCP是一种面向字节流的协议,它没有明确的数据包边界,这可能导致发送的数据在接收端看起来像是被粘在一起或是被拆...

    springboot整合netty的实践操作(解决粘包拆包问题)

    springboot整合netty的实践操作(解决粘包拆包问题)

    粘包和拆包及Netty解决方案.docx

    由于RPC框架中的微服务通常通过TCP长连接进行通信,若不妥善处理粘包和拆包问题,可能导致数据丢失或错误解析。 **粘包**是指当发送方发送的若干包数据到接收方接收时粘成一包的情况。而**拆包**则是指发送的一包...

    netty5.0官方自带的demo

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨Netty 5.0官方提供的示例(demo),这些示例是学习和理解Netty核心概念与功能的重要...

    Netty中粘包和拆包的解决方案.docx

    在TCP网络编程中,粘包和拆包是常见的问题,主要由于TCP协议的特性——它是一个面向流的协议,不保证数据包的边界。在Netty框架中,这些问题需要通过特定的策略和组件来解决。 TCP粘包和拆包的产生原因是多方面的,...

    Netty 粘包/半包原理与拆包实战 【源代码 新】

    - 本实例是《Netty 粘包/半包原理与拆包实战》 一文的源代码工程。 大家好,我是作者尼恩。 在前面的文章中,完成了一个高性能的 Java 聊天程序,尼恩已经再一次的进行了通讯协议的选择。放弃了大家非常熟悉的json...

    Netty 入门与实战:仿写微信 IM 即时通讯系统.rar

    Netty 入门与实战:仿写微信 IM 即时通讯系统,掘金小册子,netty教程。章节齐全无缺失,排版非常不错。 1.仿微信IM系统简介 1 2.Netty是什么? 2 3.服务端启动流程 8 4.客户端启动流程 11 5.实战:客户端与服务端双向...

    Netty粘包拆包问题解决方案

    Netty 粘包拆包问题解决方案 Netty 是一个基于 Java 的网络编程框架,它提供了一个便捷的方式来处理网络数据的读写操作。然而,在使用 Netty 进行网络编程时,经常会遇到粘包和拆包的问题。所谓粘包和拆包,就是指...

    Netty粘包与拆包源码

    总结来说,Netty通过提供强大的编解码器框架,使得开发者可以灵活地处理粘包和拆包问题。通过理解ByteToMessageDecoder和MessageToByteEncoder的工作原理,以及自定义解码器和编码器的实现,我们可以有效地解决网络...

    Netty5.0架构剖析和源码解读.pdf

    Netty5.0架构剖析和源码解读 本文档主要讲述了Netty5.0架构剖析和源码解读,涵盖了Netty的架构、源码分析、NIO入门等方面的知识点。 概述 JAVA 的 IO 演进是一个长期的过程,从传统的 BIO 通信到 NIO 的出现,都...

    netty拆包粘包解决方案示例

    在分布式系统和网络通信中,Netty是一个非常流行的高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。本文将深入探讨Netty中解决拆包粘包问题的策略,以及客户端断线重连的...

Global site tag (gtag.js) - Google Analytics