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

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

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;
import io.netty.channel.ChannelFuture;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;

/**
 * Netty NIO 服务器端
 * @author MOTUI
 *
 */
public class NettyNIOServer {

    public static void main(String[] args) throws InterruptedException {

        //1.创建NIOServerSocketChannel的服务引导
        ServerBootstrap serverBootstrap = new ServerBootstrap();
        //2.创建线程池 boss(请求转发) worker(IO事件处理)
        NioEventLoopGroup boss = new NioEventLoopGroup();
        NioEventLoopGroup worker = new NioEventLoopGroup();
        //3.绑定线程
        serverBootstrap.group(boss, worker);
        //4.设置ServerSocket服务类
        serverBootstrap.channel(NioServerSocketChannel.class);
        //5.绑定IO处理事件
        serverBootstrap.childHandler(new ServerChannelInitializer());
        //6.绑定服务端口
        System.out.println("服务器监听8989端口");
        ChannelFuture future = serverBootstrap.bind(8989).sync();
        //等待服务器被关闭
        future.channel().closeFuture().sync();

        //释放线程资源
        worker.shutdownGracefully();
        boss.shutdownGracefully();  

    }   
}

注册IO事件处理类

package com.netty.demo1.server;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.socket.SocketChannel;

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

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

IO事件处理类

package com.netty.demo1.server;

import java.util.Date;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
import io.netty.util.CharsetUtil;

/**
 * 事件处理类
 * @author MOTUI
 *
 */
public class ServerRequestResponseHander extends ChannelHandlerAdapter {
    /**
     * 异常调用
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
            throws Exception {
        System.out.println("发生异常了···异常信息:"+cause.getMessage());

    }

    /**
     * 读数据调用
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg)
            throws Exception {
        ByteBuf buffer=(ByteBuf) msg;
        System.out.println("服务器接收到的数据:"+buffer.toString(CharsetUtil.UTF_8));
        //ctx.writeAndFlush(msg);//写回响应
        //响应一个时间
        ByteBuf buf=ctx.alloc().buffer(1024);
        buf.writeBytes(new Date().toString().getBytes());
        ctx.writeAndFlush(buf);

    }
}

客户端

package com.netty.demo1.client;

import java.net.InetSocketAddress;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;

/**
 * Netty NIO 客户端
 * @author MOTUI
 *
 */
public class NettyNIOClient {

    public static void main(String[] args) throws InterruptedException {

        //1.创建NIOSocketChannel的服务引导
        Bootstrap bootstrap = new Bootstrap();
        //2.创建线程池 worker(IO事件处理)
        NioEventLoopGroup boss = new NioEventLoopGroup();
        //3.关联线程池
        bootstrap.group(boss);
        //4.设置NioSocketChannel
        bootstrap.channel(NioSocketChannel.class);
        //5.绑定IO处理事件
        bootstrap.handler(new ClientChannelInitializer());
        //6.链接服务器
        ChannelFuture future = bootstrap.connect(new InetSocketAddress("192.168.0.117", 8989));

        //等待关闭连接
        future.channel().closeFuture().sync();

        //释放资源
        boss.shutdownGracefully();
    }   
}

客户端注册IO事件处理类

package com.netty.demo1.client;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.socket.SocketChannel;

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

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

客户端IO事件处理类

package com.netty.demo1.client;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
import io.netty.util.CharsetUtil;

/**
 * 事件处理类
 * @author MOTUI
 *
 */
public class ClientRequestResponseHander extends ChannelHandlerAdapter {
    /**
     * 异常调用
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
            throws Exception {
        System.out.println("发生异常了···异常信息:"+cause.getMessage());

    }

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

        ByteBuf buf = Unpooled.buffer(1024);
        buf.writeBytes("你好,我好,大家好!".getBytes());
        ctx.writeAndFlush(buf);

    }
    /**
     * 读数据调用
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg)
            throws Exception {

        ByteBuf buffer=(ByteBuf) msg;
        System.out.println("客户端收到:"+buffer.toString(CharsetUtil.UTF_8));

        //关闭链接
        ctx.close();
    }
}

总结:

    编程思路按照官方文档进行编码,简单类型的传递没有太大的问题,对于对象类型数据的传输会存在一些问题(下篇介绍对象类型的传输)。
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通信

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

普通还不自信的程序员 3887

Netty实现TCP代理

Netty 实现一个简单的TCP代理

qq_36577699的博客 1320

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

tcp/ip协议与netty编程实战

yemuxiaweiliang的博客 1080

「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!基于私有协议,怎样快速开发网络通信服务?

在工作中,我经常使用netty开发一些服务,掌握netty的工作原理,开发一些服务端以及客户端是非常简单,本篇文章,我们就以具体的协议来进行一个简单的服务的开发。

初念初恋的博客 1368

Android端使用Netty框架实现TCP/IP通信

Android端采用Netty实现长连接通信最近项目需要

Handler棒棒哒的博客 2万+

Nginx+netty实现tcp负载均衡,获取客户端真实ip

在nginx.conf文件中,events,http同级添加配置启动nginx服务。

qq_27955093的博客 2239

四足机器人关节电机FOC控制实战:从磁编码器校准到SVPWM调试避坑指南

本文详细解析了四足机器人关节电机FOC控制实战,涵盖磁编码器校准、电流环调试和SVPWM波形优化等关键环节。通过MIT Cheetah案例展示如何解决21倍电气误差问题,并提供相序自动校正、PI参数整定等实用代码片段,帮助工程师避开永磁同步电机(PMSM)控制中的常见陷阱。

weixin_29281915的博客 489

【BUAA】【计组】计算机组成 pre (含详细解析)

BUAA 计算机组成 本文章旨在为@走肖暂时无法接通的系列文章创造一个目录,收藏本文章,方便查阅! 1. 入门测试 2. 基础知识 3. Logisim   欢迎来到 Logisim 的世界   Logisim 门电路   Logisim 组合电路   Logisim 时序电路   Logisim 仿真与调试   应用与挑战 4. Verilog 与仿真工具   前言   ISE 入门   VCS 入门   Verilog 语法   Verilog 题目实例与分析   Verilog 工程的设计开发调试

Schrodinger007的博客 9809

netty获取ip和端口

InetSocketAddress insocket = (InetSocketAddress) ctx.channel().remoteAddress(); String clientIP = insocket.getAddress().getHostAddress(); String clientPort = String.valueOf(insocket.getPort());...

NRGAGA的专栏 6363

开源libmodbus编译为32位和64位动态库

libmodbus 是支持Linux,Mac OS X,window 的一个开源库,支持modbus TCP和RTU 两种模式。

lemontree1945的博客 1923

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

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

m0_53928179的博客 1750

YOLO26中的PPM空间金字塔池化:改良设计与多尺度特征提取教程

在计算机视觉的语义分割任务中,准确理解图像中的上下文信息至关重要。例如,在街景图像中,可能同时存在远处的小汽车和近处的大建筑物,网络需要具备捕获多尺度上下文信息的能力。例如,要正确识别图像中的"船",不仅需要看到船本身的特征,还需要理解周围的水面环境。金字塔的每一层对应不同的池化尺度,从细粒度到粗粒度,形成了多层次的特征表示。PPM(Pyramid Pooling Module)正是为了解决这一问题而提出的模块,它通过构建金字塔形状的池化结构,有效地聚合不同尺度的上下文信息,从而提升语义分割的精度。

LXY_LOVE36的博客 82

FANUC机器人_KAREL编程入门学习(1)

FANUC机器人_KAREL编程入门学习(1)

Robot_PLC_HMI_Automation 6422

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

TCP/IP学习笔记七:Netty使用–简单通信编程3标签(空格分隔): Netty 网络编程TCP-IP学习笔记五:Netty使用–简单通信编程1TCP-IP学习笔记六:Netty使用–简单通信编程2对于上个程序,对对象类型的传输,发送单个数据没有任何问题,运行很正常,当我们一次发送多个请求(包含多个对象)还是这样正常?会出现什么问题? 对客户端【IO事件处理类】代码进行修改: /**

MoTui的博客 1361

生信分析进阶14 - 从GTF文件提取基因、转录本、TSS和TSE

从GTF文件提取基因、转录本、TSS和TSE

LittleComputerRobot的博客 677

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

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

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

55、宇宙微波背景辐射望远镜及其光学系统解析

本文详细解析了宇宙微波背景辐射(CMB)望远镜及其光学系统的设计与优化。内容涵盖折射与反射光学系统的特性、旁瓣控制技术、气球与地面观测系统的对比、探测器阵列的发展、光学系统设计流程以及不同观测场景下的光学系统选择。同时,文章展望了CMB望远镜光学系统的未来发展趋势,包括技术创新、多频段观测、国际合作与大型项目等。通过系统性的分析与对比,为CMB研究提供了全面的技术支持与理论基础。

f9g0h的博客 145

使用CloudCompare和CANUPO进行点云分类的编程指南

在本文中,我们将介绍如何使用CloudCompare和CANUPO库进行点云分类的编程。CloudCompare是一款功能强大的开源点云处理软件,而CANUPO是一个用于点云分类和分割的C++库。这只是一个简单的点云分类示例,CANUPO库还提供了其他更高级的功能和算法,以满足各种点云分类需求。该函数接受点云数据、地面点掩码和非地面点掩码作为输入,并将分类结果存储在这两个掩码向量中。完成安装后,我们可以开始编写点云分类的代码。最后,我们遍历点云数据,并根据地面点和非地面点的掩码将结果打印出来。

ByteWhisper的博客 1059

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

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

从通信协议到Netty RPC框架

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

cqdddgs的博客 1200

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

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

weixin_52344200的博客 774

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

基于IO、NIO和Netty的TCP聊天程序及springboot+netty实现网络聊天

文章目录一、IO、NIO、Netty的相关介绍1. IO和NIO的对比二、示例代码1.IO示例2.NIO示例3.Netty三、springboot+netty实现网络聊天1.创建项目2.代码模块 一、IO、NIO、Netty的相关介绍 1. IO和NIO的对比 1.1 传统IO 阻塞IO网络模型:服务器启动后会进入阻塞状态,等待client连接,每一个client端连接上服务器后,服务器会为每一个客户端起一个线程来处理客户端的需求。服务器的accept()方法、服务器新起的thread中,Socket

weixin_47306453的博客 2622

使用netty实现并维护TCP长连接

使用netty实现并维护TCP长连接Netty是什么Netty的优点Netty为什么并发高创建TCP长连接实例 Netty是什么 Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。 Netty 是一个广泛使用的 Java 网络编程框架(Netty 在 2011 年获得了Duke’s Choice Award,见https://www.java.net/dukeschoice/2011)。它活跃和成长于用户社区,像大型公司 Faceboo

shadowdowdow的博客 9317
上一篇: TCP-IP学习笔记四:NIO的网络编程-多线程实例
下一篇: TCP-IP学习笔记六:Netty使用--简单通信编程2
motui
博客等级 码龄10年 84粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值