NIO
石猴M
coding
展开
-
为什么选择netty?
为什么选择nettyNetty 是业界最流行的 NIO 框架之一,它的健壮性、功能、性能、可定制性和可扩展性在同类框架中都是首屈一指的,它已经得到成百上千的商用项目验证,例如 Hadoop 的 RPC 框架 Avro 使用 Netty 作为通信框架。很多其它业界主流的 RPC 和分布式服务框架,也使用Netty 来构建高性能的异步通信能力。Netty 的优点总结如下:API...原创 2019-01-04 10:48:09 · 335 阅读 · 0 评论 -
netty之微信-实现客户端与服务端收发消息(十一)
实战:实现客户端与服务端收发消息这一小节,我们来实现客户端与服务端收发消息,我们要实现的具体功能是:在控制台输入一条消息之后按回车,校验完客户端的登录状态之后,把消息发送到服务端,服务端收到消息之后打印并且向客户端发送一条消息,客户端收到之后打印。收发消息对象首先,我们来定义一下客户端与服务端的收发消息对象,我们把客户端发送至服务端的消息对象定义为 MessageRequestPa...原创 2019-01-23 09:41:34 · 1833 阅读 · 0 评论 -
netty之微信-pipeline 与 channelHandler(十二)
这一小节,我们将会学习 Netty 里面一大核心组件: Pipeline 与 ChannelHandler上一小节的最后,我们提出一个问题:如何避免 else 泛滥?我们注意到,不管是服务端还是客户端,处理流程大致分为以下几个步骤 我们把这三类逻辑都写在一个类里面,客户端写在 ClientHandler,服务端写在 ServerHandler,如果要做功能的扩展(比...原创 2019-01-23 09:43:29 · 548 阅读 · 0 评论 -
netty之微信-构建客户端与服务端 pipeline(十三)
实战:构建客户端与服务端 pipeline通过上小节的学习,我们已经了解 pipeline 和 channelHandler 的基本概念。本小节,我们使用上一小节的理论知识来重新构建服务端和客户端的 pipeline,把复杂的逻辑从单独的一个 channelHandler 中抽取出来。Netty 内置了很多开箱即用的 ChannelHandler。下面,我们通过学习 Netty 内置的...原创 2019-01-23 09:43:38 · 585 阅读 · 0 评论 -
netty之微信-拆包粘包理论与解决方案(十四)
实战:拆包粘包理论与解决方案本小节我们来学习一下 Netty 里面拆包和粘包的概念,并且如何选择适合我们应用程序的拆包器在开始本小节之前,我们首先来看一个例子,本小节的例子我们选择客户端与服务端双向通信这小节的代码,然后做适当修改拆包粘包例子客户端 FirstClientHandlerpublic class FirstClientHandler extends Ch...原创 2019-01-23 09:43:46 · 966 阅读 · 0 评论 -
netty之微信-channelHandler 的生命周期(十五)
channelHandler 的生命周期在前面的小节中,对于 ChannelHandler,我们重点落在了读取数据相关的逻辑,这小节,我们来学习一下 ChannelHandler 的其他回调方法,这些回调方法的执行是有顺序的,而这个执行顺序可以称为 ChannelHandler 的生命周期。ChannelHandler 的生命周期详解这小节,我们还是基于前面小节的代码,我们添加一个...原创 2019-01-23 09:43:53 · 2246 阅读 · 4 评论 -
netty之微信-客户端互聊原理与实现(十七)
实战:客户端互聊原理与实现之前写过一篇非严肃的微信单聊原理,得到广大网友的一致好评,有很多读者留言问我如何使用 Netty 来具体实现这个逻辑,学完本小节,你会发现其实很简单。在开始本小节之前,我们先来看一下本小节学完之后,单聊的实现的效果是什么样的?1. 最终效果服务端 服务端启动之后,两个客户端陆续登录客户端 1 ...原创 2019-01-23 09:44:10 · 1966 阅读 · 1 评论 -
netty之微信-群聊的发起与通知(十八)
群聊的发起与通知这小节,我们来学习一下如何创建一个群聊,并通知到群聊中的各位成员我们依然是先来看一下最终的效果是什么样的。1. 最终效果服务端 创建群聊的客户端 其他客户端 首先,依然是三位用户依次登录到服务器,分别是闪电侠、极速、萨维塔。 然后,我们在闪电侠的控制台输入 creat...原创 2019-01-23 09:44:18 · 1406 阅读 · 0 评论 -
netty之微信-群聊的成员管理(加入与退出,获取成员列表)(十九)
在开始之前,我们依然是先来看一下最终的效果。1. 最终效果服务端 从服务端可以看到,闪电侠、逆闪、极速先后登录到服务器,然后随后,闪电侠创建一个群聊,接下来,萨维塔也登录了。这里,客户端我们只展示闪电侠和萨维塔的控制台界面客户端 - 闪电侠 客户端 - 萨维塔 我们可以看到最终效果是四位用户登录成功之后...原创 2019-01-23 09:44:27 · 1647 阅读 · 0 评论 -
netty之微信-群聊消息的收发及 Netty 性能优化(二十)
群聊消息的收发及 Netty 性能优化通过前面小节的学习,相信大家看到本小节标题就已经知道该如何实现本小节的功能了吧,为了给大家学到更多的知识,在实现了群聊消息收发之后,本小节将带给大家更多的惊喜。开始实现之前,我们还是先来看一下群聊的最终效果。1. 群聊消息最终效果服务端 闪电侠,逆闪,极速先后登录,然后闪电侠拉逆闪,极速和自己加入群聊,下面,我们...原创 2019-01-23 09:44:37 · 2801 阅读 · 1 评论 -
netty之微信-心跳与空闲检测(二十一)
心跳与空闲检测本小节,我们一起探讨最后一个话题:心跳与空闲检测首先,我们来看一下,客户端与服务端之间的网络会存在什么问题?1. 网络问题下图是网络应用程序普遍会遇到的一个问题:连接假死 连接假死的现象是:在某一端(服务端或者客户端)看来,底层的 TCP 连接已经断开了,但是应用程序并没有捕获到,因此会认为这条连接仍然是存在的,从 TCP 层面来说,只有收...原创 2019-01-24 14:20:15 · 1146 阅读 · 2 评论 -
netty之微信-Netty 实现客户端登录(十)
实战:Netty 实现客户端登录本小节,我们来实现客户端登录到服务端的过程登录流程 从上图中我们可以看到,客户端连接上服务端之后客户端会构建一个登录请求对象,然后通过编码把请求对象编码为 ByteBuf,写到服务端。 服务端接受到 ByteBuf 之后,首先通过解码把 ByteBuf 解码为登录请求响应,然后进行校验。 服务端校验通过之后,构造一个登录响...原创 2019-01-22 16:58:11 · 3659 阅读 · 0 评论 -
netty之微信-客户端与服务端通信协议编解码(九)
客户端与服务端通信协议编解码在学习了 ByteBuf 的 API 之后,这小节我们来学习如何设计并实现客户端与服务端的通信协议什么是服务端与客户端的通信协议无论是使用 Netty 还是原始的 Socket 编程,基于 TCP 通信的数据包格式均为二进制,协议指的就是客户端与服务端事先商量好的,每一个二进制数据包中每一段字节分别代表什么含义的规则。如下图的一个简单的登录指令 ...原创 2019-01-22 16:57:01 · 1401 阅读 · 2 评论 -
netty之微信-数据传输载体 ByteBuf (八)
数据传输载体 ByteBuf 介绍在前面一小节,我们已经了解到 Netty 里面数据读写是以 ByteBuf 为单位进行交互的,这一小节,我们就来详细剖析一下 ByteBufByteBuf结构首先,我们先来了解一下 ByteBuf 的结构 以上就是一个 ByteBuf 的结构图,从上面这幅图可以看到ByteBuf 是一个字节容器,容器里面的的数据分为三个部分...原创 2019-01-22 16:55:57 · 1486 阅读 · 0 评论 -
netty之微信-效果展示(一)
支持可热拔插的channelHandler ,心跳与空闲检测,源码 1、启动服务端(运行nettyServer的main方法) 2、启动客户端(运行nettyclient的main方法),并输入登录用户名登录,如下图: 3、单聊发送方: 接受方: 4、群聊(1)、发起群聊,创建群client: server:...原创 2019-01-22 16:27:26 · 813 阅读 · 0 评论 -
netty之微信-IM简介(二)
微信的聊天又分为单聊和群聊,下面分别来介绍一下。源码单聊流程单聊指的是两个用户之间相互聊天。下面我们来看一下,用户单聊的基本流程 如上图,A 要和 B 聊天,首先 A 和 B 需要与服务器建立连接,然后进行一次登录流程,服务端保存用户标识和 TCP 连接的映射关系 A 发消息给 B,首先需要将带有 B 标识的消息数据包发送到服务器,然后服务器从消息数据包中拿到 B...原创 2019-01-22 16:41:06 · 1449 阅读 · 1 评论 -
netty之微信-Netty 是什么?(三)
Netty 是什么?在开始了解 Netty 是什么之前,我们先来回顾一下,如果我们需要实现一个客户端与服务端通信的程序,使用传统的 IO 编程,应该如何来实现?源码IO编程我们简化下场景:客户端每隔两秒发送一个带有时间戳的 "hello world" 给服务端,服务端收到之后打印。为了方便演示,下面例子中,服务端和客户端各一个类,把这两个类拷贝到你的 IDE 中,先后运行 IOSe...原创 2019-01-22 16:42:31 · 907 阅读 · 0 评论 -
netty之微信-Netty 环境配置(四)
请务必阅读此章节,有疑问请在章节下留言。源码地址:源码本小节介绍一下使用本小册的环境搭建,本小册假设读者本机已经有了 java 编程需要的环境。如果读者本机已经安装过 Maven,Git,Intellij IDEA 环境,建议直接看文末如何使用本小册代码。MavenMaven 是一个基于对象模型来管理项目构建的项目管理工具,通过配置文件 pom.xml 来配置 jar ...原创 2019-01-22 16:44:18 · 722 阅读 · 0 评论 -
netty之微信-服务端启动流程(五)
服务端启动流程这一小节,我们来学习一下如何使用 Netty 来启动一个服务端应用程序,以下是服务端启动的一个非常精简的 Demo:NettyServer.javapublic class NettyServer { public static void main(String[] args) { NioEventLoopGroup bossGroup = ...原创 2019-01-22 16:45:00 · 654 阅读 · 0 评论 -
netty之微信-客户端启动流程(六)
客户端启动流程上一小节,我们已经学习了 Netty 服务端启动的流程,这一小节,我们来学习一下 Netty 客户端的启动流程。源码客户端启动 Demo对于客户端的启动来说,和服务端的启动类似,依然需要线程模型、IO 模型,以及 IO 业务处理逻辑三大参数,下面,我们来看一下客户端启动的标准流程NettyClient.javapublic class NettyClient...原创 2019-01-22 16:45:52 · 551 阅读 · 0 评论 -
netty之微信-客户端与服务端双向通信(七)
实战:客户端与服务端双向通信在前面两个小节,我们已经学习了服务端启动与客户端启动的流程,熟悉了这两个过程之后,就可以建立服务端与客户端之间的通信了,本小节,我们用一个非常简单的 Demo 来了解一下服务端和客户端是如何来通信的。.handler(new ChannelInitializer<SocketChannel>() { @Override public...原创 2019-01-22 16:52:31 · 1137 阅读 · 0 评论 -
netty之微信-小册总结(二十二)
小册总结Netty 相关的知识点到这里就告一段落了,最后,我们再用专门一节来对我们这本小册做一下总结回顾。1. Netty 是什么?经过我们整个小册的学习,我们可以了解到,Netty 其实可以看做是对 BIO 和 NIO 的封装,并提供良好的 IO 读写相关的 API,另外还提供了非常多的开箱即用的 handler,工具类等等。2. 服务端和客户端启动Netty 提供了两大...原创 2019-01-24 14:20:25 · 504 阅读 · 0 评论