Netty 是一个网络应用框架,可以用来写高性能的服务器和客户端。个人感觉是对传输层协议(TCP/UDP)的一种封装,或者说是对JAVA中的OIO、NIO、AIO的封装。当然远不只这些只是我了解的还比较少。我搞Netty的目的就是学习JAVA网络编程,搞完底层搞框架,搞完框架再搞底层,最后的目标是设计一个简单的应用层协议。本人学生一枚,对Netty纯属个人爱好,文中要是有不对的地方还请各位大神多多指教。
一、如何学习Netty
关于Netty的资料网上并不多,不过努力找会发现很多不错的,下面这个链接是编程大巴上 One Coder 大神写的一套Netty教程:
http://www.it165.net/pro/html/201207/3142.html
他用的是Netty3.6。
另外的话就是官网的User Guide了,我用的是Netty4.0,官网指南的地址是:
http://netty.io/4.0/guide/
至于Netty3.6的话,那就是:
http://netty.io/3.6/guide/
关于Netty3 和 Netty4的比较在这里:
http://www.oschina.net/translate/netty-4-0-new-and-noteworthy
我的英语并不好,不瞒大家,我的四级分数是(425) 但是我坚信学技术不用考听力,不用写完型,而且没有监考老师。所以我有勇气通过孜孜不倦的努力啃完坑爹的官网文档,加油吧,共勉!如果大家有更好的学习方法欢迎指导:)
二、学习路线
由于对Netty是从零学起,所以对原理了解的不多,因此我打算先通过学习基础的Demo然后慢慢总结原理。
实践-->理论-->实践
-------------------------------------
因此这套学习笔记分为:
实验篇-->基础篇-->实战篇
大致就是这样,因此在实验篇中不会过多纠结于实现原理
三、入门之Discard Server
网络世界的最简单的协议 应该是Discard了,服务器端会忽略客户端发送的一切数据,并且不会给客户端任何响应,也就是说把你屏蔽了、根本不理你,你给的东西全扔了,一句话也没有。。。(可能我说的不标准)
在Netty文档中有给出如何实现Discard Server了:
1.实现Discard协议
这个协议要做的事情就是忽略所有接收到的数据,并且不作出任何响应。先上代码:
import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundByteHandlerAdapter; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; class DiscardServerHanlder extends ChannelInboundByteHandlerAdapter { @Override public void inboundBufferUpdated(ChannelHandlerContext ctx, ByteBuf in) throws Exception { //(1) in.clear(); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { cause.printStackTrace(); ctx.close(); } } public class DiscardServer { public static void main(String[] args) throws Exception { Thread.currentThread().setName("Discard Server"); ServerBootstrap b = new ServerBootstrap(); try { b.group(new NioEventLoopGroup(), new NioEventLoopGroup()) .channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG, 100) .localAddress(8080)//绑定本地端口 .childOption(ChannelOption.TCP_NODELAY, true) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new DiscardServerHanlder()); } }); ChannelFuture f = b.bind().sync(); f.channel().closeFuture().sync(); } finally { b.shutdown(); } } }
这样一个简单的DiscardServer就可以用了,我们用nc工具测试一下,关于nc的介绍请看这里:
http://www.oschina.net/p/netcat
这是@小编辑 写的介绍:
http://www.oschina.net/question/5189_79323
从上面的程序中知道 DiscardServer 绑定了本地的8080端口,那么我们使用nc进行测试如下:
连接到DiscardServer后我们 发送了一句 "hello kugou" 。服务器端没有任何回复和输出(不贴图了)。
我们可以稍加改造服务器端的DiscardServerHandler 使他可以把客户端发送的数据输出到控制台:
我们可以在代码(1)处添加如下代码,用来输出BytBuf中的数据:
while(in.readable()){ System.out.print((char)in.readByte()); System.out.flush(); }
这样就可以把客户端发送的数据输出到控制台上了。如下图:
至此,一个DicardServer客户端就算写完了,下一篇我们会在本篇基础上实现一个EchoServer。