网络编程 -- RPC实现原理 -- 目录

  啦啦啦

V2——Netty --

  new LengthFieldPrepender(2) : 设置数据包 2 字节的特征码

  new LengthFieldBasedFrameDecoder(65535, 0, 2, 0, 2) :  65535 :数据包长度、0:分隔符偏移值、2:分隔符长度、0:数据包偏移值、2:数据包长度。

  Class : Server

  1. package lime.pri.limeNio.netty.netty04;
  2.  
  3. import java.net.InetSocketAddress;
  4. import java.text.SimpleDateFormat;
  5. import java.util.Calendar;
  6. import java.util.Date;
  7. import java.util.List;
  8.  
  9. import com.alibaba.fastjson.JSON;
  10. import com.alibaba.fastjson.serializer.SerializerFeature;
  11.  
  12. import io.netty.bootstrap.ServerBootstrap;
  13. import io.netty.buffer.ByteBuf;
  14. import io.netty.buffer.Unpooled;
  15. import io.netty.channel.ChannelFuture;
  16. import io.netty.channel.ChannelFutureListener;
  17. import io.netty.channel.ChannelHandlerAdapter;
  18. import io.netty.channel.ChannelHandlerContext;
  19. import io.netty.channel.ChannelInitializer;
  20. import io.netty.channel.ChannelPipeline;
  21. import io.netty.channel.EventLoopGroup;
  22. import io.netty.channel.nio.NioEventLoopGroup;
  23. import io.netty.channel.socket.SocketChannel;
  24. import io.netty.channel.socket.nio.NioServerSocketChannel;
  25. import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
  26. import io.netty.handler.codec.LengthFieldPrepender;
  27. import io.netty.handler.codec.MessageToMessageCodec;
  28. import io.netty.util.CharsetUtil;
  29. import lime.pri.limeNio.netty.netty03.entity.User;
  30.  
  31. public class Server {
  32.  
  33. public static void main(String[] args) throws Exception {
  34. ServerBootstrap serverBootstrap = new ServerBootstrap();
  35. EventLoopGroup boss = new NioEventLoopGroup();
  36. EventLoopGroup worker = new NioEventLoopGroup();
  37. serverBootstrap.group(boss, worker);
  38. serverBootstrap.channel(NioServerSocketChannel.class);
  39. serverBootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
  40.  
  41. @Override
  42. protected void initChannel(SocketChannel ch) throws Exception {
  43. ChannelPipeline pipeline = ch.pipeline();
  44. pipeline.addLast(new LengthFieldPrepender(2))
  45. .addLast(new LengthFieldBasedFrameDecoder(65535, 0, 2, 0, 2))
  46. .addLast(new MessageToMessageCodec<ByteBuf, Object>() {
  47. @Override
  48. protected void encode(ChannelHandlerContext ctx, Object msg, List<Object> out)
  49. throws Exception {
  50. out.add(Unpooled.buffer().writeBytes(JSON.toJSONString(msg,SerializerFeature.WriteClassName).getBytes(CharsetUtil.UTF_8)));
  51. }
  52.  
  53. @Override
  54. protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out)
  55. throws Exception {
  56. out.add(JSON.parse(msg.toString(CharsetUtil.UTF_8)));
  57. }
  58. }).addLast(new ChannelHandlerAdapter() {
  59.  
  60. @Override
  61. public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
  62. System.out.println("客户端(" + ctx.channel().remoteAddress() + ") 请求数据:" + msg);
  63. ChannelFuture channelFuture = null;
  64.  
  65. String request = (String) msg;
  66. Calendar calendar = Calendar.getInstance();
  67. if("Query Date".equalsIgnoreCase(request)){
  68. for (int i = 1; i < 10; i++) {
  69. calendar.set(Calendar.DAY_OF_MONTH, i);
  70. channelFuture = ctx.writeAndFlush("当前系统时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime()));
  71. }
  72. }else if("Query User".equalsIgnoreCase(request)){
  73. for (int i = 1; i < 10; i++) {
  74. channelFuture = ctx.writeAndFlush(new User(i,"lime_" + i,new Date()));
  75. }
  76. }else{
  77. channelFuture = ctx.writeAndFlush("请求参数不正确");
  78. }
  79.  
  80. channelFuture.addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE);
  81. channelFuture.addListener(ChannelFutureListener.CLOSE_ON_FAILURE);
  82. channelFuture.addListener(ChannelFutureListener.CLOSE);
  83. }
  84.  
  85. @Override
  86. public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
  87. System.out.println(cause);
  88. }
  89.  
  90. });
  91. }
  92.  
  93. });
  94. ChannelFuture channelFuture = serverBootstrap.bind(new InetSocketAddress(9999)).sync();
  95. channelFuture.channel().closeFuture().sync();
  96. boss.close();
  97. worker.close();
  98. }
  99. }

  Class : Client

  1. package lime.pri.limeNio.netty.netty04;
  2.  
  3. import java.net.InetSocketAddress;
  4. import java.util.List;
  5.  
  6. import com.alibaba.fastjson.JSON;
  7. import com.alibaba.fastjson.serializer.SerializerFeature;
  8.  
  9. import io.netty.bootstrap.Bootstrap;
  10. import io.netty.buffer.ByteBuf;
  11. import io.netty.buffer.Unpooled;
  12. import io.netty.channel.ChannelFuture;
  13. import io.netty.channel.ChannelHandlerAdapter;
  14. import io.netty.channel.ChannelHandlerContext;
  15. import io.netty.channel.ChannelInitializer;
  16. import io.netty.channel.ChannelPipeline;
  17. import io.netty.channel.EventLoopGroup;
  18. import io.netty.channel.nio.NioEventLoopGroup;
  19. import io.netty.channel.socket.SocketChannel;
  20. import io.netty.channel.socket.nio.NioSocketChannel;
  21. import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
  22. import io.netty.handler.codec.LengthFieldPrepender;
  23. import io.netty.handler.codec.MessageToMessageCodec;
  24. import io.netty.util.CharsetUtil;
  25.  
  26. public class Client {
  27.  
  28. public static void main(String[] args) throws Exception {
  29. for (int i = 0; i < 1; i++) {
  30. new Thread() {
  31. {
  32. setDaemon(false);
  33. }
  34.  
  35. public void run() {
  36. try {
  37. client();
  38. } catch (Exception e) {
  39. e.printStackTrace();
  40. }
  41. };
  42. }.start();
  43. }
  44. }
  45.  
  46. private static void client() throws Exception {
  47. Bootstrap bootstrap = new Bootstrap();
  48. EventLoopGroup worker = new NioEventLoopGroup();
  49. bootstrap.group(worker);
  50. bootstrap.channel(NioSocketChannel.class);
  51. bootstrap.handler(new ChannelInitializer<SocketChannel>() {
  52.  
  53. @Override
  54. protected void initChannel(SocketChannel ch) throws Exception {
  55. ChannelPipeline pipeline = ch.pipeline();
  56. pipeline.addLast(new LengthFieldPrepender(2))
  57. .addLast(new LengthFieldBasedFrameDecoder(65535, 0, 2, 0, 2))
  58. .addLast(new MessageToMessageCodec<ByteBuf, Object>() {
  59. @Override
  60. protected void encode(ChannelHandlerContext ctx, Object msg, List<Object> out)
  61. throws Exception {
  62. out.add(Unpooled.buffer().writeBytes(JSON.toJSONString(msg,SerializerFeature.WriteClassName).getBytes(CharsetUtil.UTF_8)));
  63. }
  64.  
  65. @Override
  66. protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out)
  67. throws Exception {
  68. out.add(JSON.parse(msg.toString(CharsetUtil.UTF_8)));
  69. }
  70. }).addLast(new ChannelHandlerAdapter() {
  71.  
  72. /**
  73. * 默认只捕获网络连接异常
  74. */
  75. @Override
  76. public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
  77. System.out.println(cause);
  78. }
  79.  
  80. /**
  81. * 客户端发送经过JSON编码的byteBuf
  82. */
  83. @Override
  84. public void channelActive(ChannelHandlerContext ctx) throws Exception {
  85. String request = null;
  86. switch (0) {
  87. case 0:
  88. request = "Query Date";
  89. break;
  90. case 1:
  91. request = "Query User";
  92. break;
  93. default:
  94. request = "Query What?";
  95. break;
  96. }
  97. ctx.writeAndFlush(request);
  98. }
  99.  
  100. @Override
  101. public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
  102. System.out.println("当前线程:" + Thread.currentThread() + " 服务端响应数据 --> " + msg);
  103. }
  104.  
  105. });
  106. }
  107. });
  108. ChannelFuture channelFuture;
  109.  
  110. channelFuture = bootstrap.connect(new InetSocketAddress(9999)).sync();
  111. channelFuture.channel().closeFuture().sync();
  112. worker.close();
  113. }
  114. }

  Console: Server

  1. 客户端(/192.168.229.1:6280) 请求数据:Query Date

  Console : Client

  1. 当前线程:Thread[nioEventLoopGroup-0-1,10,main] 服务端响应数据 --> 当前系统时间:2017-06-01 21:42:08
  2. 当前线程:Thread[nioEventLoopGroup-0-1,10,main] 服务端响应数据 --> 当前系统时间:2017-06-02 21:42:08
  3. 当前线程:Thread[nioEventLoopGroup-0-1,10,main] 服务端响应数据 --> 当前系统时间:2017-06-03 21:42:08
  4. 当前线程:Thread[nioEventLoopGroup-0-1,10,main] 服务端响应数据 --> 当前系统时间:2017-06-04 21:42:08
  5. 当前线程:Thread[nioEventLoopGroup-0-1,10,main] 服务端响应数据 --> 当前系统时间:2017-06-05 21:42:08
  6. 当前线程:Thread[nioEventLoopGroup-0-1,10,main] 服务端响应数据 --> 当前系统时间:2017-06-06 21:42:08
  7. 当前线程:Thread[nioEventLoopGroup-0-1,10,main] 服务端响应数据 --> 当前系统时间:2017-06-07 21:42:08
  8. 当前线程:Thread[nioEventLoopGroup-0-1,10,main] 服务端响应数据 --> 当前系统时间:2017-06-08 21:42:08
  9. 当前线程:Thread[nioEventLoopGroup-0-1,10,main] 服务端响应数据 --> 当前系统时间:2017-06-09 21:42:08

啦啦啦

网络编程 -- RPC实现原理 -- Netty -- 迭代版本V4 -- 粘包拆包的更多相关文章

  1. 网络编程 -- RPC实现原理 -- Netty -- 迭代版本V1 -- 入门应用

    网络编程 -- RPC实现原理 -- 目录 啦啦啦 V1——Netty入门应用 Class : NIOServerBootStrap package lime.pri.limeNio.netty.ne ...

  2. 网络编程 -- RPC实现原理 -- Netty -- 迭代版本V2 -- 对象传输

    网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2——Netty -- 使用序列化和反序列化在网络上传输对象:需要实现 java.io.Serializable 接口 只能传输( ByteBuf ...

  3. 网络编程 -- RPC实现原理 -- Netty -- 迭代版本V3 -- 编码解码

    网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2——Netty -- pipeline.addLast(io.netty.handler.codec.MessageToMessageCodec ...

  4. 网络编程 -- RPC实现原理 -- 目录

    -- 啦啦啦 -- 网络编程 -- RPC实现原理 -- NIO单线程 网络编程 -- RPC实现原理 -- NIO多线程 -- 迭代版本V1 网络编程 -- RPC实现原理 -- NIO多线程 -- ...

  5. 网络编程 -- RPC实现原理 -- RPC -- 迭代版本V1 -- 本地方法调用

    网络编程 -- RPC实现原理 -- 目录 啦啦啦 V1——RPC -- 本地方法调用:不通过网络 入门 1. RPCObjectProxy rpcObjectProxy = new RPCObjec ...

  6. 网络编程 -- RPC实现原理 -- RPC -- 迭代版本V2 -- 本地方法调用 整合 Spring

    网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2——RPC -- 本地方法调用 + Spring 1. 配置applicationContext.xml文件 注入 bean 及 管理 bean ...

  7. 网络编程 -- RPC实现原理 -- RPC -- 迭代版本V3 -- 远程方法调用 整合 Spring

    网络编程 -- RPC实现原理 -- 目录 啦啦啦 V3——RPC -- 远程方法调用 及 null的传输 + Spring 服务提供商: 1. 配置 rpc03_server.xml 注入 服务提供 ...

  8. 网络编程 -- RPC实现原理 -- RPC -- 迭代版本V4 -- 远程方法调用 整合 Spring 自动注册

    网络编程 -- RPC实现原理 -- 目录 啦啦啦 V4——RPC -- 远程方法调用 + Spring 自动注册 服务提供商: 1. 配置 rpc04_server.xml 注入 服务提供商 rpc ...

  9. 网络编程 -- RPC实现原理 -- NIO多线程 -- 迭代版本V1

    网络编程 -- RPC实现原理 -- 目录 啦啦啦 V1——设置标识变量selectionKey.attach(true);只处理一次(会一直循环遍历selectionKeys,占用CPU资源). ( ...

随机推荐

  1. Windows平台交叉编译Arm Linux平台的QT5.7库

    1.准备交叉编译环境 环境说明:Windows 7 64位 此过程需要: (1)Qt库开源代码,我使用的是5.7.0版本: (2)Perl语言环境5.12版本以上: (3)Python语言环境 2.7 ...

  2. pycharm如何设置python版本、设置国内pip镜像、添加第三方类库

    直接上图(mac环境): 一.设置项目的python版本 File->Default Settings ... 在弹出的界面上(参考下图),左上角的下拉框里,选择python解释器的版本即可(建 ...

  3. Opencv中Mat矩阵相乘——点乘、dot、mul运算详解

    Opencv中Mat矩阵相乘——点乘.dot.mul运算详解 2016年09月02日 00:00:36 -牧野- 阅读数:59593 标签: Opencv矩阵相乘点乘dotmul 更多 个人分类: O ...

  4. Chromium OS 初体验

    Chromium OS可是早有耳闻,但是一直没有尝试,最近很多评论甚至认为会对Windows和Mac都能够造成压力,于是迫不及待的想尝试一下了,百度下了官网,官网很贴心,不光给了用于写入U盘的镜像文件 ...

  5. iOS:针对固定数据源,更好的封装cell

    一.介绍 在iOS开发中,tableView非常常用,能将其展示出来,它的数据源必不可少.当然数据源有动态下发的,有固定写死的,这里我只探讨固定写死的情况.对于死数据,我们在项目中经常遇到的场景就是我 ...

  6. 动态规划之 <筷子>

    描述 A 先生有很多双筷子.确切的说应该是很多根,因为筷子的长度不一,很难判断出哪两根是一双的.这天,A 先生家里来了K 个客人,A 先生留下他们吃晚饭.加上A 先生,A夫人和他们的孩子小A,共K+3 ...

  7. C# Chart使用总结 1 ---------关于图表数据的来源

    关于图表数据的来源: 1.通过XValueMember YValueMembers 设置 OleDbConnection conn = new OleDbConnection(connStr); Ol ...

  8. MySQL SELECT 执行的具体步骤

    1:SELECT 执行的顺序 8SELECT 9DISTINCT <select_list> 1FROM <left_table> 3JOIN <right_table& ...

  9. 最新整合maven+SSM+Tomcat 实现注册登录

    mybatis学习 http://www.mybatis.org/mybatis-3/zh/index.html Spring学习:http://blog.csdn.net/king1425/arti ...

  10. Microsoft/Git-Credential-Manager-for-Mac-and-Linux

    纠正Mac上的错误: Fatal: java.lang.Error encountered. Details: unexpected errorfatal: credential helper '!/ ...