书籍推荐:
实例代码 : http://download.youkuaiyun.com/detail/jiangtao_st/7677503
- Server端代码
<span style="font-size:12px;">/** * * <p> * Netty Server Simple * </p> * * LineBasedFrameDecoder + 消息中得换行符 * * @author 卓轩 * @创建时间:2014年7月7日 * @version: V1.0 */ public class NettyServer { private final int port = 8989; @Test public void nettyServer(){ EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(bossGroup,workerGroup) .channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG, 1024) .childHandler(new ChildChannelHandler()); //绑定端口、同步等待 ChannelFuture futrue = serverBootstrap.bind(port).sync(); //等待服务监听端口关闭 futrue.channel().closeFuture().sync(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ //退出,释放线程等相关资源 bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } private class ChildChannelHandler extends ChannelInitializer<SocketChannel>{ @Override protected void initChannel(SocketChannel ch) throws Exception { //ch.pipeline().addLast(new LineBasedFrameDecoder(1024)); // // ByteBuf delimiter = Unpooled.copiedBuffer("$_".getBytes()); // ch.pipeline().addLast(new DelimiterBasedFrameDecoder(2048, delimiter)); // //ch.pipeline().addLast(new FixedLengthFrameDecoder(20)); ch.pipeline().addLast(new ObjectDecoder(1024*1024,ClassResolvers.weakCachingConcurrentResolver(this.getClass().getClassLoader()))); ch.pipeline().addLast(new ObjectEncoder()); ch.pipeline().addLast(new StringDecoder()); ch.pipeline().addLast(new UserRespServerHandler()); } } }</span>
- Client端代码
<span style="font-size:12px;">/** * * <p> * NettyClient 实现 * </p> * * @author 卓轩 * @创建时间:2014年7月7日 * @version: V1.0 */ public class NettyClient { public void connect(int port,String host){ EventLoopGroup group = new NioEventLoopGroup(); try { Bootstrap bootstrap = new Bootstrap(); bootstrap.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) .handler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new ObjectDecoder(1024,ClassResolvers.weakCachingConcurrentResolver(this.getClass().getClassLoader()))); ch.pipeline().addLast(new ObjectEncoder()); ch.pipeline().addLast(new StringDecoder()); ch.pipeline().addLast(new UserQueryClientHandler()); } }); //发起异步链接操作 ChannelFuture channelFuture = bootstrap.connect(host, port).sync(); channelFuture.channel().closeFuture().sync(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ //关闭,释放线程资源 group.shutdownGracefully(); } } @Test public void nettyClient(){ new NettyClient().connect(8989, "localhost"); } }</span>
- ServerHander 代码
<span style="font-size:12px;">/** * * <p> * 用户查询返回 * </p> * * @author 卓轩 * @创建时间:2014年7月7日 * @version: V1.0 */ public class UserRespServerHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { UserQuery userQuery = (UserQuery) msg; System.out.println("收到来自客户端的查询请求:"+ String.valueOf(userQuery)); if(userQuery != null && userQuery.getUserId()!= 0){ UserDO userDO = getUserById(userQuery.getUserId()); ctx.writeAndFlush(userDO); } } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { System.out.println("Server has Exception,"+ cause.getCause()); } private UserDO getUserById(int userId){ if(userId % 2 == 0){ UserDO zhuoxuan = new UserDO(); zhuoxuan.setUserId(userId); zhuoxuan.setSex(1); zhuoxuan.setUname("卓轩"); zhuoxuan.setUnick("zhuoxuan"); zhuoxuan.setEmail("zhuoxuan@mogujie.com"); return zhuoxuan; }else{ UserDO zhuoxuan = new UserDO(); zhuoxuan.setUserId(userId); zhuoxuan.setSex(1); zhuoxuan.setUname("张三"); zhuoxuan.setUnick("zhangsan"); zhuoxuan.setEmail("zhuoxuan@mogujie.com"); return zhuoxuan; } } }</span><strong style="font-size: 14px;"> </strong>
- ClientHander 代码
<span style="font-size:12px;">/**
*
* <p>
* 用户查询请求 Handler
* </p>
*
* @author 卓轩
* @创建时间:2014年7月7日
* @version: V1.0
*/
public class UserQueryClientHandler extends ChannelInboundHandlerAdapter {
public UserQueryClientHandler() {
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
for (int i = 0; i < 100; i++) {
UserQuery userQuery = new UserQuery();
userQuery.setUserId(1001+i);
ctx.write(userQuery);
}
ctx.flush();
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
String message = String.valueOf(msg);
System.out.println("Netty-Client:Receive Message,"+ message);
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
ctx.flush();
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
System.out.println("Client has Exception,"+ cause.getCause());
}
}</span>