首页 > 代码库 > netty权威指南 ---------第三章 入门应用

netty权威指南 ---------第三章 入门应用

要实现的功能: client端发送请求,server端接受请求,返回当前时间,client端将当前时间打印出来。

A :server端服务器

package com.xiaobing.netty.third;


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;


public class TimeServer {

public void bind(int port) throws Exception{
//服务端接受客户端的连接线程
EventLoopGroup bossGroup = new NioEventLoopGroup();
//网络读写线程
EventLoopGroup workerGroup = new NioEventLoopGroup();
//服务端辅助启动类
ServerBootstrap b = new ServerBootstrap();
try {

b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 1024)
.childHandler(new ChildChannelHandler());
//阻塞等待端口绑定完成
ChannelFuture f = b.bind(port).sync();

//等待服务端链路关闭
f.channel().closeFuture().sync();
}finally{
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}


}

//网络IO处理类
private class ChildChannelHandler extends ChannelInitializer<SocketChannel>{


@Override
protected void initChannel(SocketChannel arg0) throws Exception {

arg0.pipeline().addLast(new TimeServerHandler());
}

}


public static void main(String[] args) throws Exception {

int port = 8080;
new TimeServer().bind(port);
}


}


B:server端 处理类


package com.xiaobing.netty.third;




import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
//对网络事件进行读写
public class TimeServerHandler extends ChannelHandlerAdapter {




@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception{
ByteBuf buf = (ByteBuf) msg;
//获取缓冲区可读字节数
byte[] req =  new byte[buf.readableBytes()];

buf.readBytes(req);
String body = new String(req,"UTF-8");

System.out.println("The time server receive order:" + body);

String currentTimeString  = "QUERY TIME ORDER".equalsIgnoreCase(body)?new java.util.Date(System.currentTimeMillis()).toString() :"BAD ORDER";

//应答消息
ByteBuf resp = Unpooled.copiedBuffer(currentTimeString.getBytes());

ctx.write(resp);
}

@Override
public void channelReadComplete(ChannelHandlerContext ctx){
//将消息发送队列的消息写入socketchannel中
ctx.flush();
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx,Throwable cause){
//发生异常时,关闭ctx
ctx.close();
}


}




C:客户端 请求


package com.xiaobing.netty.third;


import java.security.acl.Group;


import io.netty.bootstrap.Bootstrap;
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.NioSocketChannel;


public class TimeClient {

public void connect(int port , String host) throws Exception{
EventLoopGroup group = new NioEventLoopGroup();
try{
//客户端启动辅助类
Bootstrap b = new Bootstrap();

b.group(group).channel(NioSocketChannel.class)
.option(ChannelOption.TCP_NODELAY, true)
.handler(new ChannelInitializer<SocketChannel>() {
//在初始化时将channelHandler 设置到channelpipeline中
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new TimeClientHandler());
}

});
//发起异步连接
ChannelFuture f = b.connect(host,port).sync();
//等待客户端链路关闭
f.channel().closeFuture().sync();
}finally{

group.shutdownGracefully();

}

}


public static void main(String[] args) throws Exception {


int port = 8080;
new TimeClient().connect(port, "127.0.0.1");
}


}




D 客户端对server端返回值的处理


package com.xiaobing.netty.third;




import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
//对网络事件进行读写
public class TimeServerHandler extends ChannelHandlerAdapter {




@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception{
ByteBuf buf = (ByteBuf) msg;
//获取缓冲区可读字节数
byte[] req =  new byte[buf.readableBytes()];

buf.readBytes(req);
String body = new String(req,"UTF-8");

System.out.println("The time server receive order:" + body);

String currentTimeString  = "QUERY TIME ORDER".equalsIgnoreCase(body)?new java.util.Date(System.currentTimeMillis()).toString() :"BAD ORDER";

//应答消息
ByteBuf resp = Unpooled.copiedBuffer(currentTimeString.getBytes());

ctx.write(resp);
}

@Override
public void channelReadComplete(ChannelHandlerContext ctx){
//将消息发送队列的消息写入socketchannel中
ctx.flush();
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx,Throwable cause){
//发生异常时,关闭ctx
ctx.close();
}


}



netty权威指南 ---------第三章 入门应用