第一章:开始
这一章教程,使用简单的例子让你快速了解Netty的架构。当你读完这一章,你可以在Netty基础之上,写一个客户端和服务端。
1. 开始之前
能运行这一章实例的最小要求有两个:①,JDK 1.5以上,②,Netty版本3.7(因为我是翻译的3.7版本的用户指南)。
当你确定了,你对这一章的内容中的类可能还有更多的问题。如果想知道更多关于这些类的消息,请查询API.
为了你的便利所有的类都会在在线API文档中有链接。另外如果在接触Netty过程中遇到某些疑问,请访问Netty社区让我们知道任何不正确,错误程序或者印刷。如果您有什么好的观点主意也可以链接我们。
2. 写一个Discard Server
世界上最简单的协议不是Hello World 是 DISCARD ,这个DISCARD协议接收数据,但是没有任何响应(response)
实现DISCARD 协议,你唯一要做的是忽略所有的接收到的数据,让我们直接实现handler接口,这些Netty为事件提供了handler I/O接口方法。
1 package org.jboss.netty.example.discard;
2
public class DiscardServerHandler extends SimpleChannelHandler {
4
@Override
6 public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
}
8
@Override
10 public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {
e.getCause().printStackTrace();
12
Channel ch = e.getChannel();
14 ch.close();
}
16 }
DiscardServerHandler 继承 SimpleChannelHandler ,他是一个 ChannelHandler 的实现类
SimpleChannelHandler 提供了各种 你可以重写的处理方法。目前,继承SimpleChannelHandler 是足够的,而不是实现自己实现接口。
我们重写 messageReceive 事件方法,这个方法被被一个MessageEvent事件触发调用,这个方法包含从客户端接受到的数据,在该例子中,我们忽视接受到的数据,并不对数据做任何处理。
exceptionCaught 事件方法,这个方法是当I/O错误,或者在处理过程中抛出异常的时候被调用。在大多数情况下,扑捉异常应该是停止的,并且他所关联的通道应该是关闭的。尽管这个方法的实现能被用到你想要处理不同的异常情景。例如,在关闭链接之前你想发送一个用一个错误码响应消息。
目前,挺好。我们已经把一个DISCARD服务的实现了一半。现在剩下的是写一个main方法用DiscardServerHandler来启动服务。
1 package org.jboss.netty.example.discard;
2
import java.net.InetSocketAddress;
4 import java.util.concurrent.Executors;
6 public class DiscardServer {
8 public static void main(String[] args) throws Exception {
ChannelFactory factory =
10 new NioServerSocketChannelFactory(
Executors.newCachedThreadPool(),
12 Executors.newCachedThreadPool());
14 ServerBootstrap bootstrap = new ServerBootstrap5(factory);
16 bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
public ChannelPipeline getPipeline() {
18 return Channels.pipeline(new DiscardServerHandler());
}
20 });
22 bootstrap.setOption("child.tcpNoDelay", true);
bootstrap.setOption("child.keepAlive", true);
24
bootstrap.bind(new InetSocketAddress(8080));
26 }
}
第一次翻译,不是很好。。