Netty学习笔记 (实验篇)一

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。

你可能感兴趣的:(netty,DiscardServer)