概念篇

1.Netty 是什么?

Netty 是一款基于 NIO(Nonblocking I/O,非阻塞IO)开发的网络通信框架,对比于 BIO(Blocking I/O,阻塞IO),他的并发性能得到了很大提高。难能可贵的是,在保证快速和易用性的同时,并没有丧失可维护性和性能等优势。

2.Netty 的特点是什么?

高并发:Netty 是一款基于 NIO(Nonblocking IO,非阻塞IO)开发的网络通信框架,对比于 BIO(Blocking I/O,阻塞IO),他的并发性能得到了很大提高。
传输快:Netty 的传输依赖于零拷贝特性,尽量减少不必要的内存拷贝,实现了更高效率的传输。
封装好:Netty 封装了 NIO 操作的很多细节,提供了易于使用调用接口。

3.什么是 Netty 的零拷贝?

Netty 的零拷贝主要包含三个方面:
1,Netty 的接收和发送 ByteBuffer 采用 DIRECT BUFFERS,使用堆外直接内存进行 Socket 读写,不需要进行字节缓冲区的二次拷贝。如果使用传统的堆内存(HEAP BUFFERS)进行 Socket 读写,JVM 会将堆内存 Buffer 拷贝一份到直接内存中,然后才写入 Socket 中。相比于堆外直接内存,消息在发送过程中多了一次缓冲区的内存拷贝。
2,Netty 提供了组合 Buffer 对象,可以聚合多个 ByteBuffer 对象,用户可以像操作一个 Buffer 那样方便的对组合 Buffer 进行操作,避免了传统通过内存拷贝的方式将几个小 Buffer 合并成一个大的 Buffer。
3,Netty 的文件传输采用了 transferTo 方法,它可以直接将文件缓冲区的数据发送到目标 Channel,避免了传统通过循环 write 方式导致的内存拷贝问题。

4.Netty 高性能表现在哪些方面?

IO 线程模型:同步非阻塞,用最少的资源做更多的事。
内存零拷贝:尽量减少不必要的内存拷贝,实现了更高效率的传输。
内存池设计:申请的内存可以重用,主要指直接内存。内部实现是用一颗二叉查找树管理内存分配情况。
串形化处理读写:避免使用锁带来的性能开销。
高性能序列化协议:支持 protobuf 等高性能序列化协议。

5.Netty 中有那种重要组件?

Channel:Netty 网络操作抽象类,它除了包括基本的 I/O 操作,如 bind、connect、read、write 等。
EventLoop:主要是配合 Channel 处理 I/O 操作,用来处理连接的生命周期中所发生的事情。
ChannelFuture:Netty 框架中所有的 I/O 操作都为异步的,因此我们需要 ChannelFuture 的 addListener()注册一个 ChannelFutureListener 监听事件,当操作执行成功或者失败时,监听就会自动触发返回结果。
ChannelHandler:充当了所有处理入站和出站数据的逻辑容器。ChannelHandler 主要用来处理各种事件,这里的事件很广泛,比如可以是连接、数据接收、异常、数据转换等。
ChannelPipeline:为 ChannelHandler 链提供了容器,当 channel 创建时,就会被自动分配到它专属的 ChannelPipeline,这个关联是永久性的。

6.Netty 发送消息有几种方式?

Netty 有两种发送消息的方式:
1,直接写入 Channel 中,消息从 ChannelPipeline 当中尾部开始移动;
2,写入和 ChannelHandler 绑定的 ChannelHandlerContext 中,消息从 ChannelPipeline 中的下一个 ChannelHandler 中移动。

7.默认情况 Netty 起多少线程?何时启动?

Netty 默认是 CPU 处理器数的两倍,bind 完之后启动。

8.Netty 支持哪些心跳类型设置?

readerIdleTime:为读超时时间(即测试端一定时间内未接受到被测试端消息)。
writerIdleTime:为写超时时间(即测试端一定时间内向被测试端发送消息)。
allIdleTime:所有类型的超时时间。

实战篇

使用netty实现一个在线聊天的功能

  • Server
public class Server {public static void main(String[] args) throws InterruptedException {//ServerHandler sHandler = new ServerHandler();InetSocketAddress localSocket = new InetSocketAddress("127.0.0.1", 9990);ServerBootstrap  serverBootstrap = new ServerBootstrap ();serverBootstrap.group(new NioEventLoopGroup()).channel(NioServerSocketChannel.class).localAddress(localSocket).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {//添加译码器解码器ch.pipeline().addLast(new StringDecoder());ch.pipeline().addLast(new StringEncoder());ch.pipeline().addLast(new ServerHanlder());}});final ChannelFuture future = serverBootstrap.bind().sync();//future.channel().closeFuture().sync();// future.channel().closeFuture().sync();future.addListener(new ChannelFutureListener() {@Overridepublic void operationComplete(ChannelFuture f) throws Exception {// TODO Auto-generated method stubif (f.isSuccess()) {System.out.println("服务器开启成功");} else {System.out.println("服务器开启失败");f.cause().printStackTrace();}}});}
}
  • ServerHanlder
public class ServerHanlder extends ChannelInboundHandlerAdapter {private static final int MAX_CONN = 2;//指定最大连接数private int connectNum = 0;//当前连接数//channelHandlerContext表private Vector<ChannelHandlerContext> contexts = new Vector<>(3);//  private Map<String ,String> connects = new// private  ChannelHandlerContext channelHandlerContext ;public void channelActive(ChannelHandlerContext ctx) throws Exception {System.out.println("new connection");contexts.add(ctx);//channelHandlerContext =ctx;}public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {// int currentIndex = contexts.indexOf(ctx);// int anotherIndex = Math.abs(currentIndex - 1);System.out.println("客户端:" + msg.toString());InputStreamReader is = new InputStreamReader(System.in);BufferedReader br = new BufferedReader(is);String result = "result";try {result = br.readLine();} catch (IOException e) {e.printStackTrace();}//contexts.get(currentIndex).writeAndFlush(result);ctx.write(result);//给客户端回复ctx.flush();}}
  • Client
public class Client1 {public static void main(String[] args) throws InterruptedException {//ServerHandler sHandler = new ServerHandler();InetSocketAddress localSocket = new InetSocketAddress("127.0.0.1", 9990);Bootstrap bootstrap = new Bootstrap();bootstrap.group(new NioEventLoopGroup()).channel(NioSocketChannel.class).remoteAddress(localSocket).handler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {//添加译码器解码器ch.pipeline().addLast(new StringDecoder());ch.pipeline().addLast(new StringEncoder());ch.pipeline().addLast(new Client1Hanlder());}});ChannelFuture future = bootstrap.connect().sync();// future.channel().writeAndFlush("这里是客户端,请求连接服务端!");//future.channel().closeFuture().sync();//final ChannelFuture future = bootstrap.connect("127.0.0.1",9990).sync();// future.channel().closeFuture().sync();future.addListener(new ChannelFutureListener() {@Overridepublic void operationComplete(ChannelFuture f) throws Exception {// TODO Auto-generated method stubif (f.isSuccess()) {System.out.println("连接服务器成功");} else {System.out.println("连接服务器失败");f.cause().printStackTrace();}}});}
}
  • Client1Hanlder
public class Client1Hanlder extends ChannelInboundHandlerAdapter {private ChannelHandlerContext chc = null;public void channelActive(ChannelHandlerContext ctx) throws Exception {//保存当前ChannelHandlerContextchc = ctx;Scanner in = new Scanner(System.in);ctx.writeAndFlush(Unpooled.copiedBuffer(in.toString(), CharsetUtil.UTF_8));}public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {System.out.println("服务端: "+msg);InputStreamReader is = new InputStreamReader(System.in);BufferedReader br = new BufferedReader(is);String result ="result";try{result = br.readLine();}catch(IOException e){e.printStackTrace();}ctx.write(result);//给服务端回复ctx.flush();}
}

netty实现在线聊天相关推荐

  1. 基于netty的在线聊天室,支持群聊和私聊——【一】基本功能介绍和nginx配置

    netty虽然可以实现聊天室的功能.但完整的做下来,还是要自己去封装很多东西,尤其是客户端和服务器通信的数据格式,服务端消息派发器的设计.这一点就比spring 的websocket over sto ...

  2. springboot javafx netty实现在线聊天和视屏

    javafx  已实现在线聊天和视屏(是在一个大神基础上加的图片发送和视屏) 在线语音未实现,应该原理一样所以未做(捕获到音频流然后发送) 分客户端和服务端先启动服务端,再起客户端 运行效果 发送信息 ...

  3. 【SpringBoot框架篇】18.使用Netty加websocket实现在线聊天功能

    文章目录 1.简介 2.最终功能实现的效果图 2.1.pc端 2.2.移动端 3.实战应用 3.1.引入依赖 3.2.配置文件 3.3.测试demo 3.3.1.消息内容实体类 3.3.2.处理请求的 ...

  4. Netty网络编程聊天项目

                                     Netty网络编程聊天项目 后端编写 导入依赖    <dependencies><dependency>&l ...

  5. java qq聊天界面_【附源码】用Java写了一个类QQ界面聊天小项目,可在线聊天!...

    原标题:[附源码]用Java写了一个类QQ界面聊天小项目,可在线聊天! 目录: 1.功能实现 2.模块划分 3.使用到知识 4.部分代码实现 5.运行例图 1.功能实现 1.修改功能(密码.昵称.个性 ...

  6. Netty学习——一个聊天的案例实现(多线程)

    文章目录 1 项目介绍 一个聊天app 2 Netty 介绍与相关基础知识 2.1 Netty 介绍 2.2 BIO.NIO.AIO 介绍与区别 2.3 Netty Reactor 模型 - 单线程模 ...

  7. Spring boot 项目(二十三)——用 Netty+Websocket实现聊天室

    Netty的介绍 Netty 是基于 Java NIO 的异步事件驱动的网络应用框架,使用 Netty 可以快速开发网络应用,Netty 提供了高层次的抽象来简化 TCP 和 UDP 服务器的编程,但 ...

  8. php使用workerman实战,使用workerman实现在线聊天的方法

    workerman 是一个php编写的通讯服务.之前的项目都是用它做数据接口服务 这次用它做一个简单的在线聊天室~ 1.下载最新版本的workerman 可以去http://www.workerman ...

  9. rudesocket如何使用_[WebSocket入门]手把手搭建WebSocket多人在线聊天室(SpringBoot+WebS...

    前言 本文中搭建了一个简易的多人聊天室,使用了WebSocket的基础特性. 源代码来自老外的一篇好文: 本文内容摘要: 初步理解WebSocket的前后端交互逻辑 手把手使用 SpringBoot ...

最新文章

  1. OpenCV~PS效果
  2. [Android]用架构师角度看插件化(3)-Replugin 需要占坑跳转?
  3. PHP设置文本框背景透明度,如何给background-image设置透明度?
  4. windows上安装mysql
  5. Maven:构建web工程出现Failed to execute goal org.apache:maven-archetype-plugin:3.1.1:generate (default-cli)
  6. vi是linux文本界面编辑器吗,LINUX初学之文本编辑器(vi ,vim)
  7. 新疆大学c语言期末考试题库,2016年新疆师范大学教育科学学院C语言程序设计考研复试题库...
  8. Java调试打印复杂对象
  9. php开发类库,php类库_PHP开发中常用类库
  10. 基于腾讯云的Discuz论坛搭建
  11. 网络安全·网络入侵检测系统
  12. excel几个数相加等于某个数_EXCEL如何求出哪几个单元格里的数字之和等于某个特定值...
  13. [JavaScript] 整数金额转汉语数字大写
  14. html图形渐变颜色一半一半,CSS3第八课:重复线性渐变repeating-linear-gradient
  15. MySQL必知必会总结
  16. 第五人格服务器维修中怎么进,第五人格怎么进不去_进不去游戏原因汇总及解决办法_软吧...
  17. Ubuntu下噩梦搬的hud-service进程CPU直接爆炸
  18. matlab抗混叠滤波器,试验四音频抗混叠滤波器设计.doc
  19. php开源论坛系统,十款开源论坛系统推荐(二)
  20. Hadoop集群搭建之SSH无密码登录配置

热门文章

  1. HEAP: Free Heap block XXXX modified at XXXX after it was freed详解
  2. DEDECMS模板原理、模板标签学习
  3. puzzle(0121)《一笔画》
  4. C语言程序设计之四种方法求n的阶乘
  5. 下班后四小时,决定你的精神颜值
  6. Linux系统屏幕出现错位重影,uv打印时出现重影错位故障怎么办?
  7. C/C++飞机票订购系统
  8. system,sys密码找回
  9. 批量删除redis指定KEY
  10. 用TypeScript、JavaScript实现PDF转图片