服务端:

//服务端
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. 【Java并发编程】之七:使用synchronized获取互斥锁的几点说明

    在并发编程中,多线程同时并发访问的资源叫做临界资源,当多个线程同时访问对象并要求操作相同资源时,分割了原子操作就有可能出现数据的不一致或数据不完整的情况,为避免这种情况的发生,我们会采取同步机制,以确 ...

  2. Multiple Instance Learning

    ///////////////////////////////////////////推荐学习组////////////////////////////// http://www.robots.ox. ...

  3. 【刷题】BZOJ 2816 [ZJOI2012]网络

    Description http://www.lydsy.com/JudgeOnline/upload/zjoi2012.pdf Solution 维护树上联通块的信息,支持动态加边删边 LCT 总共 ...

  4. 沉迷AC自动机无法自拔之:穿越广场 square

    如标题所言,我已经沉迷于AC自动机无法自拔了... 这又是一道AC自动的题,红红火火恍恍惚惚 穿越广场 [问题描述] L 国的仪仗队要穿越首都广场了.首都广场可以看做是一块 N*M 的矩形网格,仪仗队 ...

  5. BZOJ3834 [Poi2014]Solar Panels 【数论】

    题目链接 BZOJ3834 题解 容易想到对于\(gcd(x,y) = D\),\(d\)的倍数一定存在于两个区间中 换言之 \[\lfloor \frac{a - 1}{D} \rfloor < ...

  6. CVE-2018-1111劫持dhcp造成centos代码执行漏洞

    0x01 漏洞概述 近日,红帽官方发布了安全更新,修复了编号为CVE-2018-1111的远程代码执行漏洞,攻击者可以通过伪造DHCP服务器发送响应包,攻击红帽系统,获取root权限并执行任意命令. ...

  7. Python之旅:数据类型、字符编码、文件处理

    一 引子 1 什么是数据? x=10,10是我们要存储的数据 2 为何数据要分不同的类型 数据是用来表示状态的,不同的状态就应该用不同的类型的数据去表示 3 数据类型 以下每个类型都是有详细介绍链接的 ...

  8. NGINX生产环境反向代理到后端tomcat配置

    #当访问www.kazihuo.com//sichuan-user-te时,跳转到http://10.1.93.61:7005/sichuan-user server { listen ; serve ...

  9. What Does “Neurons that Fire Together Wire Together” Mean?

    What Does “Neurons that Fire Together Wire Together” Mean? I’ve heard the phrase “neurons that fire ...

  10. Understanding the Bias-Variance Tradeoff

    Understanding the Bias-Variance Tradeoff When we discuss prediction models, prediction errors can be ...