netty学习记录2
昨天晚上在看到7.2章MessagePack编码器和解码器开发这一章时,书里面没有贴出全部的代码,然后我按照我自己的想法把代码补全后,发现死活没有把代码跑通。
然后花了挺多时间在网上找,很多博客都贴出了这一节的代码,但是基本上都是把书上有的给贴出来了,严重怀疑他们敲完代码后有没有跑一遍。
不过最后还是找到了一个博客里面贴全了代码,发现是UserInfo类里面缺了一个注解@Message导致代码没跑通的。
下面贴上全部代码
UserInfo.java
- package MessagePack;
- import org.msgpack.annotation.Message;
- @Message
- public class UserInfo
- {
- private int age;
- private String name;
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- @Override
- public String toString()
- {
- return "age = " + age + "; name = " + name;
- }
- }
MsgpackDecoder.java
- package MessagePack;
- import io.netty.buffer.ByteBuf;
- import io.netty.channel.ChannelHandlerContext;
- import io.netty.handler.codec.MessageToMessageDecoder;
- import org.msgpack.MessagePack;
- import java.util.List;
- public class MsgpackDecoder extends MessageToMessageDecoder<ByteBuf>
- {
- protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception
- {
- final byte[] array;
- final int length = byteBuf.readableBytes();
- array = new byte[length];
- byteBuf.getBytes(byteBuf.readerIndex(), array, 0, length);
- MessagePack msgpack = new MessagePack();
- list.add(msgpack.read(array));
- }
- }
MsgpackEncoder.java
- package MessagePack;
- import io.netty.buffer.ByteBuf;
- import io.netty.channel.ChannelHandlerContext;
- import io.netty.handler.codec.MessageToByteEncoder;
- import org.msgpack.MessagePack;
- public class MsgpackEncoder extends MessageToByteEncoder<Object>
- {
- protected void encode(ChannelHandlerContext channelHandlerContext, Object o, ByteBuf byteBuf) throws Exception
- {
- MessagePack msgpack = new MessagePack();
- byte[] raw = msgpack.write(o);
- byteBuf.writeBytes(raw);
- }
- }
EchoServer.java
- package MessagePack;
- import io.netty.bootstrap.ServerBootstrap;
- import io.netty.channel.ChannelFuture;
- 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;
- public class EchoServer
- {
- private final int port;
- public EchoServer(int port)
- {
- this.port = port;
- }
- public void bind() throws Exception
- {
- //配置服务端的NIO线程
- EventLoopGroup bossGroup = new NioEventLoopGroup();
- EventLoopGroup workerGroup = new NioEventLoopGroup();
- try
- {
- ServerBootstrap b = new ServerBootstrap();
- b.group(bossGroup,workerGroup)
- .channel(NioServerSocketChannel.class)
- .option(ChannelOption.SO_BACKLOG, 100)
- //.handler(new LoggingHandler(LogLevel.INFO))
- .childHandler(new ChannelInitializer<SocketChannel>()
- {
- @Override
- protected void initChannel(SocketChannel socketChannel) throws Exception
- {
- socketChannel.pipeline().addLast("msgpack decoder", new MsgpackDecoder());
- socketChannel.pipeline().addLast("msgpack encoder", new MsgpackEncoder());
- socketChannel.pipeline().addLast(new EchoServerHandler());
- }
- });
- //绑定端口,同步等待成功
- ChannelFuture f = b.bind(port).sync();
- //等待服务端监听端口关闭
- System.out.println("bind");
- f.channel().closeFuture().sync();
- System.out.println("close");
- }
- finally
- {
- //优雅退出,释放线程池资源
- bossGroup.shutdownGracefully();
- workerGroup.shutdownGracefully();
- }
- }
- public static void main(String[] args) throws Exception
- {
- int port = 22233;
- if (null != args && args.length > 0)
- {
- try
- {
- port = Integer.parseInt(args[0]);
- }
- catch (Exception e)
- {
- port = 22233;
- }
- }
- new EchoServer(port).bind();
- }
- }
EchoServerHandler.java
- package MessagePack;
- import io.netty.channel.ChannelHandlerAdapter;
- import io.netty.channel.ChannelHandlerContext;
- public class EchoServerHandler extends ChannelHandlerAdapter
- {
- @Override
- public void channelActive(ChannelHandlerContext ctx)
- {
- System.out.println("channelActive");
- }
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception
- {
- System.out.println("Server receive the mspack message : " + msg);
- ctx.writeAndFlush(msg);
- }
- @Override
- public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
- {
- System.out.println(cause.getMessage());
- ctx.close();
- }
- }
EchoClient.java
- package MessagePack;
- import io.netty.bootstrap.Bootstrap;
- import io.netty.channel.ChannelFuture;
- 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;
- public class EchoClient
- {
- private final String host;
- private final int port;
- private final int sendNumber;
- public EchoClient(String host, int port, int sendNumber)
- {
- this.host = host;
- this.port = port;
- this.sendNumber = sendNumber;
- }
- public void connect() throws Exception
- {
- //配置客户端NIO线程组
- EventLoopGroup group = new NioEventLoopGroup();
- try
- {
- Bootstrap b = new Bootstrap();
- b.group(group).channel(NioSocketChannel.class)
- .option(ChannelOption.TCP_NODELAY, true)
- .handler(new ChannelInitializer<SocketChannel>()
- {
- protected void initChannel(SocketChannel socketChannel) throws Exception
- {
- socketChannel.pipeline().addLast("msgpack decoder", new MsgpackDecoder());
- socketChannel.pipeline().addLast("msgpack encoder", new MsgpackEncoder());
- socketChannel.pipeline().addLast(new EchoClientHandler(sendNumber));
- }
- });
- //发起异步连接操作
- ChannelFuture f = b.connect(host, port).sync();
- System.out.println("connect");
- //等待客户端链路关闭
- f.channel().closeFuture().sync();
- System.out.println("close");
- }
- finally
- {
- //优雅退出,释放NIO线程组
- group.shutdownGracefully();
- }
- }
- public static void main(String[] args) throws Exception
- {
- int port = 22233;
- if (null != args && args.length > 0)
- {
- try
- {
- port = Integer.parseInt(args[0]);
- }
- catch (Exception e)
- {
- port = 22233;
- }
- }
- new EchoClient("127.0.0.1", 22233, 100).connect();
- }
- }
EchoClientHandler.java
- package MessagePack;
- import io.netty.channel.ChannelHandlerAdapter;
- import io.netty.channel.ChannelHandlerContext;
- public class EchoClientHandler extends ChannelHandlerAdapter
- {
- private final int sendNumber;
- public EchoClientHandler(int sendNumber)
- {
- this.sendNumber = sendNumber;
- }
- @Override
- public void channelActive(ChannelHandlerContext ctx)
- {
- System.out.println("channelActive");
- // ByteBuf byteBuf = Unpooled.copiedBuffer("asdf".getBytes());
- // ctx.writeAndFlush(byteBuf);
- UserInfo[] infos = UserInfo();
- for (UserInfo infoE : infos)
- {
- ctx.write(infoE);
- }
- ctx.flush();
- }
- private UserInfo[] UserInfo()
- {
- UserInfo[] userInfos = new UserInfo[sendNumber];
- UserInfo userInfo = null;
- for (int i=0; i < sendNumber; i++)
- {
- userInfo = new UserInfo();
- userInfo.setAge(i);
- userInfo.setName("ABCDEFG --->" + i);
- userInfos[i] = userInfo;
- }
- return userInfos;
- }
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception
- {
- System.out.println("Client receive the msgpack message : " + msg);
- //ctx.write(msg);
- }
- @Override
- public void channelReadComplete(ChannelHandlerContext ctx) throws Exception
- {
- ctx.flush();
- }
- }
netty学习记录2的更多相关文章
- netty 学习记录一
近期在学习netty相关知识,认为<netty 权威指南>这本书还是挺好的,适合我这样的刚開始学习的人.加上netty本身自带的很多样例,学起来还是挺有兴趣的.简单记录下, 一般serve ...
- netty学习记录1
最近在学习netty,看的是<netty权威指南 第2版>. 然后看的同时也把书上面的代码一行行敲下来做练习,不过到第三章就出问题了. 按照书上讲的,sever/client端都需要继承C ...
- Netty学习记录
一.Netty简介 Netty 是一个基于 JAVA NIO 类库的异步通信框架,它的架构特点是:异步非阻塞.基于事件驱动.高性能.高可靠性和高可定制性. Netty 是一个 NIO client-s ...
- Netty学习记录-入门篇
你如果,缓缓把手举起来,举到顶,再突然张开五指,那恭喜你,你刚刚给自己放了个烟花. 模块介绍 netty-bio: 阻塞型网络通信demo. netty-nio: 引入channel(通道).buff ...
- Netty 学习 一、初识Netty【原创】
在过去几年的工作和学习中,比较关注高层次的应用开发,对底层探究较少.实现Web应用的开发,主要依赖Tomcat.Apache等应用服务器,程序员无需了解底层协议,但同样限制了应用的性能和效率.现在开始 ...
- java后端学习记录2019
学习计划 2019年计划 1.学习计算机基础,并加以实践.包括LeetCode刷题.数据库原理(索引和锁.Sql优化等).网络协议(Http.Tcp).操作系统(加深Linux).<Http权威 ...
- Netty学习——protoc的新手使用流程
Netty学习——protoc的新手使用流程 关于学习的内容笔记,记下来的东西等于又过了一次脑子,记录的更深刻一些. 1. 使用IDEA创建.proto文件,软件会提示你安装相应的语法插件 安装成功之 ...
- Netty学习(二)使用及执行流程
Netty简单使用 1.本文先介绍一下 server 的 demo 2.(重点是这个)根据代码跟踪一下 Netty 的一些执行流程 和 事件传递的 pipeline. 首先到官网看一下Netty Se ...
- netty学习资料
netty学习资料推荐官方文档和<netty权威指南>和<netty in action>这两本书.下面收集下网上分享的资料 netty官方参考文档 Netty 4.x Use ...
随机推荐
- QT学习之文件系统读写类
#QT学习之文件系统读写类 QIODevice QFileDevice QBuffer QProcess 和 QProcessEnvironment QFileDevice QFile QFileIn ...
- 大小端,"字节序"
2 字节序 2.1 字节 字节(Byte)作为计算机世界的计量单位,和大家手中的人民币多少多少“元”一个意思.反正,到了计算机的世界,说字节就对了,使用人家的基本计量单位,这是入乡随俗. 比如,一个电 ...
- 编程思想的理解(POP,OOP,SOA,AOP)
http://blog.csdn.net/hawksoft/article/details/7021435 1)POP--面向过程编程(Process-oriented programming ):面 ...
- 使用ParseExact方法将字符串转换为日期格式
实现效果: 知识运用: DateTime结构的ParseExact方法 public static DateTime ParseExact(string s,string format,IFormat ...
- javascript之正则表达式基础知识小结
javascript之正则表达式基础知识小结,对于学习正则表达式的朋友是个不错的基础入门资料. 元字符 ^ $ . * + ? = ! : | \ / ( ) [ ] { } 在使用这些符号时需要 ...
- require,import区别?
遵循的模块化规范不一样 模块化规范:即为 JavaScript 提供一种模块编写.模块依赖和模块运行的方案.谁让最初的 JavaScript 是那么的裸奔呢——全局变量就是它的模块化规范. requi ...
- [luoguP1443]马的遍历
首先来看一下题目描述: 题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋 ...
- sql server 中数据库数据导入到另一个库中
这篇说了sql语句对于备份的数据库进行还原 ,如果数据量大了还是什么问题,发现我的数据丢失了一些,头疼 sql server 备份还原 下面使用的的数据导入来解决这个问题,因为数据量比较大,导出来的脚 ...
- AngularJS 一 简介以及安装环境
AngularJS官网:https://angularjs.org AngularJS是开发动态Web应用程序的客户端JavaScript MVC框架.AngularJS最初是作为Google的一个项 ...
- Restframework中的Request
1.介绍 该篇博客主要介绍restframework内置的Request类,它扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等. 如: 在APIView中封装的r ...