实例代码 : http://download.csdn.net/detail/jiangtao_st/7677503
<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><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><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>
<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>Netty实战-对象编解码,Netty对象网络传递,布布扣,bubuko.com
原文地址:http://blog.csdn.net/jiangtao_st/article/details/38118085