网络编程 -- RPC实现原理 -- Netty -- 迭代版本V4 -- 粘包拆包
啦啦啦
V2——Netty --
new LengthFieldPrepender(2) : 设置数据包 2 字节的特征码
new LengthFieldBasedFrameDecoder(65535, 0, 2, 0, 2) : 65535 :数据包长度、0:分隔符偏移值、2:分隔符长度、0:数据包偏移值、2:数据包长度。
Class : Server
- package lime.pri.limeNio.netty.netty04;
- import java.net.InetSocketAddress;
- import java.text.SimpleDateFormat;
- import java.util.Calendar;
- import java.util.Date;
- import java.util.List;
- import com.alibaba.fastjson.JSON;
- import com.alibaba.fastjson.serializer.SerializerFeature;
- import io.netty.bootstrap.ServerBootstrap;
- import io.netty.buffer.ByteBuf;
- import io.netty.buffer.Unpooled;
- import io.netty.channel.ChannelFuture;
- import io.netty.channel.ChannelFutureListener;
- import io.netty.channel.ChannelHandlerAdapter;
- import io.netty.channel.ChannelHandlerContext;
- import io.netty.channel.ChannelInitializer;
- import io.netty.channel.ChannelPipeline;
- 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 io.netty.handler.codec.LengthFieldBasedFrameDecoder;
- import io.netty.handler.codec.LengthFieldPrepender;
- import io.netty.handler.codec.MessageToMessageCodec;
- import io.netty.util.CharsetUtil;
- import lime.pri.limeNio.netty.netty03.entity.User;
- public class Server {
- public static void main(String[] args) throws Exception {
- ServerBootstrap serverBootstrap = new ServerBootstrap();
- EventLoopGroup boss = new NioEventLoopGroup();
- EventLoopGroup worker = new NioEventLoopGroup();
- serverBootstrap.group(boss, worker);
- serverBootstrap.channel(NioServerSocketChannel.class);
- serverBootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- ChannelPipeline pipeline = ch.pipeline();
- pipeline.addLast(new LengthFieldPrepender(2))
- .addLast(new LengthFieldBasedFrameDecoder(65535, 0, 2, 0, 2))
- .addLast(new MessageToMessageCodec<ByteBuf, Object>() {
- @Override
- protected void encode(ChannelHandlerContext ctx, Object msg, List<Object> out)
- throws Exception {
- out.add(Unpooled.buffer().writeBytes(JSON.toJSONString(msg,SerializerFeature.WriteClassName).getBytes(CharsetUtil.UTF_8)));
- }
- @Override
- protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out)
- throws Exception {
- out.add(JSON.parse(msg.toString(CharsetUtil.UTF_8)));
- }
- }).addLast(new ChannelHandlerAdapter() {
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- System.out.println("客户端(" + ctx.channel().remoteAddress() + ") 请求数据:" + msg);
- ChannelFuture channelFuture = null;
- String request = (String) msg;
- Calendar calendar = Calendar.getInstance();
- if("Query Date".equalsIgnoreCase(request)){
- for (int i = 1; i < 10; i++) {
- calendar.set(Calendar.DAY_OF_MONTH, i);
- channelFuture = ctx.writeAndFlush("当前系统时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime()));
- }
- }else if("Query User".equalsIgnoreCase(request)){
- for (int i = 1; i < 10; i++) {
- channelFuture = ctx.writeAndFlush(new User(i,"lime_" + i,new Date()));
- }
- }else{
- channelFuture = ctx.writeAndFlush("请求参数不正确");
- }
- channelFuture.addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE);
- channelFuture.addListener(ChannelFutureListener.CLOSE_ON_FAILURE);
- channelFuture.addListener(ChannelFutureListener.CLOSE);
- }
- @Override
- public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
- System.out.println(cause);
- }
- });
- }
- });
- ChannelFuture channelFuture = serverBootstrap.bind(new InetSocketAddress(9999)).sync();
- channelFuture.channel().closeFuture().sync();
- boss.close();
- worker.close();
- }
- }
Class : Client
- package lime.pri.limeNio.netty.netty04;
- import java.net.InetSocketAddress;
- import java.util.List;
- import com.alibaba.fastjson.JSON;
- import com.alibaba.fastjson.serializer.SerializerFeature;
- 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.ChannelPipeline;
- 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 io.netty.handler.codec.LengthFieldBasedFrameDecoder;
- import io.netty.handler.codec.LengthFieldPrepender;
- import io.netty.handler.codec.MessageToMessageCodec;
- import io.netty.util.CharsetUtil;
- public class Client {
- public static void main(String[] args) throws Exception {
- for (int i = 0; i < 1; i++) {
- new Thread() {
- {
- setDaemon(false);
- }
- public void run() {
- try {
- client();
- } catch (Exception e) {
- e.printStackTrace();
- }
- };
- }.start();
- }
- }
- private static void client() throws Exception {
- Bootstrap bootstrap = new Bootstrap();
- EventLoopGroup worker = new NioEventLoopGroup();
- bootstrap.group(worker);
- bootstrap.channel(NioSocketChannel.class);
- bootstrap.handler(new ChannelInitializer<SocketChannel>() {
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- ChannelPipeline pipeline = ch.pipeline();
- pipeline.addLast(new LengthFieldPrepender(2))
- .addLast(new LengthFieldBasedFrameDecoder(65535, 0, 2, 0, 2))
- .addLast(new MessageToMessageCodec<ByteBuf, Object>() {
- @Override
- protected void encode(ChannelHandlerContext ctx, Object msg, List<Object> out)
- throws Exception {
- out.add(Unpooled.buffer().writeBytes(JSON.toJSONString(msg,SerializerFeature.WriteClassName).getBytes(CharsetUtil.UTF_8)));
- }
- @Override
- protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out)
- throws Exception {
- out.add(JSON.parse(msg.toString(CharsetUtil.UTF_8)));
- }
- }).addLast(new ChannelHandlerAdapter() {
- /**
- * 默认只捕获网络连接异常
- */
- @Override
- public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
- System.out.println(cause);
- }
- /**
- * 客户端发送经过JSON编码的byteBuf
- */
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- String request = null;
- switch (0) {
- case 0:
- request = "Query Date";
- break;
- case 1:
- request = "Query User";
- break;
- default:
- request = "Query What?";
- break;
- }
- ctx.writeAndFlush(request);
- }
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- System.out.println("当前线程:" + Thread.currentThread() + " 服务端响应数据 --> " + msg);
- }
- });
- }
- });
- ChannelFuture channelFuture;
- channelFuture = bootstrap.connect(new InetSocketAddress(9999)).sync();
- channelFuture.channel().closeFuture().sync();
- worker.close();
- }
- }
Console: Server
- 客户端(/192.168.229.1:6280) 请求数据:Query Date
Console : Client
- 当前线程:Thread[nioEventLoopGroup-0-1,10,main] 服务端响应数据 --> 当前系统时间:2017-06-01 21:42:08
- 当前线程:Thread[nioEventLoopGroup-0-1,10,main] 服务端响应数据 --> 当前系统时间:2017-06-02 21:42:08
- 当前线程:Thread[nioEventLoopGroup-0-1,10,main] 服务端响应数据 --> 当前系统时间:2017-06-03 21:42:08
- 当前线程:Thread[nioEventLoopGroup-0-1,10,main] 服务端响应数据 --> 当前系统时间:2017-06-04 21:42:08
- 当前线程:Thread[nioEventLoopGroup-0-1,10,main] 服务端响应数据 --> 当前系统时间:2017-06-05 21:42:08
- 当前线程:Thread[nioEventLoopGroup-0-1,10,main] 服务端响应数据 --> 当前系统时间:2017-06-06 21:42:08
- 当前线程:Thread[nioEventLoopGroup-0-1,10,main] 服务端响应数据 --> 当前系统时间:2017-06-07 21:42:08
- 当前线程:Thread[nioEventLoopGroup-0-1,10,main] 服务端响应数据 --> 当前系统时间:2017-06-08 21:42:08
- 当前线程:Thread[nioEventLoopGroup-0-1,10,main] 服务端响应数据 --> 当前系统时间:2017-06-09 21:42:08
啦啦啦
网络编程 -- RPC实现原理 -- Netty -- 迭代版本V4 -- 粘包拆包的更多相关文章
- 网络编程 -- RPC实现原理 -- Netty -- 迭代版本V1 -- 入门应用
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V1——Netty入门应用 Class : NIOServerBootStrap package lime.pri.limeNio.netty.ne ...
- 网络编程 -- RPC实现原理 -- Netty -- 迭代版本V2 -- 对象传输
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2——Netty -- 使用序列化和反序列化在网络上传输对象:需要实现 java.io.Serializable 接口 只能传输( ByteBuf ...
- 网络编程 -- RPC实现原理 -- Netty -- 迭代版本V3 -- 编码解码
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2——Netty -- pipeline.addLast(io.netty.handler.codec.MessageToMessageCodec ...
- 网络编程 -- RPC实现原理 -- 目录
-- 啦啦啦 -- 网络编程 -- RPC实现原理 -- NIO单线程 网络编程 -- RPC实现原理 -- NIO多线程 -- 迭代版本V1 网络编程 -- RPC实现原理 -- NIO多线程 -- ...
- 网络编程 -- RPC实现原理 -- RPC -- 迭代版本V1 -- 本地方法调用
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V1——RPC -- 本地方法调用:不通过网络 入门 1. RPCObjectProxy rpcObjectProxy = new RPCObjec ...
- 网络编程 -- RPC实现原理 -- RPC -- 迭代版本V2 -- 本地方法调用 整合 Spring
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2——RPC -- 本地方法调用 + Spring 1. 配置applicationContext.xml文件 注入 bean 及 管理 bean ...
- 网络编程 -- RPC实现原理 -- RPC -- 迭代版本V3 -- 远程方法调用 整合 Spring
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V3——RPC -- 远程方法调用 及 null的传输 + Spring 服务提供商: 1. 配置 rpc03_server.xml 注入 服务提供 ...
- 网络编程 -- RPC实现原理 -- RPC -- 迭代版本V4 -- 远程方法调用 整合 Spring 自动注册
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V4——RPC -- 远程方法调用 + Spring 自动注册 服务提供商: 1. 配置 rpc04_server.xml 注入 服务提供商 rpc ...
- 网络编程 -- RPC实现原理 -- NIO多线程 -- 迭代版本V1
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V1——设置标识变量selectionKey.attach(true);只处理一次(会一直循环遍历selectionKeys,占用CPU资源). ( ...
随机推荐
- Windows平台交叉编译Arm Linux平台的QT5.7库
1.准备交叉编译环境 环境说明:Windows 7 64位 此过程需要: (1)Qt库开源代码,我使用的是5.7.0版本: (2)Perl语言环境5.12版本以上: (3)Python语言环境 2.7 ...
- pycharm如何设置python版本、设置国内pip镜像、添加第三方类库
直接上图(mac环境): 一.设置项目的python版本 File->Default Settings ... 在弹出的界面上(参考下图),左上角的下拉框里,选择python解释器的版本即可(建 ...
- Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘.dot.mul运算详解 2016年09月02日 00:00:36 -牧野- 阅读数:59593 标签: Opencv矩阵相乘点乘dotmul 更多 个人分类: O ...
- Chromium OS 初体验
Chromium OS可是早有耳闻,但是一直没有尝试,最近很多评论甚至认为会对Windows和Mac都能够造成压力,于是迫不及待的想尝试一下了,百度下了官网,官网很贴心,不光给了用于写入U盘的镜像文件 ...
- iOS:针对固定数据源,更好的封装cell
一.介绍 在iOS开发中,tableView非常常用,能将其展示出来,它的数据源必不可少.当然数据源有动态下发的,有固定写死的,这里我只探讨固定写死的情况.对于死数据,我们在项目中经常遇到的场景就是我 ...
- 动态规划之 <筷子>
描述 A 先生有很多双筷子.确切的说应该是很多根,因为筷子的长度不一,很难判断出哪两根是一双的.这天,A 先生家里来了K 个客人,A 先生留下他们吃晚饭.加上A 先生,A夫人和他们的孩子小A,共K+3 ...
- C# Chart使用总结 1 ---------关于图表数据的来源
关于图表数据的来源: 1.通过XValueMember YValueMembers 设置 OleDbConnection conn = new OleDbConnection(connStr); Ol ...
- MySQL SELECT 执行的具体步骤
1:SELECT 执行的顺序 8SELECT 9DISTINCT <select_list> 1FROM <left_table> 3JOIN <right_table& ...
- 最新整合maven+SSM+Tomcat 实现注册登录
mybatis学习 http://www.mybatis.org/mybatis-3/zh/index.html Spring学习:http://blog.csdn.net/king1425/arti ...
- Microsoft/Git-Credential-Manager-for-Mac-and-Linux
纠正Mac上的错误: Fatal: java.lang.Error encountered. Details: unexpected errorfatal: credential helper '!/ ...