编写一个discard服务器程序
<span style="font-family:Microsoft YaHei;font-size:14px;"><span style="font-family:Microsoft YaHei;">import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelHandlerAdapter;
/**
</span></span>
<span style="font-family:Microsoft YaHei;font-size:14px;"><span style="font-family:Microsoft YaHei;"> * 处理一个服务器通道
*/
public class DiscardServerHandler extends ChannelHandlerAdapter { // (1)
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) { // (2)
// 直接调用release来释放接收到的数据
((ByteBuf) msg).release(); // (3)
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { // (4)
// 当异常发生时,关闭处理器
cause.printStackTrace();
ctx.close();
}
}</span></span>
1.DiscardServerHandler继承了ChannelHandlerAdapter类,这个类是ChannelHandler的一个实现类。其中ChannelHandler提供了各类事件的处理器方法方便我们来覆盖。但是,现在继承ChannelHandlerAdapter类比实现ChannelHandler更方便。<span style="font-family:Microsoft YaHei;font-size:14px;"><span style="font-family:Microsoft YaHei;">@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
try {
// Do something with msg
} finally {
ReferenceCountUtil.release(msg);
}
}
</span></span>
4.exceptionCaught()事件处理器方法主要适用于一个异常发生的时候,这个异常可能是在netty中被一个io错误引起或者一个<span style="font-family:Microsoft YaHei;font-size:14px;">package com.zzj.nio.netty;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
/**
* 抛弃消息服务端
* @author zzj
* @date Oct 19, 2016 1:24:05 PM
*/
public class DiscardServer {
/**端口号**/
private int port;
/**
* 构造函数
* @param port
*/
public DiscardServer(int port){
this.port = port;
}
public static void main(String[] args) {
int port = 9999;
try {
//开启服务端接受消息
new DiscardServer(port).run();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 开启服务器
* @author zzj
* @throws InterruptedException
*/
public void run() throws InterruptedException{
EventLoopGroup bossGroup = new NioEventLoopGroup();//(1)
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap bootstrap = new ServerBootstrap();//(2)
bootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)//(3)
.childHandler(new ChannelInitializer<SocketChannel>() {//(4)
@Override
protected void initChannel(SocketChannel channel) throws Exception {
channel.pipeline().addLast(new DiscardServerHandler());
}
});
bootstrap.option(ChannelOption.SO_BACKLOG, 128)//(5)
.childOption(ChannelOption.SO_KEEPALIVE, true);//(6)
//紧接着,绑定并且开始接受请求的连接
ChannelFuture future = bootstrap.bind(port).sync();
//等待直到服务器socket被关闭,在这里例子中,这个不会发生,但是你可以这样写
future.channel().closeFuture().sync();
}finally{
//优雅的关闭
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
}
</span>
1.NioEventLoopGroup是一个用户处理io操作的多线程event loop.Netty对于不同种类的传输提供了多种EventLoopGroup实现方式。在这个例也许你想通过增加一些处理类比如DiscardServerHandle来配置一个新的Channel或者其对应的ChannelPipeline来实现你的网络程序。随着应用程序
如果,想要在服务器中打印出客户端输入的消息,那么可以使用一下代码:
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
ByteBuf in = (ByteBuf) msg;
try {
while (in.isReadable()) { // (1)
System.out.print((char) in.readByte());
System.out.flush();
}
} finally {
ReferenceCountUtil.release(msg); // (2)
}
}