Netty网络编程
文章平均质量分 87
键盘林
将代码融入于生活。享受生活,享受程序。一段程序,一场人生。
展开
-
Netty的深入浅出--1.项目初次尝试
创建好项目(项目采用的是gradle管理器):NioEventLoopGroup(线程组):简单来说就是一个循环;bossGroup不断接收信息,但是不进行任何处理;workerGroup对bossGroup接收到的数据进行处理。其实如果一个线程组也能完成接收然后处理,在返回给前端,但是真正意义上来说,这样并不符合编程规范。所以netty规定使用两个线程组来进行处理。S...原创 2019-05-27 10:47:30 · 708 阅读 · 0 评论 -
Netty的深入浅出--2.回调与channel流程执行
接上一篇文件的项目继续讲解:Netty的深入浅出--1.项目初次尝试在浏览器中可能会发送两次请求:上面可以看到我们控制台打印了两次,说明浏览器客户端向后台发送了两次请求,而两次请求分别是:一个是我们的地址请求,一个是浏览器自身向后台请求网站图标解决办法:对请求进行判断,如果是favicon.ico请求就退出不执行后面的再次运行:由...原创 2019-05-27 12:36:53 · 509 阅读 · 0 评论 -
Netty的深入浅出--3.基于socket编程实现服务端和客服端
一.服务端:创建MyService:创建服务器管道初始化器MyServerInitialzer.java:添加编码处理器LengthFieldBasedFrameDecoder(将二进制信息解码成实际携带的信息)关于解码处理器暂时不进行讲解,后面再详细讲解:编码器设置解码字符集:设置编码字符集:添加一个null作为占位符:...原创 2019-05-27 18:44:50 · 691 阅读 · 0 评论 -
Netty的深入浅出--4.实现简单的聊天程序
聊天程序的服务端:创建一个MyChatServer的main函数:创建解码器DelimiterBasedFrameDecoder(根据分隔符将消息解码)对于该解码器后续在进行详细讲解,现在只要知道这是干嘛的就行了下面这些就是字符的编码和解码类型设置将管道初始化器加入到MyChatServer主函数中:创建自定义处理器MyChatServerHan...原创 2019-05-27 20:31:14 · 1271 阅读 · 1 评论 -
Netty的深入浅出--5.Netty读写检测(心跳检测)与长连接
为什么Netty要有读写检测(心跳检测)呢?按照我们之前项目来看Netty内部本身就有一个handlerRemoved方法而且我们之前的时候也完全可以检测到,当客服端退出应用程序之后,handlerRemoved就会被执行,移除掉相应的channel,但是实际中远远没有这么简单。例如:当手机客服端与服务端建立好长连接之后,但是手机突然开了飞行模式或者直接关机,这种情况下netty...原创 2019-05-27 21:17:38 · 1790 阅读 · 3 评论 -
Netty的深入浅出--6.WebSocket的使用
从前面几篇博客下来我们已经写了很三个项目了,你会发现netty编程也挺简单的,就是三步,第一步创建服务器Server(main函数),第二步就是管道初始化器ChnnelServerInitializer,使用netty本身的处理器或者自定义处理器,,第三步就是自定义处理器。基本上netty开发就是围绕着这三个步骤,但是如果你学技术永远停留在这个使用的基础上,那你怕是永远得不到提升。我后面的章节...原创 2019-05-27 23:49:00 · 1205 阅读 · 1 评论 -
Netty的深入浅出--7.ProtocalBuffers的分析
首先说一下一些相关定义RMI:remote method invocation 远程方法调用 只针对java简单来说,就是远程方法调用,计算机A调用计算机B中的类来使用,传输过程中以序列化的方式将信息以字节码的形式传递给另外一台电脑。而这台电脑通过反序列化获取到数据。序列化和反序列化也称为编码(encode)和解码(decode)。序列号将对象转换成字节,反序列化将字节转换成对象。...原创 2019-05-28 08:22:20 · 241 阅读 · 0 评论 -
Netty的深入浅出--8.ProtocalBuffers的简单实例
建议大家直接先去读官方文档。读完之后再来看下面实例会更有收获哦O(∩_∩)O添加一个protocol的插件:创建一个.proto文件指定protocol的语法:加快解析速度(默认是speed):定义java的包路径,可以和之前的不一样:定义java类的外部名(可以和文件名不一样):定义属性:required:必须被初始化的o...原创 2019-05-28 09:56:51 · 341 阅读 · 0 评论 -
Netty的深入浅出--9.netty与protocolbuffers的整合
创建.proto文件(对于包信息一定要一一对应):运行生成:创建TestServer,内容和netty之前的项目一样创建TestInitializer添加protocol的处理器(里面的ProtobufDecoder()需要添加一个参数):ProtobufDecoder()添加的参数,就是protocol传递的那个二进制数组,我们要转换的就是那个per...原创 2019-05-28 10:17:48 · 625 阅读 · 0 评论 -
Netty的深入浅出--10.接上一篇netty与protobuf整合的问题
上一章的问题:在处理器中new ProtobufDecoder()这个解码已经写死了,所以很难再进行一个其他参数类型的解码,也就是说,如果我在.proto的配置文件中再加一个message person2进去你会发现当这个类型进入到处理器之后,处理器只能识别一个,那这又该怎么处理呢?在官方提出了一种处理方式:自定义一个协议,假设当“ab”进来之后,它被认为是一种类型,当“bc”进来之后,它又...原创 2019-05-29 21:30:06 · 258 阅读 · 0 评论 -
Netty的深入浅出--11.Protobuf的闲谈
接着上面那个程序,我们已经基本上完成了netty与protobuf的整合使用,实现了从protobuf中读取数据,但是问题又来了,如果我们两台电脑要进行远程共用数据的话,怎么办?比如说计算机A通过使用protobuf来生成了类型X,现在计算机B要远程使用这个类型X,也就是说要实现实时的类型X同步,那我们应该怎么来解决呢?这里我们要使用的其中一个工具是git,想必这个大家基本上不在陌生,这里要讲...原创 2019-05-29 22:24:38 · 210 阅读 · 0 评论 -
Netty的深入浅出--12.Apache Thrift的了解
简单来说Thrift是一种可扩展的跨语言的服务器,功能基本上和protobuf是一样的,更好用,功能更加强大,不过相对来说比protobuf更难学。下载thrift,安装thrift的编译器(和protobuf差不多)这个实例就是以python作为客户端,来调用java的服务端,中间使用Thrift这个RPC来实现调用(这一章节讨论的那个东西到现在是不是尽在直尺了o(* ̄︶ ̄*)o...原创 2019-05-29 23:11:10 · 395 阅读 · 0 评论 -
Netty的深入浅出--13.Apache Thrift的简单项目实战
接着之前的项目上创建一个文件夹thrift,在str目录下与main文件夹平级:在idea中添加插件使用,它的插件相比来说比protobuf的插件要强大很多:创建文件data.thrift里面包含其中设置命令空间为java路径将thrift里面的数据类型定义成java类型,这样看起来比较舒服,而且使用起来也比较方便,现在对比发现相比之前那个protobuf来说好用多了o(...原创 2019-05-30 00:11:38 · 269 阅读 · 1 评论 -
Netty的深入浅出--14.Thrift的原理和架构解析
下面是Thrift的架构图your code就是我们写的代码FooService.Client就是我们下面调用返回的对象Foo.Write()/Read(),对于读出和写入在Thrift的框架下面已经帮我们写好了TProtocol,描述的是数据以怎样一种形式进行传递,TTransport底层的数据传输其中,TCompactProtocol相比TBinaryPro...原创 2019-05-30 08:07:22 · 382 阅读 · 0 评论 -
Netty的深入浅出--15.通过Thrift实现python和java之间的RPC调用
接上一个程序:加入python的命名空间生成python相关代码:生成的python代码:安装python相关的依赖创建python项目,以及加入Thrift生成的代码:客户端的代码:运行java服务端,python客户端这是一个很激动人心的时刻,实现了跨语言传输数据。不过这里有一个编码问题,之前我在python里面写的是中文,因为编码...原创 2019-05-30 08:37:00 · 1228 阅读 · 0 评论 -
Netty的深入浅出--16.gRPC框架详解
官方网址:https://www.grpc.io/简单来说gRPC底层数据传输使用的是protobuf的IDL进行传输的你可以定义一个方法以及这个方法的参数和返回类型,这种形式其实和我们之前将的thrift框架基本上是一样的对于service的定义和我们之前的thrift非常相似,下面两个message的定义和protobuf很相似...原创 2019-05-30 15:01:30 · 756 阅读 · 0 评论 -
Netty的深入浅出--17.gRPC实践
从github上下载gRPC进入了文件夹中:进入到example目录下:gradlew是gradle中的一个命令。后面我将会详细讲解:执行服务端:在另外一个窗口启动客户端运行结果:...原创 2019-05-30 15:26:56 · 257 阅读 · 0 评论 -
Netty的深入浅出--18.gradle中gradlew的使用
由于我们上一章遇到了gradlew这个指令,现在对gradlew进行一下讲解。对于上一章程序运行的时候,我们发现从程序开始到运行结束,gRPC一直都没有让我们现在安装gradle,而是在执行gradlew指令之后将环境直接部署好了。而且gradlew部署好之后,以后在执行相关程序的时候就不需要在下载安装。而且主要目的就是实现版本统一。...原创 2019-05-30 15:52:29 · 547 阅读 · 0 评论 -
Netty的深入浅出--19.gRPC和gradle的整合
接以前的项目创建proto文件(默认在src下面),然后根据官方文档加入.gradle的相关依赖创建Student.proto文件,定义传输的相关数据内容后来发现执行一直不能通过。发现gRPC指定的proto文件路径必须在main下面(除非你手动去修改):执行代码生成的文件:在这里讲解一下service方法,我个人感觉它是整个gRPC的核心所在;...原创 2019-05-30 20:53:30 · 645 阅读 · 0 评论 -
Netty的深入浅出--20.gRPC服务器流式调用实现
之前我们上一章实现了gRPC的数据传递的第一种形式;第一种形式:客户端向服务端发送请求,服务端返回给客户端响应第二种形式:客户端向服务端发送流式请求(stream),服务端向客户端返回响应第三种形式:客户端向服务端发送请求,服务端向客户端返回流式响应(stream)第四种形式:客户端向服务端发送流式请求(stream),服务端向客户端返回流式响应(stream)在gRPC...原创 2019-05-30 23:03:07 · 908 阅读 · 0 评论 -
Netty的深入浅出--21.gRPC双向流数据通信
继续上一章的内容,客户端请求是一个流对象,服务端响应一个集合客服端流式请求,服务端响应一个集合:具体方法分析:onNext():这里面和之前的方法有点不同,在之前onNext()是用来返回给客户端响应的数据,而在现在是客户端发送流式请求之后,onNext()方法是接收客户端发送过来的流式请求;每接收一个数据,它就会被调用一次。onError():返回错误信息;onComp...原创 2019-05-31 09:04:39 · 1639 阅读 · 0 评论 -
Netty的深入浅出--22.gRPC与gradle整合中的一些细节分析
这一章主要总结一下gRPC和gradle整合的总体思路。接上一个项目代码,在gradle中直接加入了相关自身的配置(这个和maven有点相似,也是在自己的配置文件中添加自己的插件)生成代码:一种方式是直接通过idea生成的命令执行另外一种方式是自己输入命令行生成的文件路径在java下面主要生成的是消息(message)相关的类而grpc下面生成的...原创 2019-05-31 17:48:46 · 382 阅读 · 0 评论 -
Netty的深入浅出--23.通过gRPC实现java与Node.js的调用
既然之前的Thrift都可以实现跨语言交互,那gRPC肯定也是没有问题的,接下来将会讲解java与Node.js的跨语言调用。创建node项目:引入node.js需要的依赖:将依赖下载下来:相关包引入成功:核心代码:运行服务端接收到信息:...原创 2019-05-31 18:04:41 · 507 阅读 · 0 评论 -
Netty的深入浅出--24.IO体系框架与装饰器模式
一.理解Java I/O系统对于程序语言设计者来说,设计一个令人满意的I/O(输入输出)系统,是件极艰巨的任务。相关的一些概念:流类:流:是java程序中完成输入/输出的载体,要进行数据传输的时候,将数据如字节、字符、数组放入到流中进行传输。输入输出:从功能上分为:输入流和输出流从流结构上可以分为:字节流和字符流。字符流的底层还是字节流的形式。节点...原创 2019-05-31 21:20:56 · 232 阅读 · 0 评论 -
Netty的深入浅出--25.NIO深入详解与体系分析
nio实例:NIO数据传输流程图IO与NIO的区别:编写第二个实例:编写第三个实例:源码中提到,对于buffer来说最重要的是三个属性:capacity、limit、positioncapacity:简单来说就是表示存储元素的容量,一定确定不能更改调用了.allocate(10),也就是说该buffer中只能存放10个元素l...原创 2019-06-01 08:50:57 · 248 阅读 · 0 评论 -
Netty的深入浅出--26.NIO流下的文件读写
编写main方法创建读取文件执行程序当我们注释掉clear之后:死循环,output.txt中一直在读数据进去,主要原因是没有了clear之后,在进行完write之后,position和limit指向同一个位置,但是input.txt已经没有数据可读,而由于没有clear,导致buffer中的position和limit 一样指向于后面,使得read判断buffe...原创 2019-06-01 09:14:38 · 1676 阅读 · 0 评论 -
Netty的深入浅出--27.NIO的buffer绝对操作、allocate 方法和只读buffer
之前几章的项目里面基本上使用的是相对操作,现在下面使用一些绝对操作:我相信你们看了我之前几篇博客之后,到这不能理解只有slice()方法。创建一个新的buffer,也就是我们通过绝对操作截取出来的那段判断上面这两个buffer是不是独立的运行:结果从2开始到5发生了变化,说明他们两个buffer共享内存。创建只读buffer:这里细讲一下all...原创 2019-06-01 10:21:35 · 500 阅读 · 0 评论 -
Netty的深入浅出--28.NIO中创建ByteBuffer的几种形式详解和零拷贝
我们之前讲个ByteBuffer本身只是一个抽象类,真正创建对象还是通过他的方法来创建的。其实一共只有三种方式allocate:创建一个堆字节缓冲区来保存数据;wrap:和前面allocate的区别在于,它是通过字节数组来创建的。也就是说你现在可以直接修改底层字节数组来改变值allocateDirect:查看allocateDirect源码:这里讲解一个题外话...原创 2019-06-01 21:30:39 · 737 阅读 · 0 评论 -
Netty的深入浅出--29.NIO中Scattering与Gatterring深度解析
上一章中讲解了byteBuffer创建的几种类型,现在我们继续深入讲一下directByteBuffer。我们可以看到directByteBuffer是继承于MapperByteBuffer这个父类看一下MapperByteBuffer中的源码描述定义的说了:直接字节缓存是一个内存映射范围的文件。简单来说就是,directByteBuffer是一个内存映射文件,在堆外内存中,由...原创 2019-06-02 09:32:52 · 410 阅读 · 2 评论 -
Netty的深入浅出--30.Selector源码深入分析
之前几章一直在讲解channel和buffer;总结来说就是:读:从channel中获取数据,将数据存储到buffer中,然后对数据进行操作;写:将数据写入到buffer中,然后通过channel获取buffer数据进行处理。接下来我们将讲解selector:首先讲解一下网络编程传统的网络编程服务器这边通过多个独立的线程与多个客户端建立连接,每个客户端对应一个线程。...原创 2019-06-02 18:41:45 · 589 阅读 · 0 评论 -
Netty的深入浅出--31.NIO网络编程实例剖析
创建项目:分析一下ServerSocketChannel从源码可以看出来它也是一个抽象类划重点:ServerSocketChannel是一种面向于流的监听性质的socket;它是通过调用open方法来创建的。有一个重要方法:一定要配置成一种非阻塞式的连接:获取一个socket对象:绑定端口:上面实现了绑定,接下来将要实现一...原创 2019-06-02 21:32:30 · 201 阅读 · 0 评论 -
Netty的深入浅出--32.NIO实现简单网络聊天程序(上)
在之前的项目里面,我们写了服务端,然后通过telnet和nc作为客户端进行连接,接下来我们将完整的写完服务端与客户端的代码,进行数据通信。想必大家都使用过IO写过简单了聊天程序,现在我们试着使用NIO来实现网络聊天。在之前的项目里面我们使用的是多个channel,建立了多个端口,这次我们采用一个通道channel(一个端口)进行网络通信。但是这个和传统的IO编程不同的是,NIO实现的网络通...原创 2019-06-03 12:39:22 · 277 阅读 · 0 评论 -
Netty的深入浅出--32.NIO实现简单网络聊天程序(下)
接上一个程序:Netty的深入浅出--32.NIO实现简单网络聊天程序(上)编写由服务端收到客户端发送过来的请求然后,又分发给其他已经连接好的客户端上面遍历获取发送客户端的 UUID的值:将请求信息发送给其他客户端:启动服务器,启动客户端:客户端:创建客户端NioClient和服务端差不多,不过客户端是通过socketchannel调用open()方法...原创 2019-06-04 08:40:59 · 204 阅读 · 0 评论 -
Netty的深入浅出--33.java字符集编码解码详解
对于字符集编码来说,很多人都不太理解,一直是一个老大难问题。下面这个例子采用的是NIO流形式读取文件,不是IO流哦下面先写一个例子,将一个文件拷贝到另外一个文件中:目的是将NioTest13_In.txt文件内容拷贝到NioTest13_Out.txt中获取文件权限:获取channel将input文件映射到ByteBuffer中接下来就是encode和...原创 2019-06-04 10:16:55 · 1720 阅读 · 0 评论 -
Netty的深入浅出--34.零拷贝深入剖析与内核空间切换方式
因为windows和Linux、Unix不同,下面所说的零拷贝以及内核空间切换方式都是基于linux和unix分析的:IO操作:但凡涉及到IO操作的,底层基本上都是读和写的过程;因此接下来将会基于读和写来分析;user space:用户空间kemel space:内核空间hardware:硬盘读:我们要从磁盘中将数据读取到内存里,首先java虚拟机会发出一个r...原创 2019-06-05 09:28:23 · 281 阅读 · 0 评论 -
Netty的深入浅出--35.零拷贝实例剖析
下面写两个程序一个基于IO的,一个基于NIO的。将两个进行对比看出优劣;对比方法:客户端不断的从磁盘中读取数据到服务端,服务端收到数据之后丢弃。最后对比两种方式所消耗的时间。IO操作:服务端:客户端:启动服务端:启动客户端:运行很多次之后,发现耗时基本上停留在400多毫秒NIO:服务端:这里设置了一个socket属性:我们查看...原创 2019-06-05 10:52:04 · 252 阅读 · 0 评论 -
Netty的深入浅出--36.再次深入零拷贝剖析
传统IO通信:当我们通过read() syscall进行系统调用的使用,会出现一次空间切换,从用户空间切换都了内核空间。紧接着就是从内核空间读取硬盘上的数据保存到内核缓存中。然后将从内核缓存中将数据拷贝到用户缓存中。这个时候又出现了空间切换,内核空间向用户空间切换。当代码逻辑结束之后,又该数据拷贝回内核空间,这里有进行一次空间切换。后面我就不分析了,总体来说,传统IO通信导致出现了多次的数据拷贝以...原创 2019-06-05 12:29:40 · 200 阅读 · 0 评论 -
Netty的深入浅出--37.Netty底层源码分析开始(EventLoopGroup的分析)
从这一章开始,我们将深入分析netty的底层源码。通过之前netty的经典例子一步步进行源码分析。为什么我们这里要使用两个循环线程组呢?第一个bossGroup的目的是为了接收客户端的连接。第二个workerGroup的目的对请求进行处理和响应的。简单来说eEventLoopGroup底层就是一个死循环查看EventLoopGroup的源码:可以看到它的父类是...原创 2019-06-06 08:55:42 · 359 阅读 · 2 评论 -
Netty的深入浅出--38.继续底层分析NioEventLoopGroup(线程工厂的设计原理)
再来回顾一下EventLoopGroup和NIOEventLoopGroup:EventLoopGroup继承于EventExecutorGroupNioEventLoopGroup继承于MultithreadEventLoopGroup,而MultithreadEventLoopGroup又继承了MultithreadEventExecutorGroup接上一章的分析...原创 2019-06-06 20:19:30 · 274 阅读 · 0 评论 -
Netty的深入浅出--39.ServerBootstrap初始化以及group方法分析
根据之前的分析,eventLoopGroup只是初始化了, 并没有启动,现在我们继续往下分析serverBootstrap:ServerBootstrap是bootstrap的子类(实际并不是这样的),通过serverBootstrap可以很简单的来启动ServerChannel:但是仔细看了一下Bootstrap这个类,发现这两类都继承于AbstractBootstrap,好...原创 2019-06-07 14:57:49 · 5203 阅读 · 1 评论