TCP-IP学习笔记七:Netty使用--简单通信编程3

Springboot整合netty框架实现终端、通讯板子(单片机)TCP/UDP通信案例 如何springboot和netty案例的源代码 一个springboot整合netty框架的开发小案例, 实现服务端与单片机终端实时通信的通讯架构案例。 物联网通信给板子下发指令案例 附带源码及整合流程步骤 阅读详情

TCP/IP学习笔记七:Netty使用–简单通信编程3

标签(空格分隔): Netty 网络编程


TCP-IP学习笔记五:Netty使用–简单通信编程1

TCP-IP学习笔记六:Netty使用–简单通信编程2

对于上个程序,对对象类型的传输,发送单个数据没有任何问题,运行很正常,当我们一次发送多个请求(包含多个对象)还是这样正常?会出现什么问题?
对客户端【IO事件处理类】代码进行修改:

    /**
     * 发送请求
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {

        for (int i = 0; i < 5; i++) {
            ctx.writeAndFlush(new User(i, "guozh"+i));
        }
    }

运行结果:

服务器端:
    服务器监听8989端口
    解码····
    客户端发请求了···服务器接收的数据:User [id=0, name=guozh0]
    编码····
客户端:
    编码····
    编码····
    编码····
    编码····
    编码····
    解码····
    客户端接收的响应:User [id=0, name=guozh0]

为什么会出现客户端发送多次请求,而服务器端只收了一次请求和返回一次响应呢?了解TCP/IP协议的可能知道为什么,因为出现了TCP粘包/拆包现象。

TCP粘包/拆包

    TCP是一个“流”协议,就是没有界限的一串数据。大家可以想想河里的流水,他们汇成一片,没有分界线。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完成的包可能会被TCP拆分成多个包进行发送,也可能把多个小包封装成一个大数据包发送,这就是TCP粘包和拆包问题。

参考:Netty权威指南第四章

如图所示:

这里写图片描述

如何解决粘包/拆包问题?

服务器端【注册IO事件类】代码:

package com.netty.demo3.server;

import com.netty.demo2.ObjectCodec;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import io.netty.handler.codec.LengthFieldPrepender;

public class ServerChannelInitializer extends ChannelInitializer<SocketChannel> {
    /**
     * 注册IO事件处理类
     */
    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        //添加的长度
        ch.pipeline().addLast(new LengthFieldPrepender(2));
        /*
         * maxFrameLength   最大的长度
         * lengthFieldOffset    从那开始
         * lengthFieldLength    读入长度
         * lengthAdjustment     
         * initialBytesToStrip  截取几个字节
         */
        ch.pipeline().addLast(new LengthFieldBasedFrameDecoder(65535, 0, 2, 0, 2));
        ch.pipeline().addLast(new ObjectCodec());

        ch.pipeline().addLast(new ServerRequestResponseHander());
    }
}

客户端【注册IO事件类】代码:

package com.netty.demo3.client;

import com.netty.demo2.ObjectCodec;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import io.netty.handler.codec.LengthFieldPrepender;

public class ClientChannelInitializer extends ChannelInitializer<SocketChannel> {
    /**
     * 注册IO事件处理类
     */
    @Override
    protected void initChannel(SocketChannel ch) throws Exception {

        ch.pipeline().addLast(new LengthFieldPrepender(2));

        ch.pipeline().addLast(new LengthFieldBasedFrameDecoder(65535, 0, 2, 0, 2));

        ch.pipeline().addLast(new ObjectCodec());

        ch.pipeline().addLast(new ClientRequestResponseHander());
    }
}

其他类不做修改。

Netty给我们提供了两个方法:LengthFieldBasedFrameDecoder和LengthFieldPrepender多粘包/拆包的支持。详细介绍参考:Netty权威指南第七章
这里写图片描述
执行结果:

服务器:

    服务器监听8989端口
    解码····
    客户端发请求了···服务器接收的数据:User [id=0, name=guozh0]
    编码····
    解码····
    客户端发请求了···服务器接收的数据:User [id=1, name=guozh1]
    编码····
    解码····
    客户端发请求了···服务器接收的数据:User [id=2, name=guozh2]
    编码····
    解码····
    客户端发请求了···服务器接收的数据:User [id=3, name=guozh3]
    编码····
    解码····
    客户端发请求了···服务器接收的数据:User [id=4, name=guozh4]
    编码····

客户端:

    编码····
    编码····
    编码····
    编码····
    编码····
    解码····
    客户端接收的响应:User [id=0, name=guozh0]
    解码····
    客户端接收的响应:User [id=1, name=guozh1]
    解码····
    客户端接收的响应:User [id=2, name=guozh2]
    解码····
    客户端接收的响应:User [id=3, name=guozh3]
    解码····
    客户端接收的响应:User [id=4, name=guozh4]

总结:

    主要是对于多线程问题出现数据问题的处理。粘包和拆包,多线程下数据的传输等问题。
springboot整合netty实现tcp通信 在高并发的网络服务器中,经常会出现漏掉socket的情况,对应的结果有一种情况就是出现大量的CLOSE_WAIT状态的连接。:在TCP保活打开的情况下,最后一次数据交换到TCP发送第一个保活探测包的间隔,即允许的持续空闲时长,或者说每次正常发送心跳的周期,TCP保活机制,就是为了保证连接的有效性,探测连接的对端是否存活的作用,在间隔一定的时间发探测包,根据回复来确认该连接是否有效。是一个特殊的分隔符解码器,该解码器使用的分隔符为:windows的r\n和类linux的\n。 阅读详情

相关推荐

Reactor Netty TCP 服务器端-响应式编程-011

🤗 ApiHug × {Postman|Swagger|Api...} = 快↑ 准√ 省↓。

程序员超级伴侣-ApiHug 2619

netty网络编程(三)之tcp/ip协议与netty编程实战

tcp/ip协议与netty编程实战

yemuxiaweiliang的博客 1079

Netty实现TCP代理

Netty 实现一个简单的TCP代理

qq_36577699的博客 1320

【netty系列-01】深入理解网络通信基本原理和tcp/ip协议

深入理解网络通信原理和tcp/ip协议

zhenghuishengq的博客 2351

「Netty系列」彻底弄清网络七层协议、TCP/IP、IP、TCP(Netty前置一)

目前工作中使用Netty进行服务端开发,在实践中有自己一点点心得。接下来分享Netty系列文章。在学习Netty之前先了解下网络基础知识、分清网络七层协议、TCP/IP协议族、IP、TCP各代表什么含义。 一 基础 1.1 概述 1 网络分层中的IOS七层模型、TCP/IP协议族、TCP、IP,这些有什么不同 2 TCP协议通信过程中的三次握手和四次挥手到底是什么流程? 1.2 软件架构 在生活中,我们经常用QQ、微信、百度云盘、Goole、IE浏览器、火狐浏览器......。可以总结为两大类,c

flowerAndJava的博客 1143

Java TCP通信实战:从Socket到Netty的网络编程核心

网络通信是分布式系统与微服务架构的基石,其核心在于理解TCP/IP协议栈的工作原理。TCP作为面向连接的可靠传输协议,通过三次握手建立连接、流式数据传输及四次挥手断开连接,确保了数据的有序与完整送达。在Java生态中,这一原理映射为Socket与ServerSocket API,开发者需掌握消息边界处理、线程模型优化等关键技术,以构建高并发服务。针对粘包、半包等常见问题,应用层需采用长度前缀或分隔符等方案进行协议设计。随着并发需求增长,从BIO线程池模型演进至NIO多路复用,最终借助Netty框架的Chan

weixin_33795806的博客 420

Netty框架实现TCP/IP通信

      项目中需要使用到TCP/IP协议完成数据的发送与接收。如果只是用以前写的简单的socket套接字方法,每次接收发送消息都会创建新的socket再关闭socket,造成资源浪费。于是使用netty框架完成java网络通信。       Netty框架的内容很多,这里只是代码展示其中的一个功能。       这里使用的是

普通还不自信的程序员 3886

(八)深入浅出TCPIP之TCP长连接与短连接详解

TCP 本身并没有长短连接的区别,长短与否,完全取决于我们怎么用它。

yolo模型训练找我,AI游戏合作找我 2146

Netty系列二:TCP/IP 协议三次握手

netty time_wait I/O

cj2580的博客 2037

Netty5.0TCP/IP上传大文件

采用Netty5.0编的的TCP/IP上传文件的列子,实现了拆包,合并

自己写的基于netty的服务器端通讯框架

本人写的基于netty的服务器端通讯框架,报文格式为【int的长度+json格式的字符串】,json格式类似于{cmd:1,data:{}},通过cmd的表示识别controller,仅需在spring配置中配置controller即可,线程池大小和编码格式可在constants静态变量里配置。目前线程池为固定大小,以后的版本中可能会增加其他形式

TCP-IP学习笔记五:Netty使用--简单通信编程1

TCP/IP学习笔记五:Netty使用–简单通信编程1标签(空格分隔):Netty 网络编程Netty的简单使用示例。编程思路按照注释进行就可以了。一、导入Netty的jar最先版本:netty-all-5.0.0.Alpha2.jar 二、服务器端package com.netty.demo1.server;import io.netty.bootstrap.ServerBootstrap; im

MoTui的博客 2382

嵌入式Linux开发必备:设备树插件动态加载实战指南(RK356x平台为例)

本文以RK356x平台为例,详细介绍了嵌入式Linux开发中设备树插件的动态加载实战。通过configfs接口,开发者可以在系统运行时动态修改硬件配置,实现外设的即插即用与调试,无需重启设备,极大提升了开发与调试效率。

w7x8y9z的博客 442

【Java Nio Netty】基于TCP的简单Netty自定义协议实现(万字,全篇例子)

基于TCP的简单Netty自定义协议实现(万字,全篇例子)

m0_53928179的博客 1750

C++坦克大战源代码

【代码】C++坦克大战源代码。

强国豪,林中霖 2608

Notion访问卡顿?一键优化DNS与Hosts提升加载速度

本文针对Notion访问卡顿问题,提供了两种核心优化方案:修改Hosts文件与配置DNS。详细解析了卡顿根源在于网络链路,并手把手指导用户在Windows、Mac、iOS及Android设备上实施优化,旨在通过替换为更优线路,显著提升Notion的页面加载与同步速度。

fff88的博客 1196

Netty实战专栏 | Java网络编程深入解析

大家好,我是Leo哥🫣🫣🫣,本次专栏学习Java并发以及netty应用的深度学习,netty提供了异步、事件驱动、非阻塞的网络编程模型,能够轻松处理高并发、高吞吐量的网络通信场景。是一个基于的高性能网络应用框架。但是在此之前我们需要对我们Java前置知识进行一些巩固和复习。那就是IO,Java网络编程,BIO,NIO,AIO相关知识点,前置知识是还是挺多,只有打好前面的基础我们才能更深入理解netty这个框架以及他的底层原理。对于IO相关的知识,大家可以看我之前写的这篇。

分享思想,留下痕迹。 1万+

思科模拟器-实验16:三层交换 VLAN 互访配置

【实验内容】 (1)按实验线路连接图进行连接。按照实验线路连接图分别配置各台计算机IP 地 址。 (2) 按照实验线路连接图,在SW1和SW2上分别完成VLAN配置,并在VLAN中添加相应的端口成员,同时配置Trunk端口。同时测试各计算机之间是否可以相互ping 通。 Switch>en Switch#config t Enter configuration commands, one per line. End with CNTL/Z. Switch(config)#vlan 10 Switc

weixin_44270194的博客 4729

TCP-IP学习笔记六:Netty使用--简单通信编程2

TCP/IP学习笔记六:Netty使用–简单通信编程2标签(空格分隔): Netty 网络编程Netty进行对象类型数据的传递实例。编程步骤与简单类型数据传递相同。服务器端package com.netty.demo2.server;import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; im

MoTui的博客 2151

宜搭子表单(自定义页面全部展示)

效果:增加自定义页面添加表格组件,配置数据源变量: formUuid'表单编码'变量: pageSize10变量: currentPage1。

2301_80286061的博客 2277

实战案例七:Claude Code 构建完整的 Web 应用

前面的案例大多是单一功能的演示,本章将展示如何使用 Claude Code 从零开始构建一个完整的 Web 应用,涵盖需求分析、架构设计、编码实现、测试部署的全流程。

gaoxiang_120的专栏 581

从通信协议到Netty RPC框架

在互联网技术里,有两件事最为重要,一个是TCP/IP协议,它是万物互联的事实标准;另一个是Linux操作系统,它是推动互联网技术走向繁荣的基石。在网络编程中最重要的模型便是OSI七层网络模型和TCP/IP四层网络模型。

cqdddgs的博客 1200

利用人工神经网络在Abaqus中实现本构模型的网格粗化计算框架:详细指南与实践

在这篇文章中,我们详细介绍了如何在Abaqus中实现基于人工神经网络(ANN)的本构模型以进行网格粗化的计算框架。我们通过两个主要模块——数据生成器模块和ANN训练模块,实现了这一计算框架,并将训练好的ANN集成到Abaqus的用户材料子程序(UMAT)中,创建了一个基于ANN的本构模型。我希望这篇文章能帮助到那些希望在Abaqus中实现基于ANN的本构模型的读者,同时,我也非常欢迎大家提出宝贵的意见和建议,让我们共同进步。

qq_38334677的博客 1715

Netty简单入门:获取请求、多客户端连接与通信、心跳检测、长链接

目的及介绍 Netty是一款类似于Tomcat的服务器,它更关注网络编程,相对来说网络通信性能更高。 本文主要介绍Netty的简单入门,内容包括: 搭建一款简单的Netty程序,只编写简单的服务端程序,通过浏览器或者bash的curl方式来感受一下netty的通信模式 编写一个多客户端的程序,与服务器端通信,满足某客户端上线,服务器端能通知其他客户端:上线通知,某客户发送消息,服务器端能转发至其他客户端 模仿一个服务器端检测客服端心跳的机制,场景:在长链接情况下,服务器端需要通过心跳机制来确认客服端存活

ljfirst的博客 3005

Codex 100个真实案例 - 用AI做股票K线分析工具(技术指标全自动)

本案例将用 Codex 从零搭建一个完整的股票 K 线分析工具。通过自然语言驱动,我们让 AI 自动完成股票数据获取(akshare)、K 线图绘制(mplfinance + ECharts)、技术指标计算(MA/EMA/MACD/RSI/KDJ/布林带)、买卖信号提示(金叉/死叉、超买超卖)、多股对比分析、Web 可视化界面(Flask + ECharts)、PDF 报告生成以及定时监控邮件推送等全套功能。全程用自然语言指令驱动 Codex,零手写代码实现专业级量化分析平台!

yueyeguzhuo的专栏 866

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Netty核心指南——TCP通信与数据处理

本文介绍了Netty中TCP粘包/拆包问题的解决方案及编解码技术应用。首先分析了TCP粘包/拆包的原因及四种解决策略,重点讲解了使用LineBasedFrameDecoder、DelimiterBasedFrameDecoder和FixedLengthFrameDecoder三种解码器解决半包问题的方法。随后对比了Java序列化的三大缺陷,并介绍了Protobuf、Thrift和JBoss Marshalling三种主流编解码框架的特点。文章通过具体示例展示了如何在Netty中实现高效的网络通信。

weixin_52344200的博客 773

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: TCP-IP学习笔记六:Netty使用--简单通信编程2
下一篇: TCP-IP学习笔记八:RPC(Netty和Spring)实现webServer框架
motui
博客等级 码龄10年 84粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值