`
zhaohaolin
  • 浏览: 985470 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Netty学习笔记(一)二进制流协议【转】

 
阅读更多

一、协议

1. 请求:

 

字段

类型

说明

length

short

消息长度

commandid

short

消息类型

userid

int

用户号

2. 响应:

 

 

字段

类型

说明

length

short

消息长度

commandid

short

消息类型

userid

int

用户号

result

byte

0: 成功

1: 失败

二、编解码代码

public abstract class KaMessage {

 

protected short commandId;

 

 

protected int userId;

 

public static final short HEADLENGTH = 6;

 

public static final short REQ = 0x0001;

 

public static final short RES = 0x1001;

 

 

 

 

public void encode(ByteBuffer buffer) {

buffer.putInt(userId);

subencode(buffer);

}

 

public void decode(ByteBuffer buffer) {

userId = buffer.getInt();

subdecode(buffer);

}

 

public abstract short length();

 

public abstract void subencode(ByteBuffer buffer);

 

public abstract void subdecode(ByteBuffer buffer);

 

public int getUserId() {

return userId;

}

 

public void setUserId(int userId) {

this.userId = userId;

}

 

public short getCommandId() {

return commandId;

}

}

 

public class KaRes extends KaMessage {

 

private short result = 200;

 

public KaRes() {

commandId = KaMessage.RES;

}

 

@Override

public short length() {

// TODO Auto-generated method stub

short len = KaMessage.HEADLENGTH;

len += 2;

return len;

}

 

@Override

public void subencode(ByteBuffer buffer) {

// TODO Auto-generated method stub

buffer.putShort(result);

}

 

@Override

public void subdecode(ByteBuffer buffer) {

// TODO Auto-generated method stub

result = buffer.getShort();

}

 

@Override

public String toString() {

// TODO Auto-generated method stub

StringBuffer sb = new StringBuffer();

sb.append(super.toString());

sb.append(" - result: " + result);

return sb.toString();

}

 

public short getResult() {

return result;

}

 

public void setResult(short result) {

this.result = result;

}

 

}

 


public class KaReq extends KaMessage {

 

 

 

 

public KaReq() {

commandId = KaMessage.REQ;

}

 

@Override

public void subencode(ByteBuffer buffer) {

// TODO Auto-generated method stub

}

 

@Override

public short length() {

// TODO Auto-generated method stub

short len = PaMessage.HEADLENGTH;

 

 

return len;

}

 

@Override

public void subdecode(ByteBuffer buffer) {

// TODO Auto-generated method stub

}

}

 

 

public class KaCodecUtil {

 

public static byte[] NetEncode(PaMessage message) {

ByteBuffer buffer = ByteBuffer.allocate(message.length() + 2);

buffer.putShort(message.length());

buffer.putShort(message.getCommandId());

message.encode(buffer);

return buffer.array();

}

 

public static KaMessage NetDecode(byte[] data) {

ByteBuffer buffer = ByteBuffer.wrap(data);

short commandId = buffer.getShort();

PaMessage message = null;

switch(commandId) {

case KaMessage.SEQ:

message = new KaReq();

message.decode(buffer);

return message;

case KaMessage.Res:

message = new KaRes();

message.decode(buffer);

return message;

 

 

}

return message;

}

 


public class KaEncoder extends OneToOneEncoder {

@Override

protected Object encode(ChannelHandlerContext context, Channel channel,

Object object) throws Exception {

// TODO Auto-generated method stub

KaMessage message = (KaMessage)object;

ChannelBuffer buf = ChannelBuffers.dynamicBuffer();

buf.writeBytes(KaCodecUtil.NetEncode(message));

return buf;

}

}

 

 

public class KaDecoder extends FrameDecoder {

 

@Override

protected Object decode(ChannelHandlerContext context, Channel channel,

ChannelBuffer buffer) throws Exception {

// TODO Auto-generated method stub

if(buffer.readableBytes() < 2) {

buffer.resetReaderIndex();

return null;

}

short length = buffer.readShort();

if(buffer.readableBytes() < length) {

buffer.resetReaderIndex();

return null;

}

byte[] decode = new byte[length];

buffer.readBytes(decode);

KaMessage message = KaCodecUtil.NetDecode(decode);

return message;

}

 

}


二、服务端代码

public class ServerBoot {

 

public static void main(String[] args) {

ChannelPipelineFactory pipelineFactory = new ChannelPipelineFactory() {

 

 

public ChannelPipeline getPipeline() {

ChannelPipeline pipeline = Channels.pipeline();

pipeline.addLast("decoder", new KaDecoder());

pipeline.addLast("encoder", new KaEncoder());

pipeline.addLast("handler", new KaHandler());

return pipeline;

}

};

 

ChannelFactory factory = new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool());

ServerBootstrap bootstrap = new ServerBootstrap(factory);

bootstrap.setPipelineFactory(pipelineFactory);

bootstrap.setOption("child.tcpNoDelay", true);

bootstrap.setOption("child.keepAlive", true);

bootstrap.bind(new InetSocketAddress(8080));

 

}

}

 

 

public class KaHandler extends SimpleChannelUpstreamHandler {

 

private static Logger log = Logger.getLogger(PaHandler.class);

 

@Override

public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {

try {

KaMessage req = (KaMessage) e.getMessage();

log.info("messageReceived: " + req);

KaRes res = new KaRes();

e.getChannel().write(res);

}catch(Exception ee) {

ee.printStackTrace();

}

}

}

 

三、客户端代码

 

public class ServerBoot {

 

public static void main(String[] args) {

// TODO Auto-generated method stub

 

ClientBootstrap bootstrap = new ClientBootstrap(

new NioClientSocketChannelFactory(

Executors.newCachedThreadPool(),

Executors.newCachedThreadPool()));

bootstrap.getPipeline().addLast("encoder", new KaEncoder());

bootstrap.getPipeline().addLast("decoder", new KaDecoder());

bootstrap.getPipeline().addLast("handler", new KaHandler());

ChannelFuture future = bootstrap.connect(new InetSocketAddress("127.0.0.1", 8080));

 

future.awaitUninterruptibly();

Channel channel = future.getChannel();

KaReq req = new KaReq();

 

future = channel.write(req);

future.awaitUninterruptibly();

 

 

 

 

}

}

分享到:
评论

相关推荐

    netty服务器解析16进制数据

    netty服务器解析16进制数据

    Netty学习笔记_Springboot实现自定义协议.docx

    Netty学习笔记_Springboot实现自定义协议.docx Netty学习笔记_Springboot实现自定义协议.docx Netty学习笔记_Springboot实现自定义协议.docx

    Netty进制转换乱码问题

    在公司做项目的时候发现用Netty进行TCP/IP通信的Netty客户端接收到的数据进制乱码,经过摸索,终于成功解决了这个鸡肋的问题

    netty 在java中的字节码转换

    netty通信时经常和底层数据交互,C语言和java的数据类型和范围不同,通信时需要转化或兼容,附件为字节码、进制常用的转换类。

    netty学习笔记

    netty学习笔记

    Netty基础,用于学习Netty,参考黑马程序员的netty教程

    Netty基础,用于学习Netty,参考黑马程序员的netty教程

    java实现基于netty 的udp字节数据接收服务

    java实现基于netty 的utp字节数据接收服务,服务具体实现代码。样例java实现基于netty 的utp字节数据接收服务,服务具体实现代码。样例

    netty权威指南中的私有协议栈开发demo

    netty权威指南中,私有协议栈开发的demo,网上搜出来的都无法正常运行,csdn上也有相关的demo,但运行起来都有问题,本人研究数日,终于搞明白了怎么回事,此代码保证可以运行

    自己学习netty的笔记和Demo

    netty入门到精通学习笔记和demo

    Netty笔记源码资料.rar

    1.Netty 是由 JBOSS 提供的一个 Java 开源框架,现为 Github 上的独立项目。 2.Netty 是一个 异步的、 基于事件驱动的网络应用框架,用以快速开发高性能、高可靠性的网络 IO 程序。

    Netty数据转发工具

    Netty实现端口数据转发:3000进4000出

    基于netty4 的udp字节数据接收服务

    基于netty 的udp字节数据接 收服务,发送服务实例 基于netty 的udp字节数据接收服务,发送服务实例

    Netty4.0学习笔记系列之六:多种通讯协议支持

    NULL 博文链接:https://bijian1013.iteye.com/blog/2340639

    netty-demo实例

    Netty 是一个吸收了多种协议的实现经验,这些协议包括FTP,SMTP,HTTP,各种二进制,文本协议,并经过相当精心设计的项目,最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和...

    从NIO到Netty,编程实战出租车905协议-08172347.pdf

    905.4-2014协议,是交通运输部公路科学研究院起草定制的一个协议标准,它也是基于TCP之上的一个应用层传输协议。 第2章,介绍在Socket编程过程中一些基础知识,让大家建立起对这块知识内容的一个整体轮廓; 第3章,...

    netty电子书

    Netty 是一个吸收了多种协议的实现经验,这些协议包括FTP,SMTP,HTTP,各种二进制,文本协议,并经过相当精心设计的项目,最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和...

    netty开发笔记

    利用netty开发proxy笔记,和一位大牛netty人员一起讨论出的谈话结果笔记 非常给力

    Netty (netty-netty-4.0.56.Final.tar.gz)

    Netty 是根据从实现许多协议(如 FTP、SMTP、HTTP 以及各种二进制和基于文本的旧协议)中获得的经验精心设计的。因此,Netty 成功地找到了一种方法,可以在不妥协的情况下实现易于开发、性能、稳定性和灵活性。

    Netty5学习指南

    “快速和简单”并不意味着应用程序会有难维护和性能低的问题,Netty是一个精心设计的框架,它从许多协议的实现中吸收了很多的经验比如FTP、SMTP、HTTP、许多二进制和基于文本的传统协议,Netty在不降低开发效率、...

    netty4官方包

    Netty 是一个吸收了多种协议的实现经验,这些协议包括FTP,SMTP,HTTP,各种二进制,文本协议,并经过相当精心设计的项目,最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和...

Global site tag (gtag.js) - Google Analytics