// 业务逻辑处理
package com.bigdata.jboss.basic;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelHandler;
public class DiscardServerHandler extends SimpleChannelHandler {
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
throws Exception {
// do nothing
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e)
throws Exception {
e.getCause().printStackTrace();
e.getChannel().close();
}
}
1.DiscardServerHandler 继承 SimpleChannelHandler,提供了事件处理的不同方法。
2.messageReceived 事件处理方法中的参数MessageEvent,携带了客户端传送过来的参数,在这个例子中,我们实现的 是 DISCARD协议,处理方法是把传送过来的信息丢弃。
3.exceptionCaught事件处理方法带了ExceptionEvent参数,ExceptionEvent携带了异常信息及连接信息,根据你的业 务 逻辑进行处理,如本例中,输出异常信息及关闭连接。当然,你也可以在关闭连接前,给客户端返回错误编码。
//服务器代码
package com.bigdata.jboss.basic;
import java.net.InetSocketAddress;
import java.util.concurrent.Executors;
import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.channel.ChannelFactory;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
public class DiscardServer {
public static void main(String[] args) {
ChannelFactory factory = new NioServerSocketChannelFactory(Executors.newCachedThreadPool(),Executors.newCachedThreadPool());
ServerBootstrap bootstrap = new ServerBootstrap(factory);
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
public ChannelPipeline getPipeline() throws Exception {
return Channels.pipeline(new DiscardServerHandler());
}
});
bootstrap.setOption("child.tcpNoDelay",true);
bootstrap.setOption("child.keepAlive", true);
bootstrap.bind(new InetSocketAddress(8080));
System.out.println("started discard server");
}
}
1. ChannelFactory是创建并管理Channel的工厂,它处理所有I/O请求,及生成I/O ChannelEvent事件。它不创建I/O 线程,它是从构造参数(线程池)中获得线程。
2.ServerBootstrap是一个帮助类,帮助建立服务。
3.ChannelPipelineFactory是生成新的连接工厂。
4.可以给Channel设置参数,如tcpNoDelay,keepAlive,参数需要前缀"child."。
5.绑定端口8080
测试
telnet localhost 8080
结果:
服务端无输出
为了测试,可以在逻辑处理部分修正如下代码:
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
ChannelBuffer buf = (ChannelBuffer) e.getMessage();
while(buf.readable()) {
System.out.print((char) buf.readByte());
System.out.flush();
}
}
1.ChannelBuffer代表了传输的数据结构。