服务端:

//服务端
public class Server {
public static void main(String[] args) {
//创建两个线程组
EventLoopGroup connectGroup = new NioEventLoopGroup();//接受客户端连接
EventLoopGroup workGroup = new NioEventLoopGroup();//处理实际业务操作
try {//创建server配置类
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(connectGroup,workGroup)//支持链式编程,进行配置
//指定使用NioServerSocketChannel这种类型(服务端)的通道
.channel(NioServerSocketChannel.class)
//ChannelInitializer:服务器Channel通道初始化设置的抽象类
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override //初始化操作:编解码,绑定处理逻辑等
protected void initChannel(SocketChannel channel) throws Exception {
//使用 childHandler 去绑定具体的 事件处理器
ChannelPipeline pipeline = channel.pipeline();
pipeline.addLast(new ServerHandler());//绑定服务端数据处理
}
});
//绑定端口,调用sync()方法来执行同步阻塞,直到绑定完成
ChannelFuture sync = bootstrap.bind(9527).sync();
//获取该Channel的CloseFuture,并且阻塞当前线程直到绑定的端口关闭才会执行关闭通道
sync.channel().closeFuture().sync();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//关闭线程组
connectGroup.shutdownGracefully();
workGroup.shutdownGracefully();
}
}
}

  服务端业务处理

/*
* 服务端处理数据类
* */
// SimpleChannelInboundHandler: 只处理入站消息(接受到的)
public class ServerHandler extends SimpleChannelInboundHandler<ByteBuf> {
//CTRL+O: 重写父类方法
//对数据进行处理
@Override
protected void channelRead0(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf) throws Exception {
byte[] data=new byte[byteBuf.readableBytes()];//创建byte数组
byteBuf.readBytes(data);//将数据读取到数组中
//转String
String str=new String(data,"utf-8");
System.out.println("服务端收到数据:"+str);
//返回数据给客户端 Ctrl+Alt+V :自动补全返回值
ByteBuf byteBuf1 = Unpooled.copiedBuffer("我已经接受到数据".getBytes());//转byteBuf
channelHandlerContext.writeAndFlush(byteBuf1);//发送给客户端
}
//捕获异常
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();//打印信息
ctx.close();//关闭通道
}
}

  客户端

//客户端
public class Client {
public static void main(String[] args) throws Exception {
//实际业务处理线程组
EventLoopGroup workGroup = new NioEventLoopGroup();
//创建客户端配置类
Bootstrap bootstrap=new Bootstrap();
//链式配置
bootstrap.group(workGroup)
.channel(NioSocketChannel.class) //指定客户端类型通道
.handler(new ChannelInitializer<SocketChannel>() { //配置初始化
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
socketChannel.pipeline().addLast(new ClientHandler());//绑定客户端数据处理对象
}
});
//与服务端连接,调用sync()方法来执行同步阻塞,直到连接完成
ChannelFuture sync =bootstrap.connect("127.0.0.1",9527).sync();
//向服务端发送数据 Unpooled: netty提供的工具类,可以将其他类型转为buf类型
sync.channel().writeAndFlush(Unpooled.copiedBuffer("我是客户端".getBytes()));
//开启同步阻塞监听,直到断开连接才关闭通道
sync.channel().closeFuture().sync();
workGroup.shutdownGracefully();
}
}

  客户端业务处理

//客户端处理数据
public class ClientHandler extends SimpleChannelInboundHandler<ByteBuf> {
//处理服务端返回的数据
@Override
protected void channelRead0(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf) throws Exception {
byte[] data = new byte[byteBuf.readableBytes()];//byteBuf.readableBytes():获取可用的长度
byteBuf.readBytes(data);//数据读取到数组中
String string = new String(data,"utf-8");
System.out.println("客户端接受到服务端返回的数据:"+string);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();//打印信息
ctx.close();//关闭通道
}
}

  到这里一个客户端服务端简单通信就完成了,比nio简单多了,是不是,工具用的idea,先开启服务端,再开启客户端:

基于Netty4.1.29.Final的helloworld实现.使用idea的更多相关文章

  1. 【原创】NIO框架入门(一):服务端基于Netty4的UDP双向通信Demo演示

    申明:本文由作者基于日常实践整理,希望对初次接触MINA.Netty的人有所启发.如需与作者交流,见文签名,互相学习. 学习交流 更多学习资料:点此进入 推荐 移动端即时通讯交流: 215891622 ...

  2. Netty4.0.24.Final 版本中 IdleStateHandler 使用时的局限性

    使用Netty在客户端和服务端建立通讯通道,一般来说,一个连接可能很久没有访问,由于各种各样的网络问题导致连接已经失效,客户端再次发送请求时会产生连接异常. 基于这个原因,需要在客户端和服务端之间建立 ...

  3. 基于Netty4的HttpServer和HttpClient的简单实现

    Netty的主页:http://netty.io/index.html 使用的Netty的版本:netty-4.0.23.Final.tar.bz2 ‐ 15-Aug-2014 (Stable, Re ...

  4. netty03(基于4.1.23.Final 版本的案例)

    基于前面的netty01和netty02修改一下版本,可以点进去的 将maven依赖版本改了一下 <!-- netty版本:netty-5.0.0.Alpha2 http://files.cnb ...

  5. 字节码编程,Javassist篇一《基于javassist的第一个案例helloworld》

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 目录 @ 目录 目录 一.前言 二.开发环境 三.案例目标 四.技术实现 五.测试结果 1. ...

  6. 基于Netty4手把手实现一个带注册中心和注解的Dubbo框架

    阅读这篇文章之前,建议先阅读和这篇文章关联的内容. 1. 详细剖析分布式微服务架构下网络通信的底层实现原理(图解) 2. (年薪60W的技巧)工作了5年,你真的理解Netty以及为什么要用吗?(深度干 ...

  7. 基于netty4.x开发时间服务器

    在写代码之前 先了解下Reactor模型: Reactor单线程模型就是指所有的IO操作都在同一个NIO线程上面完成的,也就是IO处理线程是单线程的.NIO线程的职责是: (1)作为NIO服务端,接收 ...

  8. 支撑百万级并发,Netty如何实现高性能内存管理

    Netty作为一款高性能网络应用程序框架,实现了一套高性能内存管理机制 通过学习其中的实现原理.算法.并发设计,有利于我们写出更优雅.更高性能的代码:当使用Netty时碰到内存方面的问题时,也可以更高 ...

  9. Netty堆外内存泄漏排查,这一篇全讲清楚了

    上篇文章介绍了Netty内存模型原理,由于Netty在使用不当会导致堆外内存泄漏,网上关于这方面的资料比较少,所以写下这篇文章,专门介绍排查Netty堆外内存相关的知识点,诊断工具,以及排查思路提供参 ...

随机推荐

  1. python自动化之读写

    ############################################################################# #############在Windows上 ...

  2. WEB javaScript

    javaScript 1.常规方法document.write("内容") :书写内容到网页中window.alert("内容") :网页警告弹窗 2.使用方法 ...

  3. PGM学习之六 从有向无环图(DAG)到贝叶斯网络(Bayesian Networks)

    本文的目的是记录一些在学习贝叶斯网络(Bayesian Networks)过程中遇到的基本问题.主要包括有向无环图(DAG),I-Maps,分解(Factorization),有向分割(d-Separ ...

  4. mysql二进制日志的开启和使用

    二进制日志(BINLOG)记录了所有的ddl和dml语句,但不包括数据查询语句.语句以“事件”的形式保存,描述数据更改过程. 环境:win8   mysql5.6.23 1.mysql开启二进制日志 ...

  5. 【BZOJ2989】数列(二进制分组,主席树)

    [BZOJ2989]数列(二进制分组,主席树) 题面 BZOJ 权限题啊... Description 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即g ...

  6. 【bzoj2876】 Noi2012—骑行川藏

    http://www.lydsy.com/JudgeOnline/problem.php?id=2876 (题目链接) 题意 在满足约束条件$${\sum_{i=1}^ns_ik_i(v_i-v_i' ...

  7. BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )

    BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...

  8. C++析构函数的自动调用(用于父类指针指向子类对象,内存泄漏问题)

    class A {public:A() { printf("A \n"); }~A() { printf(" ~A \n"); } // 这里不管写不写virt ...

  9. R语言缺失值高级处理方法

    0 引言 对于一些数据集,不可避免的出现缺失值.对缺失值的处理非常重要,它是我们能否继续进行数据分析的关键,也是能否继续大数据分析的数据基础. 1 缺失值分类 在对缺失数据进行处理前,了解数据缺失的机 ...

  10. 使用nginx的ngx_upstream_jdomain模块实现k8s容器的负载均衡

    使用背景最近一直在准备k8s上线事宜,目前已经在测试环境中全面部署并通过压力测试环境检验.离正式上线基本只剩下时间问题.我们目前测试环境中的容器负载均衡大量使用到了nginx,就是借助了ngx_ups ...