`
zhaohaolin
  • 浏览: 1011248 次
  • 性别: 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 是一个高性能、异步...通过上述步骤,Netty服务器可以轻松地解析16进制数据,从而支持各种网络协议,无论它们是以16进制还是其他形式表示。理解和掌握这些概念和实践技巧对于构建高效、可靠的网络应用至关重要。

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

    Netty学习笔记_Springboot实现自定义协议 本文主要介绍了使用Netty框架在Springboot项目中实现自定义协议的方法。自定义协议是指在网络通信中,使用特定的数据格式来传输数据,以满足特定的业务需求。在本文中,...

    Netty进制转换乱码问题

    首先,我们要明白Netty作为一个高性能的网络应用框架,它本身并不直接处理字符编码,而是通过ByteBuf对象来存储和传输字节流。ByteBuf是Netty中的核心组件,用于高效地处理网络I/O。因此,当涉及到字符串和字节之间...

    netty 在java中的字节码转换

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

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

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

    Netty全套学习资源(包括源码、笔记、学习文档等)

    二、Netty 学习笔记 学习笔记通常包含了作者在学习过程中的总结和实践经验,对于初学者来说极具参考价值。笔记可能涵盖 Netty 的安装配置、基本使用、线程模型、缓冲区操作、编解码器的实现以及异常处理等方面,帮助...

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

    在本篇Netty4.0学习笔记系列之六中,我们将深入探讨Netty框架如何支持多种通讯协议,以及它在实现高效、灵活的网络通信中的关键特性。Netty是一个高性能、异步事件驱动的网络应用框架,适用于开发服务器和客户端的...

    Netty4.0学习笔记系列之五:自定义通讯协议

    在本篇“Netty4.0学习笔记系列之五:自定义通讯协议”中,我们将深入探讨如何在Netty框架下构建和实现自己的通信协议。Netty是一个高性能、异步事件驱动的网络应用框架,广泛应用于Java领域的服务器开发,如网络游戏...

    netty学习笔记

    ### Netty学习笔记知识点概述 #### 一、Netty简介 Netty是一个广泛使用的高性能、异步事件驱动的网络应用程序框架,它简化了网络编程的复杂性,使得开发者能够更轻松地开发高性能、高可靠性的网络服务器和客户端。...

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

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在“Netty 权威指南”中,私有协议栈的开发是其中一个重要的实践章节,旨在帮助开发者理解和实现自定义的通信...

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

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

    Netty4.0学习笔记系列之四:混合使用coder和handler

    在本篇Netty4.0学习笔记中,我们将聚焦于如何在实际应用中混合使用`coder`和`handler`,这是Netty框架中非常关键的一部分,对于构建高性能、低延迟的网络应用程序至关重要。Netty是一个用Java编写的异步事件驱动的...

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

    在Java编程环境中,Netty是一个高性能、异步事件驱动的网络应用程序框架,常用于构建可伸缩、高并发的服务器。本示例关注的是如何利用Netty实现一个基于UDP(User Datagram Protocol)的数据接收服务,这在需要进行...

    netty实现sdtp协议

    Netty 实现 SDTP 协议详解 SDTP(Specific Device Transport Protocol)是一种专用于硬件设备通信的协议,常用于物联网(IoT)场景中,为设备与服务器间的数据传输提供高效、可靠的解决方案。Netty 是一个高性能、...

    Netty数据转发工具

    Netty是一款高性能、异步事件驱动的网络应用框架,它为Java开发人员提供了构建高性能、可扩展的网络应用程序的强大工具。在"Netty数据转发工具"的场景中,描述提到的"Netty实现端口数据转发:3000进4000出"意味着...

    netty学习资料001

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的..."netty学习资料001"的压缩包,尤其是"binarydata-master"部分,提供了深入理解Netty处理二进制数据的实践机会,对于提升技能非常有价值。

    自己学习netty的笔记和Demo

    在Netty网络框架学习笔记-1中,可能详细介绍了NIO的基本概念,如选择器(Selector)、通道(Channel)和缓冲区(Buffer),以及它们如何协同工作以提高并发处理能力。 2. **Netty入门**:笔记-3和-5探讨了Netty的入门知识...

    Netty4.0学习笔记系列之二:Handler的执行顺序

    在本篇“Netty4.0学习笔记系列之二:Handler的执行顺序”中,我们将深入探讨Netty中的Handler处理链以及它们的执行流程。 首先,Netty 中的 ChannelHandler 是处理 I/O 事件或拦截 I/O 操作的核心组件。每个 ...

    Netty4.0学习笔记系列之一:Server与Client的通讯

    在本文中,我们将深入探讨Netty 4.0的学习笔记,特别是关于Server与Client之间的通信机制。 首先,我们要理解Netty的核心概念——NIO(非阻塞I/O)。Netty基于Java NIO库构建,它提供了更高级别的API,简化了多路...

    Netty笔记源码资料.rar

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

Global site tag (gtag.js) - Google Analytics