从零开始学netty——第一个netty程序

说在前面的事

本身学习用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分析入手

你们都知道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

telnet的使用

不少人学socket的时候都是本身写客户端,本身写服务端。因此大概介绍一下telnet的使用。oop

telnet ip port ctrl + ] 进入命令发消息模式 send hello 这样就会把hello发送出去学习

框架的使用

你们经过上面的介绍必定能够完成程序,而且能够收到telnet发送的结果,只是感受用了半天,其实啥也不知道,由于netty的事情我一句没说。这也是我最开始学习框架遇到的问题,心里实际上是不知足会用的层次的,总想知道原理,为何这么用,最后花掉了大部分的时间进去,结果是原理是不错了,但是框架自己用法上没有怎么感觉,因此如今我想你们的思惟能够换一换,更关注业务,先会用,再说为啥用。netty

相关文章
相关标签/搜索