Netty(一) 简单入门

来源:互联网 发布:php 截断上传 编辑:程序博客网 时间:2024/05/29 15:58
环境:netty-all-5.0.0.Alpha1.jar

坚持一下,把源码看完,勤奋一点,不要在懒惰了,你已经落下别人很多了

本文主要介绍Netty的简单入门


一、环境搭建

创建一个maven project,

修改pom.xml文件加载netty的jar 包

<dependency>    <groupId>io.netty</groupId>    <artifactId>netty-all</artifactId> <!-- Use 'netty-all' for 4.0 or above -->    <version>5.0.0.Alpha1</version>    <scope>compile</scope> </dependency>


二、编写客户端代码

package netty;import io.netty.bootstrap.Bootstrap;import io.netty.buffer.ByteBuf;import io.netty.buffer.Unpooled;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelHandlerAdapter;import io.netty.channel.ChannelHandlerContext;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;import java.io.UnsupportedEncodingException;import java.util.logging.Logger;public class TimeClient {public void connect(int port,String host){//配置客户端NIO线程组EventLoopGroup group=new NioEventLoopGroup();Bootstrap b=new Bootstrap();b.group(group).channel(NioSocketChannel.class).option(ChannelOption.TCP_NODELAY, true).handler(new ChannelInitializer<SocketChannel>() {protected void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(new TimeClientHandler());};});ChannelFuture f;try {f = b.connect(host, port).sync();//发起异步链接操作f.channel().closeFuture().sync();//等待客户端链路关闭} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{group.shutdownGracefully();//优雅关闭,释放NIO线程组}}public static void main(String[] args) {new TimeClient().connect(8080, "127.0.0.1");}static class TimeClientHandler extends ChannelHandlerAdapter{private static final Logger logger=Logger.getLogger(TimeClientHandler.class.getName());private int counter;private final ByteBuf firstMessage;private byte[] req;public TimeClientHandler() {// TODO Auto-generated constructor stubreq=("Query time order"+System.getProperty("line.separator")).getBytes();firstMessage=Unpooled.buffer(req.length);firstMessage.writeBytes(req);}//客户端与服务端链接建立,Netty的nio县城会调用channelActive方法,发送请求public void channelActive(ChannelHandlerContext ctx){ByteBuf message=null;for(int i=0;i<100;i++){message=Unpooled.buffer(req.length);message.writeBytes(req);ctx.writeAndFlush(message);}}//测试TCP 粘包拆包public void channelActive1(ChannelHandlerContext ctx){ByteBuf message=null;for(int i=0;i<100;i++){message=Unpooled.buffer(req.length);message.writeBytes(req);ctx.writeAndFlush(message);}}//当服务端返回response的时候,会调用channelRead方法public void channelRead(ChannelHandlerContext ctx ,Object msg){ByteBuf buf=(ByteBuf) msg;byte[]req=new byte[buf.readableBytes()];buf.readBytes(req);String body;try {body = new String(req,"UTF-8");System.out.println("Now is : "+body+" ; the counter is : "+ ++counter);} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void exceptionCaught(ChannelHandlerContext ctx,Throwable cause){ctx.close();}}}


三、编写服务端代码

package netty;import io.netty.bootstrap.ServerBootstrap;import io.netty.buffer.ByteBuf;import io.netty.buffer.Unpooled;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelHandlerAdapter;import io.netty.channel.ChannelHandlerContext;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;import java.io.UnsupportedEncodingException;import java.util.Date;public class TimeServer {public static void main(String[] args) {// TODO Auto-generated method stubtry {new TimeServer().bind(8080);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void bind(int port)throws Exception{EventLoopGroup bossGroup=new NioEventLoopGroup();EventLoopGroup workerGroup =new NioEventLoopGroup();ServerBootstrap b=new ServerBootstrap();b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).option(ChannelOption.SO_BACKLOG,1024).childHandler(new ChildChannelHandler());ChannelFuture f=b.bind("127.0.0.1",port).sync();f.channel().closeFuture().sync();}private class ChildChannelHandler extends ChannelInitializer<SocketChannel>{@Overrideprotected void initChannel(SocketChannel arg0) throws Exception {// TODO Auto-generated method stubarg0.pipeline().addLast(new TimeServerHandler());}}static class TimeServerHandler extends ChannelHandlerAdapter{private  int  counter;public void channelRead(ChannelHandlerContext ctx,Object msg){ByteBuf buf=(ByteBuf) msg;byte[]req=new byte[buf.readableBytes()];buf.readBytes(req);try {String body=new String(req,"UTF-8");System.out.println("the time server receive order : "+body+" ; the counter is : "+ ++counter);String currentTime="Query time order".equalsIgnoreCase(body)?new Date(System.currentTimeMillis()).toString():"BAD ORDER";ByteBuf resp=Unpooled.copiedBuffer(currentTime.getBytes());ctx.write(resp);} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//测试public void channelRead2(ChannelHandlerContext ctx,Object msg){ByteBuf buf=(ByteBuf) msg;byte[]req=new byte[buf.readableBytes()];buf.readBytes(req);try {String body=new String(req,"UTF-8");System.out.println("the time server receive order : "+body+" ; the counter is : "+ ++counter);String currentTime="Query time order".equalsIgnoreCase(body)?new Date(System.currentTimeMillis()).toString():"BAD ORDER";ByteBuf resp=Unpooled.copiedBuffer(currentTime.getBytes());ctx.write(resp);} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void channelReadComplete(ChannelHandlerContext ctx){ctx.flush();}public void exceptionCaught(ChannelHandlerContext ctx,Throwable cause){ctx.close();}}}



原创粉丝点击