本身学习用netty以前有不少的疑惑,这里先把本身的疑惑与答案写出来,但愿能够帮到有一样疑惑的朋友。java
问题:netty版本的选择,3,4,5。
答案:3和4的改动挺大,可是4和5的不大,如今官方给的版本是4,原本是有5的,结果下架了,可是能够在不少maven库中找到5。全部人都但愿本身所学的内容生命周期长点,并不想刚学完就会废弃掉。我推荐的版本是4。跟着官方走。
问题:netty的书的选择
答案:我看了几本,最后认为《netty权威指南》不错,他的知识点比较全面,可能入手去读得有必定的基础,不然在读IO模型的时候不少人就糊涂了。这本书是基于5讲的,我仍是推荐,主要4和5变更不大。变更的部分仍是能够接受的。
问题:学netty必定要会用java IO ,NIO吗
答案:netty做为一个框架,就是屏蔽这些复杂操做的,因此是不须要特别精通java的部分,并且netty提供了本身的包装类。若是是入手学习这个框架,我认为是能够不用的,可是基本的socket编程基础是须要的。主要是会必定socket基础,能够有一个良好的逻辑思惟,要不你都不知道框架是干啥的。后面想继续阅读源码,那就须要把这些知识都补充起来。 问题:netty的优点编程
你们都知道socket传输和语言无关,和机器无关(固然,大端机器和小端机器读取的结果不同须要特殊处理一下,可是全部机器均可以接收)。因此咱们的程序不写客户端,用系统自带的telnet来作客户端访问。咱们只写服务端。框架
写过socket程序都知道,服务端的socket是有几个通用操做的,例如accept,read,write。咱们此次也主要围绕这几个来对比的看。socket
public void bind(int port) { EventLoopGroup boss = new NioEventLoopGroup(); EventLoopGroup worker = new NioEventLoopGroup(); try { ServerBootstrap server = new ServerBootstrap(); server.group(boss, worker).channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<Channel>() { @Override protected void initChannel(Channel ch) throws Exception { ch.pipeline().addLast(new MessageHandler()); } }); ChannelFuture sync = server.bind(port).sync(); sync.channel().closeFuture().sync(); } catch (InterruptedException e) { e.printStackTrace(); } finally { boss.shutdownGracefully(); worker.shutdownGracefully(); } }
上面这段代码为何要这么写,建议你们先不考虑这个问题,就先这么写。做为一个server端的编写,咱们主要在意的是端口。不管什么框架,什么模型,socket的主要都是port,惟一咱们须要写的业务就是MessageHandlermaven
public class MessageHandler extends ChannelInboundHandlerAdapter{ @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { ByteBuf buf =(ByteBuf)msg; int readableBytes = buf.readableBytes(); byte[] bytes =new byte[readableBytes]; buf.readBytes(bytes); System.out.println(new String(bytes)); } @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { System.out.println("connection"); } }
这里我从新了两个方法,一个是channelRead,一个是channelActive。很明显的对应我上面说的accpet和read。这里不少人问为何msg必定是用byte来接收呢。这个其实和协议有关,不过我建议你们先想一想普通socket编程你获取的不是inputstream和outputstream吗,他们自己就是处理字节流的。因此这里也是同样的。处理字节流。ide
不少人学socket的时候都是本身写客户端,本身写服务端。因此大概介绍一下telnet的使用。oop
telnet ip port ctrl + ] 进入命令发消息模式 send hello 这样就会把hello发送出去学习
你们经过上面的介绍必定能够完成程序,而且能够收到telnet发送的结果,只是感受用了半天,其实啥也不知道,由于netty的事情我一句没说。这也是我最开始学习框架遇到的问题,心里实际上是不知足会用的层次的,总想知道原理,为何这么用,最后花掉了大部分的时间进去,结果是原理是不错了,但是框架自己用法上没有怎么感觉,因此如今我想你们的思惟能够换一换,更关注业务,先会用,再说为啥用。netty