TimeServer.java

  1. package netty.timeserver.server;
  2.  
  3. import io.netty.bootstrap.ServerBootstrap;
  4. import io.netty.channel.ChannelFuture;
  5. import io.netty.channel.ChannelInitializer;
  6. import io.netty.channel.ChannelOption;
  7. import io.netty.channel.EventLoopGroup;
  8. import io.netty.channel.nio.NioEventLoopGroup;
  9. import io.netty.channel.socket.SocketChannel;
  10. import io.netty.channel.socket.nio.NioServerSocketChannel;
  11.  
  12. public class TimeServer {
  13.  
  14. public void bind(int port) throws Exception {
  15. EventLoopGroup bossGroup = new NioEventLoopGroup();
  16. EventLoopGroup workerGroup = new NioEventLoopGroup();
  17. try {
  18. // 配置服务器的NIO线程租
  19. ServerBootstrap b = new ServerBootstrap();
  20. b.group(bossGroup, workerGroup)
  21. .channel(NioServerSocketChannel.class)
  22. .option(ChannelOption.SO_BACKLOG, 1024)
  23. .childHandler(new ChildChannelHandler());
  24.  
  25. // 绑定端口,同步等待成功
  26. ChannelFuture f = b.bind(port).sync();
  27. // 等待服务端监听端口关闭
  28. f.channel().closeFuture().sync();
  29. } finally {
  30. // 优雅退出,释放线程池资源
  31. bossGroup.shutdownGracefully();
  32. workerGroup.shutdownGracefully();
  33. }
  34. }
  35.  
  36. private class ChildChannelHandler extends ChannelInitializer<SocketChannel> {
  37. @Override
  38. protected void initChannel(SocketChannel arg0) throws Exception {
  39. System.out.println("server initChannel..");
  40. arg0.pipeline().addLast(new TimeServerHandler());
  41. }
  42. }
  43.  
  44. public static void main(String[] args) throws Exception {
  45. int port = 9000;
  46. if (args != null && args.length > 0) {
  47. try {
  48. port = Integer.valueOf(args[0]);
  49. } catch (NumberFormatException e) {
  50.  
  51. }
  52. }
  53.  
  54. new TimeServer().bind(port);
  55. }
  56. }

TimeServerHandler.java

  1. package netty.timeserver.server;
  2.  
  3. import java.util.Date;
  4.  
  5. import io.netty.buffer.ByteBuf;
  6. import io.netty.buffer.Unpooled;
  7. import io.netty.channel.ChannelHandlerContext;
  8. import io.netty.channel.ChannelInboundHandlerAdapter;
  9.  
  10. public class TimeServerHandler extends ChannelInboundHandlerAdapter {
  11.  
  12. @Override
  13. public void channelRead(ChannelHandlerContext ctx, Object msg)
  14. throws Exception {
  15. System.out.println("server channelRead..");
  16. ByteBuf buf = (ByteBuf) msg;
  17. byte[] req = new byte[buf.readableBytes()];
  18. buf.readBytes(req);
  19. String body = new String(req, "UTF-8");
  20. System.out.println("The time server receive order:" + body);
  21. String currentTime = "QUERY TIME ORDER".equalsIgnoreCase(body) ? new Date(
  22. System.currentTimeMillis()).toString() : "BAD ORDER";
  23. ByteBuf resp = Unpooled.copiedBuffer(currentTime.getBytes());
  24. ctx.write(resp);
  25. }
  26.  
  27. @Override
  28. public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
  29. System.out.println("server channelReadComplete..");
  30. ctx.flush();//刷新后才将数据发出到SocketChannel
  31. }
  32.  
  33. @Override
  34. public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
  35. throws Exception {
  36. System.out.println("server exceptionCaught..");
  37. ctx.close();
  38. }
  39.  
  40. }

TimeClient.java

  1. package netty.timeserver.client;
  2.  
  3. import io.netty.bootstrap.Bootstrap;
  4. import io.netty.channel.ChannelFuture;
  5. import io.netty.channel.ChannelInitializer;
  6. import io.netty.channel.ChannelOption;
  7. import io.netty.channel.EventLoopGroup;
  8. import io.netty.channel.nio.NioEventLoopGroup;
  9. import io.netty.channel.socket.SocketChannel;
  10. import io.netty.channel.socket.nio.NioSocketChannel;
  11.  
  12. public class TimeClient {
  13.  
  14. public void connect(int port, String host) throws Exception {
  15. // 配置客户端NIO线程组
  16. EventLoopGroup group = new NioEventLoopGroup();
  17. try {
  18. Bootstrap b = new Bootstrap();
  19. b.group(group).channel(NioSocketChannel.class)
  20. .option(ChannelOption.TCP_NODELAY, true)
  21. .handler(new ChannelInitializer<SocketChannel>() {
  22. @Override
  23. protected void initChannel(SocketChannel arg0)
  24. throws Exception {
  25. System.out.println("client initChannel..");
  26. arg0.pipeline().addLast(new TimeClientHandler());
  27. }
  28. });
  29. // 发起异步连接操作
  30. ChannelFuture f = b.connect(host, port).sync();
  31. // 等待客户端链路关闭
  32. f.channel().closeFuture().sync();
  33. } finally {
  34. // 优雅退出,释放NIO线程组
  35. group.shutdownGracefully();
  36. }
  37. }
  38.  
  39. public static void main(String[] args) throws Exception {
  40. int port = 9000;
  41. if (args != null && args.length > 0) {
  42. try {
  43. port = Integer.parseInt(args[0]);
  44. } catch (Exception e) {
  45. }
  46. }
  47. new TimeClient().connect(port, "127.0.0.1");
  48. }
  49. }

TimeClientHandler.java

  1. package netty.timeserver.client;
  2.  
  3. import java.util.logging.Logger;
  4.  
  5. import io.netty.buffer.ByteBuf;
  6. import io.netty.buffer.Unpooled;
  7. import io.netty.channel.ChannelHandlerContext;
  8. import io.netty.channel.ChannelInboundHandlerAdapter;
  9.  
  10. public class TimeClientHandler extends ChannelInboundHandlerAdapter {
  11.  
  12. private static final Logger logger = Logger
  13. .getLogger(TimeClientHandler.class.getName());
  14.  
  15. private final ByteBuf firstMessage;
  16.  
  17. public TimeClientHandler() {
  18. byte[] req = "QUERY TIME ORDER".getBytes();
  19. firstMessage = Unpooled.buffer(req.length);
  20. firstMessage.writeBytes(req);
  21. }
  22.  
  23. @Override
  24. public void channelActive(ChannelHandlerContext ctx) throws Exception {
  25. //与服务端建立连接后
  26. System.out.println("client channelActive..");
  27. ctx.writeAndFlush(firstMessage);
  28. }
  29.  
  30. @Override
  31. public void channelRead(ChannelHandlerContext ctx, Object msg)
  32. throws Exception {
  33. System.out.println("client channelRead..");
  34. //服务端返回消息后
  35. ByteBuf buf = (ByteBuf) msg;
  36. byte[] req = new byte[buf.readableBytes()];
  37. buf.readBytes(req);
  38. String body = new String(req, "UTF-8");
  39. System.out.println("Now is :" + body);
  40. }
  41.  
  42. @Override
  43. public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
  44. throws Exception {
  45. System.out.println("client exceptionCaught..");
  46. // 释放资源
  47. logger.warning("Unexpected exception from downstream:"
  48. + cause.getMessage());
  49. ctx.close();
  50. }
  51.  
  52. }

netty入门实例的更多相关文章

  1. Netty入门实例及分析

    什么是netty?以下是官方文档的简单介绍: The Netty project  is an effort to provide an asynchronous event-driven netwo ...

  2. netty入门(一)

    1. netty入门(一) 1.1. 传统socket编程 在任何时候都可能有大量的线程处于休眠状态,只是等待输入或者输出数据就绪,这可能算是一种资源浪费. 需要为每个线程的调用栈都分配内存,其默认值 ...

  3. Netty入门(一)之webSocket聊天室

    一:简介 Netty 是一个提供 asynchronous event-driven (异步事件驱动)的网络应用框架,是一个用以快速开发高性能.高可靠性协议的服务器和客户端. 换句话说,Netty 是 ...

  4. Netty入门二:开发第一个Netty应用程序

    Netty入门二:开发第一个Netty应用程序 时间 2014-05-07 18:25:43  CSDN博客 原文  http://blog.csdn.net/suifeng3051/article/ ...

  5. Java网络编程 -- Netty入门

    Netty简介 Netty是一个高性能,高可扩展性的异步事件驱动的网络应用程序框架,它极大的简化了TCP和UDP客户端和服务器端网络开发.它是一个NIO框架,对Java NIO进行了良好的封装.作为一 ...

  6. Netty入门与实战教程总结分享

    前言:都说Netty是Java程序员必须要掌握的一项技能,带着不止要知其然还要知其所以然的目的,在慕课上找了一个学习Netty源码的教程,看了几章后着实有点懵逼.虽然用过Netty,并且在自己的个人网 ...

  7. Java IO学习笔记八:Netty入门

    作者:Grey 原文地址:Java IO学习笔记八:Netty入门 多路复用多线程方式还是有点麻烦,Netty帮我们做了封装,大大简化了编码的复杂度,接下来熟悉一下netty的基本使用. Netty+ ...

  8. Netty入门(三):EventLoop

    前言 Netty系列索引: 1.Netty入门(一):ByteBuf 2.Netty入门(二):Channel IO相关: 1.Java基础(一):I/O多路复用模型及Linux中的应用 上文提到,早 ...

  9. Netty入门(二):Channel

    前言 Netty系列索引: 1.Netty入门(一):ByteBuf 2.Netty入门(二):Channel 在Netty框架中,Channel是其中之一的核心概念,是Netty网络通信的主体,由它 ...

随机推荐

  1. CUDA学习笔记(二)【转】

    来源:http://luofl1992.is-programmer.com/posts/38847.html 编程语言的特点是要实践,实践多了才有经验.很多东西书本上讲得不慎清楚,不妨自己用代码实现一 ...

  2. ViewPager动态加载、删除页面

    很多人在网上说ViewPager的PagerAdapter.notifyDataSetChanged()无效.刚开始我也这样认为,甚至被误导以为是真理.   后来,找了一下,在PagerAdatpar ...

  3. python datetime

    不管何时何地,只要我们编程时遇到了跟时间有关的问题,都要想到 datetime 和 time 标准库模块,今天我们就用它内部的方法,详解python操作日期和时间的方法.1.将字符串的时间转换为时间戳 ...

  4. OCR文字设别软件没有权限管理服务器上的许可证怎么办

    在使用ABBYY产品,无论是ABBYY FineReader 12,还是ABBYY PDF Transformer+的时候,当你启动许可管理器时,可能会出现"您没有权限管理许可服务器(服务器 ...

  5. 清除PDF里的元数据和机密信息的方法

    相信很多人都知道,PDF文档的表现形式可以大不相同,它们可能包含某些数据,乍一看根本看不见,那些数据可能是不适合共享的信息-比如元数据(作者.主题.关键词).书签.扫描文档里的文本层等,通过ABBYY ...

  6. 使用架构(XSD)验证XML文件

    假使说XML是一个数据库,那么XSD就是这个数据库的结构.由此可见,XSD是如此重要,如果没有它,我们如何声明以及验证我们需要的XML数据文件的格式和合法性呢?那是不可能完成的任务,如果你将XML数据 ...

  7. MySQL之选择字段数据类型

    MySQL支持的数据类型很多,选择正确的数据类型对于 获得高性能至关重要.在选择时有个简单的原则有助于做出更好的选择. 简单的原则: A.通常最小的是最好的 因为这样可以用更少的磁盘.内容.CPU缓存 ...

  8. eclipse svn subclipse下载地址

    http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240 Eclipse 3.x Subclipse release ...

  9. ChinaUnix上的帮助手册还不错!

    无意中发现ChinaUnix上的Linux帮助手册还真不错啊,有时间多看一看: http://man.chinaunix.net/linux/debian/debian_learning/index. ...

  10. nova分析(2)—— nova-all

    nova-all是一个用来启动所有nova服务的辅助脚本,注意只是启动所有服务,不包括停止和重启等功能. nova-all的入口在 nova.cmd.all:main ,脚本也比较简单,这儿就贴下代码 ...