Netty服务器与客户端通讯案例

android netty5局域网通讯(客户端+服务端) 这是一个WebSocket协议的Demo,仅仅粗略的实现了功能        WebSocket是HTML5开始提供的一种浏览器与服务器建进行全双工通讯的网络协议,它的出现是为了解决HTTP协议效率低下的问题,WebSocket能更好的节省服务器资源和带宽并达到实时通信! Demo下载 Client: package com.tomorrow_p.netty_p; i 阅读详情

服务器端:



import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;

public class NettyServer {
    public static void main(String[] args) throws InterruptedException {
        //1、创建两个线程组 bossGroup workGroup
//bossGroup线程组负责客户端连接
        EventLoopGroup bossGroup=new NioEventLoopGroup();
//workGroup线程组负责网络读写操作
        EventLoopGroup workGroup=new NioEventLoopGroup();
//2、创建服务器启动助手来配置参数--创建辅助的工具类,用于服务器通道的一些列配置
        ServerBootstrap serverBootstrap=new ServerBootstrap();
//链式编程
        serverBootstrap.group(bossGroup,workGroup)//绑定两个线程组
                .channel(NioServerSocketChannel.class)//指定NIO模式
                .option(ChannelOption.SO_BACKLOG,512)//设置TCP缓冲区
                .childOption(ChannelOption.SO_KEEPALIVE,true)//保持连接
                .childHandler(new ChannelInitializer<SocketChannel>() {
                    protected void initChannel(SocketChannel ch) throws Exception {//数据 接收方法的处理
                        ch.pipeline().addLast(new NettyServerHandler());//具体业务的处理
                    }
                });
        System.out.println("Server : 准备就绪!!!");
//3 绑定端口,设置非堵塞,,这里是一个异步操作
        ChannelFuture cf = serverBootstrap.bind(8765).sync();
        ChannelFuture cf2 = serverBootstrap.bind(8766).sync();//--绑定多个端口,开口变大,但是处理能力不变
        System.out.println("Server : 启动!!!");
//4 关闭通道
        cf.channel().closeFuture().sync();//等待关闭
        cf2.channel().closeFuture().sync();//等待关闭
        System.out.println("Server--关闭通道!!!");
//关闭线程组
        bossGroup.shutdownGracefully();
        workGroup.shutdownGracefully();
        System.out.println("Server--关闭线程组!!!");
    }
}


服务器业务处理类:


import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;
import javax.sound.midi.Soundbank;

//普通类变成业务处理类需要继承一个类或者实现一个接口
public class NettyServerHandler extends ChannelInboundHandlerAdapter {
    //数据的读取事件
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws
            Exception {
        System.out.println("serverHandler--ctx:"+ctx);
        ByteBuf buffer= (ByteBuf) msg;
        System.out.println("来自客户端的消息:"+buffer.toString(CharsetUtil.UTF_8));
    }
    //数据读取完毕事件
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception
    {
        ChannelFuture channelFuture =
                ctx.writeAndFlush(Unpooled.copiedBuffer("hi,client,我收到你的消息啦!", CharsetUtil.UTF_8));
//添加监听事件:数据发送完毕之后,直接断开客户端的连接
       // channelFuture.addListener(ChannelFutureListener.CLOSE);
    }
    //异常捕捉事件
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
            throws Exception {
        ctx.close();
    }
}

客户端:



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

public class NettyClient {
    public void run() throws InterruptedException {
        EventLoopGroup group=new NioEventLoopGroup();
//创建客户端的启动助手
        Bootstrap bootstrap=new Bootstrap();
//开始配置
        bootstrap.group(group)
                .channel(NioSocketChannel.class)
                .handler(new ChannelInitializer<SocketChannel>() {
                    protected void initChannel(SocketChannel ch) throws
                            Exception {
                        ch.pipeline().addLast(new NettyClientHandler());//具体业务处理
                    }
                });
        System.out.println("Client: 准备就绪!!!");
//启动客户端去连接服务器
        ChannelFuture cf = bootstrap.connect("127.0.0.1", 8765).sync();
        ChannelFuture cf2 = bootstrap.connect("127.0.0.1", 8766).sync();
        //服务器端断开连接这边才会断开连接的,
        cf.channel().closeFuture().sync();//等待关闭
        cf2.channel().closeFuture().sync();//等待关闭
        System.out.println("Client--关闭通道!!!");
        group.shutdownGracefully();
        System.out.println("Client--关闭线程组!!!");
    }
    public static void main(String[] args) {
        try {
            new NettyClient().run();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

客户端业务处理类:


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

//客户端业务处理类
//入站操作,进入pipeline里面
public class NettyClientHandler extends ChannelInboundHandlerAdapter{
    //通道就绪
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("Client: ctx="+ctx);
        ctx.writeAndFlush(Unpooled.copiedBuffer("hi,server,这是来自客户端的招呼!", CharsetUtil.UTF_8));
    }
    //数据的读取事件
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws
            Exception {
        ByteBuf buf = (ByteBuf) msg;
        System.out.println("服务器回复的消息:" + buf.toString(CharsetUtil.UTF_8));
    }
}


在这里插入图片描述
在这里插入图片描述
当服务器断开以后,客户端会执行断开连接的操作。
在这里插入图片描述

Netty入门实现双端通讯 一、为什么使用Netty: Netty是一个高性能、异步事件驱动的NIO框架。相对于使用原生的NIO,Netty API 使用简单,开发门槛低,成熟、稳定,Netty 修复了已经发现的所有 JDK NIO BUG,业务开发人员不需要再为 NIO 的 BUG 而烦恼,经历了大规模的商业应用考验,质量已经得到验证。在互联网、大数据、网络游戏、企业应用、电信软件等众多行业得到成功商用,证明了它可以完全满... 阅读详情

相关推荐

基于Netty+WebSocket+Spring的即时通讯系统实战案例

在构建高性能网络通信系统时,内存管理与数据处理流程的优化是决定服务吞吐量和响应延迟的关键因素。Netty 作为一款以异步事件驱动为核心的 NIO 框架,在设计上对底层 I/O 和内存操作进行了深度封装,其中ByteBuf是其核心的数据容器,而则构成了业务逻辑处理的责任链体系。本章将深入剖析 Netty 的内存管理机制,从堆内/堆外缓冲区的选择、池化分配器的工作原理到引用计数的生命周期控制;

weixin_31961675的博客 1432

import io.netty.util.internal.StringUtil;import org.slf4j.Logger; import org.slf4j.LoggerFactory;

import io.netty.util.internal.StringUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 配置ssm CROS 跨域时遇到 所用jar包: slf4j-api-1.7.26.jar slf4j-log4j12-1.7.26.jar 官方地址: https://www.slf4j.org/ n...

zhaoweihao的博客 5128

SECS/GEM EAP 设备自动化功能原理和设计方案

半导体SECS GEMEAP实现了对生产线上机台的实时监控,是工厂自动化不可缺少的控制系统。EAP系统与FAB中的机台紧密相关,系统的设计与开发必须与生产线的机台实际生产流程相一致,才能达到控制机台生产的目的。 EAP SECS/GEM是MES与设备的桥梁,EAP通过SECS国际标准协议与机台进行数据传输。SECS是半导体设备(半导体行业称设备为机台)必须遵循的一种国际通信协议。EAP就是通过SECS与设备通信、传输数据、发送指令控制设备按照预先定义........

semisecs 17万+

Java IO学习笔记八:多路复用到Netty

但是对于每次服务端的Handler,如果都要加@Sharable,就会非常不好扩展,Netty里面提供了一个没有任何业务功能的并且标注为@Sharable的类:ChannelInitializer, 每个业务handler只需要重写其initChannel()方法即可,我们可以改造一下NettyClientSync和NettyServerSync的代码,并用Netty推荐的写法来修改。Netty+最朴素的阻塞的方式来实现一版客户端和服务端通信的代码,然后再重构成Netty官方推荐的写法。

Practitioner 546

【论文精读】Latent Diffusion

Latent Diffusion

weixin_44934783的博客 4475

基于STM32F427的模拟SSI协议绝对式编码器位置反馈通信

基于STM32F427的模拟SSI协议绝对式编码器位置反馈通信

xeke997的博客 6064

netty4报错:io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1

背景:netty执行链中有一串自定义的handler,目前我想要在中间再加上一个pingPonghandler来进行控制帧的处理,从而避免ng的读写超时(客户要求,与他们建立的通道一直连接,不进行断连,从而需要考虑ng的问题);当我添加如下代码后报错:io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1,ByteBuf的引用计数refCnt为0;获取引用计数。

qq_45225798的博客 2331

【验证技能树】UVM 源码解读01 -- UVM本质上就是软件工程方法论在芯片验证领域的应用

文章摘要: UVM(通用验证方法学)是基于SystemVerilog的芯片验证框架,采用组件化、面向对象和事务级抽象设计。其核心在于职责分离与数据流,通过Driver、Monitor、Sequencer等模块协作实现高效验证。UVM强调复用性、可扩展性和可维护性,类似软件工程的模块化与低耦合原则。理解其体系结构比记忆API更重要,有助于灵活组合组件并提升验证效率。UVM不仅是工具,更融合了软件工程思维,推动验证工作向自动化、系统化发展。掌握UVM底层逻辑能优化验证环境设计,适用于从IP到SoC的多层级验证场

qq_45869788的博客 1039

计算机网络实验(华为eNSP模拟器)——第十章 Eth-Trunk(链路聚合)

目录一、Eth-Trunk的定义二、Eth-Trunk的工作模式(一)LACP模式1、定义2、命令(二)手工负载分担模式1、定义2、命令三、结语 一、Eth-Trunk的定义 Eth-Trunk是指设备的链路聚合,即将该设备的多个接口捆绑成一个接口,从而达到了增加带宽和提高可靠性的目的。我们要注意它是将多条物理链路,在逻辑上合并成一条,而不是串在一起。例我们将LSW1交换机S5700的三个端口(即GE0/0/1 、GE0/0/2、GE0/0/3)定义为一个Eth-Trunk接口与LSW2交换机相连,如下:

小宇y的博客 8415

ardupilot如何让官网支持自己的硬件方案

本节主要记录ardupilot中如何让官网支持自己的硬件方案。参考1参考2。

陌城烟雨 159

Netty的服务端和客户端

通过简单代码实现服务端与服务端 本文章只做简单学习交流,如工作需要,请合理配置搭建。 详细讲解在代码注释中。上货!!!! 1、引入包 pom.xml中引入 <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.20.Final</version> </dependency>

小白谈java的博客 1730

OpenCV入门(一)Python环境的搭建

因为有点Python基础,并且Python是比较好入门的编程语言,所以,机器视觉后面打算在Python这个平台下进行。

小幽余生不加糖 8118

Netty服务器和客户端交互案例

Netty服务器和客户端交互案例 简述:使用netty完成通讯简单的例子 服务器端代码: package netty; import java.net.InetSocketAddress; import java.util.concurrent.Executors; import org.jboss.netty.bootstrap.ServerBootstrap; import or

白丝巾的博客 1711

华为OD机试真题2025双机位B卷 Python&JS 实现【朋友圈个数】

给定一组朋友关系,统计一下该朋友关系网中的朋友圈个数。 朋友圈的定义:一个朋友圈至少由3个朋友组成,且要求同一个朋友圈中的任意两个人都具有直接的朋友关系。 输入描述 输入一个朋友关系列表,如 Fiends =A.B],[A.C],IB,DI,其中的每一个元素 Friendsi表示 Friends[i][0)和 Friends [i][1] 是朋友关系 先输入一个数字 N 代表关系的总数,后面每条关系一行,两个成员以逗号分隔

MISAYAONE的博客 561

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

网络I/o编程模型12 netty实现tcp服务通讯(含EventLoop实现调度)

一 netyy实现tcp通讯 1.1 案例需求描述 1.netty服务端可以监听6666端口,客户端向此服务器进行发送信息。例如“hello,netty服务器....”; 2.服务端收到信息对客户端进行回复信息,例如“hello,客户端发的消息已经收到.....” ......

健康平安的活着的专栏 491

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Netty入门之代码实例(四)

Netty入门之代码实例(四) 1. 前言 由上一篇博客我们了解了Netty个组件的作用,那么本篇通过使用Netty来完成群聊系统,心跳检测,WebSocket 编程实现服务器和客户端长连接这三个小案例,进一步理解Netty非阻塞网络编程机制。 2. Netty应用实例 – 群聊系统 2.1 实例要求 编写一个 Netty 群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞) 实现多人群聊 服务器端:可以监测用户上线,离线,并实现消息转发功能 客户端:通过 channel 可以无阻塞发送消息给其它所

ZeroWdd的博客 469

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

假人有限元模型

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

netty入门实现简单的echo程序

最近看以往在程序中编写的代码,发现有一个功能是使用socket通讯来实现的,而那个时候使用的是基于bio的阻塞io来实现的,最近在看netty,发现可以使用netty来使用nio的方式来实现,此博客记录一下netty学习的一个过程,此处实现一个简单的服务器和客户端之间的通讯。 实现要求: 1、服务器端监听9090端口 2、客户端连上服务端时,向服务端发送10条消息 ...

huan的学习记录 330

java netty

等待补充,先参考:面试题-Netty篇 - 泉水姐姐。 - 博客园

感冒石头的博客 308

netty实战:SpringBoot集成netty实现客户端服务端交互

SpringBoot集成netty实现客户端服务端交互在springboot中集成netty。我在代码里用到了lombok的@data和@Slf4j注解,主要用来简化get set方法和输出日志。我们先加入netty的依赖下面是我的netty代码结构server端server启动类server初始化类server处理类启动类在springboot启动类中加入服务端的启动代码,让netty服务跟着项...

weixin_42906256的博客 3万+

python 服务端与c++客户端通讯_c++客户端和java(Netty)服务器端tcp通讯

【实例简介】基于tcp通讯,涉及java的netty服务器的推送功能和c++socket的封装以及protobuf在java和c++中的使用。【实例截图】【核心代码】cANDjavasocket└── c++&javasocket├── c++客户端和java服务器端tcp通讯.docx├── FtpClientDemo│ ├── FtpClientDemo│ │ ├── bu...

weixin_31861647的博客 833

SpringBoot中使用Netty实现TCP通讯,服务器主动向客户端发送数据

简述: Springboot项目的web服务后台,web服务运行在9100端口。 后台使用netty实现了TCP服务,运行在8000端口。 启动截图如下: netty服务代码 import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChann.

weiqiang915的博客 1万+

Netty实现简单的Socket通讯

Netty实现简单的Socket通讯 Netty简介 Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty...

Touch 6934

websocket性能低?教你使用netty整合websocket(一)——客户端和服务端通讯

SpringBoot+Netty整合websocket 现在的一般的项目当中一般都有长连接时事通讯的需求,客户端和服务器之间,客户端和客户端之间进行通讯。 原生的websocket往往容易发生同步阻塞,导致效率低。采用Netty整合websocket,极大提升websocket的效率。

Duktig的博客 3491

SpringBoot实现Socket客户端,Netty服务端实现Java通讯(附源码及注释详解)

SpringBoot实现Socket通讯: 使用Netty实现一个Socket通讯,包括客户端和服务端,通过服务端进行监听,客户端发送信息,服务端可进行接收,并进行返回数据,完成一个完整的通讯 客户端用的Socket编程,而服务端用到Netty框架实现。源码地址: 源码地址!!!!!!!! 而且启动初始化及调用的日志、注释写的很清楚,如下: package com.xu.server; impo...

beishanyingluo的博客 1万+

Spring Boot All实时通讯:WebSocket与Netty服务器搭建指南

Spring Boot All是一个集成了多种主流技术的开源项目,包含WebSocket和Netty等实时通讯相关组件,能够帮助开发者快速构建高性能的实时通讯应用。本文将详细介绍如何利用Spring Boot All项目中的WebSocket和Netty模块搭建实时通讯服务器。 ## 实时通讯技术选型:WebSocket与Netty的完美结合 在现代Web应用开发中,实时通讯功能越来越重要。W

gitblog_01095的博客 970
上一篇: maven 使用clean编译出现Process terminated
下一篇: 一条SQL执行的过程
凌晨里的无聊人
博客等级 码龄8年 2320粉丝 206原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌晨里的无聊人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值