搭建简单的Netty开发环境

今天准备学学声明显赫的Netty框架,自然要先学会怎么搭建一个简单的Netty开发环境啦。话不多说,下面进入正文。

编辑器方面自然是推荐IntelJ idea了,idea的强大不必多说,百度一下你就知道。哈哈

下面就是准备Netty的jar包了,如果你会maven的话自然是使用maven最为方便了。只需要在pom文件中导入以下几行

 
  1. <!-- https://mvnrepository.com/artifact/io.netty/netty-all -->

  2. <dependency>

  3. <groupId>io.netty</groupId>

  4. <artifactId>netty-all</artifactId>

  5. <version>4.1.16.Final</version>

  6. </dependency>

 

当然啦,不会maven的也不用愁,可以在官网直接下载jar包,点击跳转。并在编辑器中将下载的jar包引入你的lib中,就可以愉快的开始Netty开发了

下面贴一个简单的netty案例

一、 服务端代码

1. EchoServerHandler.java

 
  1. import io.netty.buffer.ByteBuf;

  2. import io.netty.buffer.Unpooled;

  3. import io.netty.channel.ChannelFutureListener;

  4. import io.netty.channel.ChannelHandler.Sharable;

  5. import io.netty.channel.ChannelHandlerContext;

  6. import io.netty.channel.ChannelInboundHandlerAdapter;

  7. import io.netty.util.CharsetUtil;

  8.  
  9. @Sharable

  10. public class EchoServerHandler extends ChannelInboundHandlerAdapter{

  11. @Override

  12. public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

  13. //将客户端传入的消息转换为Netty的ByteBuf类型

  14. ByteBuf in = (ByteBuf) msg;

  15.  
  16. // 在控制台打印传入的消息

  17. System.out.println(

  18. "Server received: " + in.toString(CharsetUtil.UTF_8)

  19. );

  20. //将接收到的消息写给发送者,而不冲刷出站消息

  21. ctx.write(in);

  22. }

  23.  
  24. @Override

  25. public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {

  26. // 将未处决消息冲刷到远程节点, 并且关闭该Channel

  27. ctx.writeAndFlush(Unpooled.EMPTY_BUFFER)

  28. .addListener(ChannelFutureListener.CLOSE);

  29. }

  30.  
  31. /**

  32. * 异常处理

  33. * @param ctx

  34. * @param cause

  35. * @throws Exception

  36. */

  37. @Override

  38. public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {

  39. //打印异常栈跟踪

  40. cause.printStackTrace();

  41.  
  42. // 关闭该Channel

  43. ctx.close();

  44. }

  45. }

2. EchoServer.java

 
  1. import io.netty.bootstrap.ServerBootstrap;

  2. import io.netty.channel.ChannelFuture;

  3. import io.netty.channel.ChannelInitializer;

  4. import io.netty.channel.EventLoopGroup;

  5. import io.netty.channel.nio.NioEventLoopGroup;

  6. import io.netty.channel.socket.SocketChannel;

  7. import io.netty.channel.socket.nio.NioServerSocketChannel;

  8.  
  9. import java.net.InetSocketAddress;

  10.  
  11. public class EchoServer {

  12. private final static int port = 8080;

  13.  
  14. public static void main(String[] args) {

  15. start();

  16. }

  17.  
  18. private static void start() {

  19. final EchoServerHandler serverHandler = new EchoServerHandler();

  20. // 创建EventLoopGroup

  21. EventLoopGroup bossGroup = new NioEventLoopGroup();

  22. EventLoopGroup workerGroup = new NioEventLoopGroup();

  23. // 创建EventLoopGroup

  24. ServerBootstrap b = new ServerBootstrap();

  25. b.group(bossGroup, workerGroup)

  26. //指定所使用的NIO传输Channel

  27. .channel(NioServerSocketChannel.class)

  28. //使用指定的端口设置套接字地址

  29. .localAddress(new InetSocketAddress(port))

  30. // 添加一个EchoServerHandler到Channle的ChannelPipeline

  31. .childHandler(new ChannelInitializer<SocketChannel>() {

  32. @Override

  33. protected void initChannel(SocketChannel socketChannel) throws Exception {

  34. //EchoServerHandler被标注为@shareable,所以我们可以总是使用同样的案例

  35. socketChannel.pipeline().addLast(serverHandler);

  36. }

  37. });

  38.  
  39. try {

  40. // 异步地绑定服务器;调用sync方法阻塞等待直到绑定完成

  41. ChannelFuture f = b.bind().sync();

  42. // 获取Channel的CloseFuture,并且阻塞当前线程直到它完成

  43. f.channel().closeFuture().sync();

  44. } catch (InterruptedException e) {

  45. e.printStackTrace();

  46. } finally {

  47. // 优雅的关闭EventLoopGroup,释放所有的资源

  48. bossGroup.shutdownGracefully();

  49. workerGroup.shutdownGracefully();

  50. }

  51. }

  52. }


 

二、 客户端代码

1. EchoClientHandler.java

 
  1. import io.netty.buffer.ByteBuf;

  2. import io.netty.buffer.Unpooled;

  3. import io.netty.channel.ChannelHandler.Sharable;

  4. import io.netty.channel.ChannelHandlerContext;

  5. import io.netty.channel.SimpleChannelInboundHandler;

  6. import io.netty.util.CharsetUtil;

  7.  
  8. @Sharable

  9. public class EchoClientHandler extends SimpleChannelInboundHandler<ByteBuf> {

  10. @Override

  11. public void channelActive(ChannelHandlerContext ctx) throws Exception {

  12. //当被通知Channel是活跃的时候,发送一条消息

  13. ctx.writeAndFlush(Unpooled.copiedBuffer("Netty rocks!", CharsetUtil.UTF_8));

  14. }

  15.  
  16. @Override

  17. protected void channelRead0(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf) throws Exception {

  18. System.out.println(

  19. "Client received: " + byteBuf.toString(CharsetUtil.UTF_8)

  20. );

  21. }

  22.  
  23. @Override

  24. public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {

  25. cause.printStackTrace();

  26. ctx.close();

  27. }

  28. }

 

2. EchoClient.java

 
  1. import io.netty.bootstrap.Bootstrap;

  2. import io.netty.channel.ChannelFuture;

  3. import io.netty.channel.ChannelInitializer;

  4. import io.netty.channel.EventLoopGroup;

  5. import io.netty.channel.nio.NioEventLoopGroup;

  6. import io.netty.channel.socket.SocketChannel;

  7. import io.netty.channel.socket.nio.NioSocketChannel;

  8.  
  9. import java.net.InetSocketAddress;

  10.  
  11. public class EchoClient {

  12. private final static String HOST = "localhost";

  13. private final static int PORT = 8080;

  14.  
  15. public static void start() {

  16. EventLoopGroup group = new NioEventLoopGroup();

  17. Bootstrap bootstrap = new Bootstrap();

  18. bootstrap.group(group)

  19. .channel(NioSocketChannel.class)

  20. .remoteAddress(new InetSocketAddress(HOST, PORT))

  21. .handler(new ChannelInitializer<SocketChannel>() {

  22. @Override

  23. protected void initChannel(SocketChannel socketChannel) throws Exception {

  24. socketChannel.pipeline().addLast(new EchoClientHandler());

  25. }

  26. });

  27. try {

  28. ChannelFuture f = bootstrap.connect().sync();

  29. f.channel().closeFuture().sync();

  30. } catch (InterruptedException e) {

  31. e.printStackTrace();

  32. }finally {

  33. group.shutdownGracefully();

  34. }

  35. }

  36.  
  37. public static void main(String[] args) {

  38. start();

  39. }

  40. }

先后运行EchoServer.java和EchoClient.java.如果控制台分别打印了

Server received: Netty rocks!

Client received: Netty rocks!

那么恭喜你,你已经可以开始netty的开发了。

转载于:https://my.oschina.net/zpf2016/blog/1939093

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值