netty 私有协议开发
来源:互联网 发布:手机淘宝苹果版本下载 编辑:程序博客网 时间:2024/05/17 03:37
以下代码仅仅是demo。不适用于正式环境
消息的定义
public class NettyMessage { private Header header; private String data; public Header getHeader() { return header; } public void setHeader(Header header) { this.header = header; } public String getData() { return data; } public void setData(String data) { this.data = data; } @Override public String toString() { return "NettyMessage{" + "header=" + header + ", data='" + data + '\'' + '}'; }}
public class Header { private int length; private int type; private int mainVersion; private int subVersion; public int getLength() { return length; } public void setLength(int length) { this.length = length; } public int getType() { return type; } public void setType(int type) { this.type = type; } public int getMainVersion() { return mainVersion; } public void setMainVersion(int mainVersion) { this.mainVersion = mainVersion; } public int getSubVersion() { return subVersion; } public void setSubVersion(int subVersion) { this.subVersion = subVersion; } @Override public String toString() { return "Header{" + "length=" + length + ", type=" + type + ", mainVersion=" + mainVersion + ", subVersion=" + subVersion + '}'; }}
public class MessageDecode extends MessageToMessageDecoder<ByteBuf> { @Override protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) throws Exception { int length = msg.readInt(); int type = msg.readInt(); int mainVersion = msg.readInt(); int subVersion = msg.readInt(); int dataLength = msg.readInt(); byte[] data =new byte[dataLength]; msg.readBytes(data); String strData = new String(data, Charset.forName("UTF-8")); NettyMessage nettyMessage = new NettyMessage(); Header header = new Header(); nettyMessage.setHeader(header); nettyMessage.setData(strData); header.setLength(length); header.setMainVersion(mainVersion); header.setSubVersion(subVersion); header.setType(type); }}
public class MessageEncode extends MessageToByteEncoder<NettyMessage> { @Override protected void encode(ChannelHandlerContext ctx, NettyMessage msg, ByteBuf out) throws Exception { ByteBuf sendBuffer = Unpooled.buffer(); // final Header header = msg.getHeader(); sendBuffer.writeInt(header.getLength()); sendBuffer.writeInt(header.getType()); sendBuffer.writeInt(header.getMainVersion()); sendBuffer.writeInt(header.getSubVersion()); sendBuffer.writeInt(msg.getData().getBytes().length); sendBuffer.writeBytes(msg.getData().getBytes()); out.writeInt(sendBuffer.readableBytes()); out.writeBytes(sendBuffer); ctx.flush(); }}
public class MainServer { static class ServerHandler extends SimpleChannelInboundHandler<NettyMessage> { @Override protected void messageReceived(ChannelHandlerContext ctx, NettyMessage msg) throws Exception { System.out.println(msg); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { cause.printStackTrace(); } } public static void main(String[] args) { EventLoopGroup boss = new NioEventLoopGroup(); EventLoopGroup workers = new NioEventLoopGroup(); try { ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(boss, workers) .channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG, 1024) .childHandler(new ChannelInitializer<Channel>() { @Override protected void initChannel(Channel ch) throws Exception { ChannelPipeline cpl = ch.pipeline(); cpl.addLast(new LengthFieldBasedFrameDecoder(1024, 0, 4, 0, 4)); cpl.addLast(new MessageDecode()); cpl.addLast(new MessageEncode()); cpl.addLast(new ServerHandler()); } }); ChannelFuture channelFuture = serverBootstrap.bind("localhost", 9999).sync(); channelFuture.channel().closeFuture().sync(); } catch (InterruptedException e) { e.printStackTrace(); } finally { boss.shutdownGracefully(); workers.shutdownGracefully(); } }}
public class MainClient { static class ClientServer extends SimpleChannelInboundHandler<ByteBuf> { @Override protected void messageReceived(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { byte[] buffer = new byte[msg.readableBytes()]; msg.readBytes(buffer); System.out.println("客户端收到消息:" + new String(buffer, Charset.forName("UTF-8"))); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { cause.printStackTrace(); } @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { for (int i = 1; i < 100; i++) { NettyMessage nettyMessage = new NettyMessage(); nettyMessage.setData("你好,现在是第:" + i + "次"); Header header = new Header(); header.setType(i); header.setLength(20); header.setMainVersion(1); header.setSubVersion(1); nettyMessage.setHeader(header); ctx.writeAndFlush(nettyMessage); } } } public static void main(String[] args) { EventLoopGroup workers = new NioEventLoopGroup(); Bootstrap bootstrap = new Bootstrap(); try { bootstrap.group(workers) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) .handler(new ChannelInitializer<Channel>() { @Override protected void initChannel(Channel ch) throws Exception { ChannelPipeline channelPipeline = ch.pipeline(); /** * * 1024: 消息的最大长度 * 0: 长度的起始偏移量 * 4: 长度属性占的字节数 * 0: 长度调节值,在总长被定义为包含包头长度时,修正信息长度 * 4: 跳过的字节数,根据需要我们跳过前4个字节,以便接收端直接接受到不含“长度属性 * */ channelPipeline.addLast(new LengthFieldBasedFrameDecoder(1024, 0, 4, 0, 4)); channelPipeline.addLast(new MessageDecode()); channelPipeline.addLast(new MessageEncode()); channelPipeline.addLast(new ClientServer()); } }); ChannelFuture channelFuture = bootstrap.connect("localhost", 9999).sync(); channelFuture.channel().closeFuture().sync(); } catch (InterruptedException e) { e.printStackTrace(); } finally { workers.shutdownGracefully(); } }}
服务端输出:
NettyMessage{header=Header{length=20, type=1, mainVersion=1, subVersion=1}, data='你好,现在是第:1次'}
NettyMessage{header=Header{length=20, type=2, mainVersion=1, subVersion=1}, data='你好,现在是第:2次'}
NettyMessage{header=Header{length=20, type=3, mainVersion=1, subVersion=1}, data='你好,现在是第:3次'}
NettyMessage{header=Header{length=20, type=4, mainVersion=1, subVersion=1}, data='你好,现在是第:4次'}
NettyMessage{header=Header{length=20, type=5, mainVersion=1, subVersion=1}, data='你好,现在是第:5次'}
NettyMessage{header=Header{length=20, type=6, mainVersion=1, subVersion=1}, data='你好,现在是第:6次'}
NettyMessage{header=Header{length=20, type=7, mainVersion=1, subVersion=1}, data='你好,现在是第:7次'}
NettyMessage{header=Header{length=20, type=8, mainVersion=1, subVersion=1}, data='你好,现在是第:8次'}
NettyMessage{header=Header{length=20, type=9, mainVersion=1, subVersion=1}, data='你好,现在是第:9次'}
NettyMessage{header=Header{length=20, type=10, mainVersion=1, subVersion=1}, data='你好,现在是第:10次'}
NettyMessage{header=Header{length=20, type=11, mainVersion=1, subVersion=1}, data='你好,现在是第:11次'}
NettyMessage{header=Header{length=20, type=12, mainVersion=1, subVersion=1}, data='你好,现在是第:12次'}
NettyMessage{header=Header{length=20, type=13, mainVersion=1, subVersion=1}, data='你好,现在是第:13次'}
NettyMessage{header=Header{length=20, type=14, mainVersion=1, subVersion=1}, data='你好,现在是第:14次'}
NettyMessage{header=Header{length=20, type=15, mainVersion=1, subVersion=1}, data='你好,现在是第:15次'}
NettyMessage{header=Header{length=20, type=16, mainVersion=1, subVersion=1}, data='你好,现在是第:16次'}
NettyMessage{header=Header{length=20, type=17, mainVersion=1, subVersion=1}, data='你好,现在是第:17次'}
NettyMessage{header=Header{length=20, type=18, mainVersion=1, subVersion=1}, data='你好,现在是第:18次'}
NettyMessage{header=Header{length=20, type=19, mainVersion=1, subVersion=1}, data='你好,现在是第:19次'}
NettyMessage{header=Header{length=20, type=20, mainVersion=1, subVersion=1}, data='你好,现在是第:20次'}
NettyMessage{header=Header{length=20, type=21, mainVersion=1, subVersion=1}, data='你好,现在是第:21次'}
NettyMessage{header=Header{length=20, type=22, mainVersion=1, subVersion=1}, data='你好,现在是第:22次'}
NettyMessage{header=Header{length=20, type=23, mainVersion=1, subVersion=1}, data='你好,现在是第:23次'}
NettyMessage{header=Header{length=20, type=24, mainVersion=1, subVersion=1}, data='你好,现在是第:24次'}
NettyMessage{header=Header{length=20, type=25, mainVersion=1, subVersion=1}, data='你好,现在是第:25次'}
NettyMessage{header=Header{length=20, type=26, mainVersion=1, subVersion=1}, data='你好,现在是第:26次'}
NettyMessage{header=Header{length=20, type=27, mainVersion=1, subVersion=1}, data='你好,现在是第:27次'}
NettyMessage{header=Header{length=20, type=28, mainVersion=1, subVersion=1}, data='你好,现在是第:28次'}
NettyMessage{header=Header{length=20, type=29, mainVersion=1, subVersion=1}, data='你好,现在是第:29次'}
NettyMessage{header=Header{length=20, type=30, mainVersion=1, subVersion=1}, data='你好,现在是第:30次'}
NettyMessage{header=Header{length=20, type=31, mainVersion=1, subVersion=1}, data='你好,现在是第:31次'}
NettyMessage{header=Header{length=20, type=32, mainVersion=1, subVersion=1}, data='你好,现在是第:32次'}
NettyMessage{header=Header{length=20, type=33, mainVersion=1, subVersion=1}, data='你好,现在是第:33次'}
NettyMessage{header=Header{length=20, type=34, mainVersion=1, subVersion=1}, data='你好,现在是第:34次'}
NettyMessage{header=Header{length=20, type=35, mainVersion=1, subVersion=1}, data='你好,现在是第:35次'}
NettyMessage{header=Header{length=20, type=36, mainVersion=1, subVersion=1}, data='你好,现在是第:36次'}
NettyMessage{header=Header{length=20, type=37, mainVersion=1, subVersion=1}, data='你好,现在是第:37次'}
NettyMessage{header=Header{length=20, type=38, mainVersion=1, subVersion=1}, data='你好,现在是第:38次'}
NettyMessage{header=Header{length=20, type=39, mainVersion=1, subVersion=1}, data='你好,现在是第:39次'}
NettyMessage{header=Header{length=20, type=40, mainVersion=1, subVersion=1}, data='你好,现在是第:40次'}
NettyMessage{header=Header{length=20, type=41, mainVersion=1, subVersion=1}, data='你好,现在是第:41次'}
NettyMessage{header=Header{length=20, type=42, mainVersion=1, subVersion=1}, data='你好,现在是第:42次'}
NettyMessage{header=Header{length=20, type=43, mainVersion=1, subVersion=1}, data='你好,现在是第:43次'}
NettyMessage{header=Header{length=20, type=44, mainVersion=1, subVersion=1}, data='你好,现在是第:44次'}
NettyMessage{header=Header{length=20, type=45, mainVersion=1, subVersion=1}, data='你好,现在是第:45次'}
NettyMessage{header=Header{length=20, type=46, mainVersion=1, subVersion=1}, data='你好,现在是第:46次'}
NettyMessage{header=Header{length=20, type=47, mainVersion=1, subVersion=1}, data='你好,现在是第:47次'}
NettyMessage{header=Header{length=20, type=48, mainVersion=1, subVersion=1}, data='你好,现在是第:48次'}
NettyMessage{header=Header{length=20, type=49, mainVersion=1, subVersion=1}, data='你好,现在是第:49次'}
NettyMessage{header=Header{length=20, type=50, mainVersion=1, subVersion=1}, data='你好,现在是第:50次'}
NettyMessage{header=Header{length=20, type=51, mainVersion=1, subVersion=1}, data='你好,现在是第:51次'}
NettyMessage{header=Header{length=20, type=52, mainVersion=1, subVersion=1}, data='你好,现在是第:52次'}
NettyMessage{header=Header{length=20, type=53, mainVersion=1, subVersion=1}, data='你好,现在是第:53次'}
NettyMessage{header=Header{length=20, type=54, mainVersion=1, subVersion=1}, data='你好,现在是第:54次'}
NettyMessage{header=Header{length=20, type=55, mainVersion=1, subVersion=1}, data='你好,现在是第:55次'}
NettyMessage{header=Header{length=20, type=56, mainVersion=1, subVersion=1}, data='你好,现在是第:56次'}
NettyMessage{header=Header{length=20, type=57, mainVersion=1, subVersion=1}, data='你好,现在是第:57次'}
NettyMessage{header=Header{length=20, type=58, mainVersion=1, subVersion=1}, data='你好,现在是第:58次'}
NettyMessage{header=Header{length=20, type=59, mainVersion=1, subVersion=1}, data='你好,现在是第:59次'}
NettyMessage{header=Header{length=20, type=60, mainVersion=1, subVersion=1}, data='你好,现在是第:60次'}
NettyMessage{header=Header{length=20, type=61, mainVersion=1, subVersion=1}, data='你好,现在是第:61次'}
NettyMessage{header=Header{length=20, type=62, mainVersion=1, subVersion=1}, data='你好,现在是第:62次'}
NettyMessage{header=Header{length=20, type=63, mainVersion=1, subVersion=1}, data='你好,现在是第:63次'}
NettyMessage{header=Header{length=20, type=64, mainVersion=1, subVersion=1}, data='你好,现在是第:64次'}
NettyMessage{header=Header{length=20, type=65, mainVersion=1, subVersion=1}, data='你好,现在是第:65次'}
NettyMessage{header=Header{length=20, type=66, mainVersion=1, subVersion=1}, data='你好,现在是第:66次'}
NettyMessage{header=Header{length=20, type=67, mainVersion=1, subVersion=1}, data='你好,现在是第:67次'}
NettyMessage{header=Header{length=20, type=68, mainVersion=1, subVersion=1}, data='你好,现在是第:68次'}
NettyMessage{header=Header{length=20, type=69, mainVersion=1, subVersion=1}, data='你好,现在是第:69次'}
NettyMessage{header=Header{length=20, type=70, mainVersion=1, subVersion=1}, data='你好,现在是第:70次'}
NettyMessage{header=Header{length=20, type=71, mainVersion=1, subVersion=1}, data='你好,现在是第:71次'}
NettyMessage{header=Header{length=20, type=72, mainVersion=1, subVersion=1}, data='你好,现在是第:72次'}
NettyMessage{header=Header{length=20, type=73, mainVersion=1, subVersion=1}, data='你好,现在是第:73次'}
NettyMessage{header=Header{length=20, type=74, mainVersion=1, subVersion=1}, data='你好,现在是第:74次'}
NettyMessage{header=Header{length=20, type=75, mainVersion=1, subVersion=1}, data='你好,现在是第:75次'}
NettyMessage{header=Header{length=20, type=76, mainVersion=1, subVersion=1}, data='你好,现在是第:76次'}
NettyMessage{header=Header{length=20, type=77, mainVersion=1, subVersion=1}, data='你好,现在是第:77次'}
NettyMessage{header=Header{length=20, type=78, mainVersion=1, subVersion=1}, data='你好,现在是第:78次'}
NettyMessage{header=Header{length=20, type=79, mainVersion=1, subVersion=1}, data='你好,现在是第:79次'}
NettyMessage{header=Header{length=20, type=80, mainVersion=1, subVersion=1}, data='你好,现在是第:80次'}
NettyMessage{header=Header{length=20, type=81, mainVersion=1, subVersion=1}, data='你好,现在是第:81次'}
NettyMessage{header=Header{length=20, type=82, mainVersion=1, subVersion=1}, data='你好,现在是第:82次'}
NettyMessage{header=Header{length=20, type=83, mainVersion=1, subVersion=1}, data='你好,现在是第:83次'}
NettyMessage{header=Header{length=20, type=84, mainVersion=1, subVersion=1}, data='你好,现在是第:84次'}
NettyMessage{header=Header{length=20, type=85, mainVersion=1, subVersion=1}, data='你好,现在是第:85次'}
NettyMessage{header=Header{length=20, type=86, mainVersion=1, subVersion=1}, data='你好,现在是第:86次'}
NettyMessage{header=Header{length=20, type=87, mainVersion=1, subVersion=1}, data='你好,现在是第:87次'}
NettyMessage{header=Header{length=20, type=88, mainVersion=1, subVersion=1}, data='你好,现在是第:88次'}
NettyMessage{header=Header{length=20, type=89, mainVersion=1, subVersion=1}, data='你好,现在是第:89次'}
NettyMessage{header=Header{length=20, type=90, mainVersion=1, subVersion=1}, data='你好,现在是第:90次'}
NettyMessage{header=Header{length=20, type=91, mainVersion=1, subVersion=1}, data='你好,现在是第:91次'}
NettyMessage{header=Header{length=20, type=92, mainVersion=1, subVersion=1}, data='你好,现在是第:92次'}
NettyMessage{header=Header{length=20, type=93, mainVersion=1, subVersion=1}, data='你好,现在是第:93次'}
NettyMessage{header=Header{length=20, type=94, mainVersion=1, subVersion=1}, data='你好,现在是第:94次'}
NettyMessage{header=Header{length=20, type=95, mainVersion=1, subVersion=1}, data='你好,现在是第:95次'}
NettyMessage{header=Header{length=20, type=96, mainVersion=1, subVersion=1}, data='你好,现在是第:96次'}
NettyMessage{header=Header{length=20, type=97, mainVersion=1, subVersion=1}, data='你好,现在是第:97次'}
NettyMessage{header=Header{length=20, type=98, mainVersion=1, subVersion=1}, data='你好,现在是第:98次'}
NettyMessage{header=Header{length=20, type=99, mainVersion=1, subVersion=1}, data='你好,现在是第:99次'}
- netty 私有协议开发
- netty私有协议的开发
- netty私有协议的开发
- 《netty权威指南》私有协议栈开发
- Netty之私有协议栈开发
- Netty之私有协议栈开发
- 使用netty开发私有栈协议
- 12.netty开发私有协议栈
- Netty-私有协议栈
- Netty私有栈协议
- Netty权威指南之私有协议栈开发
- Netty学习笔记3: 私有协议栈开发
- Netty私有协议栈踩
- 《Netty权威指南》私有协议开发的可运行源代码分享
- 《netty权威指南》私有协议栈开发中遇到的坑
- 《Netty权威指南》私有协议开发的可运行源代码分享
- Netty自定义协议开发
- Netty 协议开发
- 这是vs2015 update2的bug么
- Java中关于Short,byte越界需要强转,int,long越界自动转为最小值。
- 【Java】异常处理
- cannot use LOB locators selected from remote tables
- javascrip将对象转换成json字符串
- netty 私有协议开发
- Eclipse上Hadoop开发环境搭建
- 【Java】抽象类和接口
- MVP模式在Android中的使用
- 一些前端开发实用的函数—1(jquery)
- 2016年中国电子信息百强企业出炉:华为居首
- NodeJS学习系列课程笔记(NodeJs 快速上手+用法示例)
- springmvc+mybatis 配置
- mysql查询条件的执行顺序