[编织消息框架][设计协议]opCode
OpCode(Operation Code) 操作码的意思。
OpCode 有几种域组成,不同领域格式组成不同
1.指令号
2.数据范围
3.数据内容
如 {code}{addr range}{data}
{1}{2-5}{2至5地址内容为 "你好"}
{2}{6-10}{6至10地址内容为 "hello"}
这种编码可以应用到其它领域,本项目用的格式是
{data model}{data}
源码解读
QOpCode 类维护所有opCode
/**
* @author solq
**/
@Target(TYPE)
@Retention(RUNTIME)
public @interface QOpCode {
short value(); public static final short QPRODUCE = 1;
public static final short QCONSUME = 2;
public static final short QSUBSCIBE = 3;
public static final short QCODE = 4;
public static final short QRPC = 5; }
QDispenseHandler.class
private void doReceive0(QPacket packet, ChannelHandlerContext ctx) {
boolean response = packet.hasStatus(QPacket.MASK_RESPONSE);
// 业务处理
final short c = packet.getC();
switch (c) {
case QOpCode.QPRODUCE:
if (produceHandler != null) {
QProduce produce = packet.toProduce();
produceHandler.onReceive(ctx, packet, produce);
}
break;
case QOpCode.QCONSUME:
if (consumeHandler != null) {
QConsume qConsume = packet.toConsume();
consumeHandler.onReceive(ctx, packet, qConsume);
}
break;
case QOpCode.QSUBSCIBE:
if (subscribeHandler != null) {
Collection<QSubscribe> qSubscribe = packet.toSubscribe();
subscribeHandler.onReceive(ctx, packet, qSubscribe);
}
break;
case QOpCode.QRPC:
response = false;
// 业务回写请求
if (rpcHandler != null) {
QRpc qRpc = packet.toRpc();
rpcHandler.onReceive(ctx, packet, qRpc);
}
break;
case QOpCode.QCODE:
response = false;
// 响应请求
if (responseHandler != null) {
short code = packet.toCode();
responseHandler.onReceive(ctx, packet, code);
}
break;
default:
throw new QSocketException(QCode.SOCKET_UNKNOWN_OPCODE, " opCode : " + c);
}
}
根据不同的model code 进行解释,然后调用应用层处理
其中应用层处理统一实现 IQReceiveHandler 接口规范处理参数同处理行为
//应用层逻辑
protected IQReceiveHandler<QProduce> produceHandler;
protected IQReceiveHandler<QConsume> consumeHandler;
protected IQReceiveHandler<Collection<QSubscribe>> subscribeHandler;
protected IQReceiveHandler<Short> responseHandler;
protected IQReceiveHandler<QRpc> rpcHandler; //通信层逻辑
protected IQReceiveHandler<Void> acceptHandler;
protected IQReceiveHandler<Void> closeHandler; protected IQReceiveHandler<Void> beforeHandler;
protected IQReceiveHandler<Void> afterHandler;
/**
*
* 响应端 业务逻辑
*
* @author solq
**/
public interface IQReceiveHandler<T> { void onReceive(ChannelHandlerContext ctx,QPacket packet, T body); }
[编织消息框架][设计协议]opCode的更多相关文章
- [编织消息框架][设计协议]优化long,int转换
理论部分 一个long占8byte,大多数应用业数值不超过int每次传输多4byte会很浪费 有没有什么办法可以压缩long或int呢? 答案是有的,原理好简单,如果数值不超过int.max_valu ...
- [编织消息框架][设计协议]bit基础
理论部分 1字节等于8比特,也就是8个二进数,如下面公式 1Byte = 8bits = 0111 1111 1Short = 2Btye 1Int = 4Byte 那学这些有什么用呢? 可以用来做数 ...
- [编织消息框架][netty源码分析]2 eventLoop
eventLoop从命名上看是专门处理事件 事件系统主要由线程池同队列技术组成,有以下几个优点 1.任务出队有序执行,不会出现错乱,当然前提执行线程池只有一个 2.解偶系统复杂度,这是个经典的生产者/ ...
- [编织消息框架][传输协议]sctp
OSI(Open System Interconnect),即开放式系统互联. 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互联模型. 该体系结构标准定义了网络互连的七 ...
- [编织消息框架][JAVA核心技术]动态代理应用4
基础部份: 接下来讲编译JAVA时,生成自定义class 我们用 javax.annotation.processing.AbstractProcessor 来处理 public abstract c ...
- [编织消息框架][网络IO模型]BIO
既然跟网络内容有关就不得不学习网络IO模型,时代在进步,技术也在进步,采取使用那种网络IO模型就已经确定应用程序规模 阻塞IO(blocking IO) 在linux中,默认情况下所有的socket都 ...
- [编织消息框架][消息服务]jmx
JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序.设备.系统等植入管理功能的框架,使用的是RMI技术. 比较经典的应用jdk bin目录下 jcons ...
- [编织消息框架][netty源码分析]4 eventLoop 实现类NioEventLoop职责与实现
NioEventLoop 是jdk nio多路处理实现同修复jdk nio的bug 1.NioEventLoop继承SingleThreadEventLoop 重用单线程处理 2.NioEventLo ...
- [编织消息框架][netty源码分析]7 Unsafe 实现类NioSocketChannelUnsafe职责与实现
Unsafe 是channel的内部接口,从书写跟命名上看是不公开给开发者使用的,直到最后实现NioSocketChannelUnsafe也没有公开出去 public interface Channe ...
随机推荐
- CocosBuilder 多分辨率基础
最近两个项目大量使用了CocosBuilder, 对于开发效率提高是巨大的. 一直计划写一篇博客谈谈CocosBuilder的多分辨率问题, 懒病加上一些疙疙瘩瘩的小事情, 拖延了一个多月, 才终于下 ...
- Bootstrap入门(八)组件2:下拉菜单
Bootstrap入门(八)组件2:下拉菜单 先引入本地的CSS文件和JS文件(注:1.bootstrap是需要jQuery支持的.2.需要在<body>当中添加) <link ...
- 《JAVASCRIPT高级程序设计》客户端检测
web开发的理想状态之一是浏览器支持一组最常用的功能,但是在现实情况下,浏览器间的差异非常大,因此,为了兼容大部分的了浏览器,开发人员首先需要设计最通用的方案,然后再使用客户端检测的技术增强该方案.客 ...
- Linux 菜鸟学习笔记--系统分区
硬盘分区 常识 主分区:最多只能有4个 扩展分区:用于突破主分区最多4个的限制 *最多只能有1个 *主分区+扩展分区最多有4个 *不能写入数据,只能包含逻辑分区 逻辑分区 格式化:实际是写入文件系统, ...
- sass 基础——回顾
1.webstorm 自动编译SASS 下载安装包 http://rubyinstaller.org/downloads/ 然后点击安装,路径为默认路径就行, 勾选以下两项 add Ruby exec ...
- sqlite数据库学习
1.0版代码: package com.swust.sqlitedatabase.test; import com.swust.sqlitedatabase.myOpenHelper; import ...
- tomcat启动异常、和web.xml缺少配置异常
错误如下: 14-Feb-2017 10:50:00.665 SEVERE [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.Sta ...
- Windows程序员必须知道的字符编码和字符集
字符编码 (Character encoding) 在存储和传递文本过程中,为了使得所有电脑都能够正确的识别出文本内容,需要有一个统一的规则. 2. 字符集 (Character Set) ) 一般 ...
- vue路由组件群
import Vue from 'vue'import VueRouter from 'vue-router'Vue.use(VueRouter) const first = { template: ...
- JavaScript 基本类型值-Undefined、Null、Boolean
▓▓▓▓▓▓ 大致介绍 ECMAScript中有5中简单的数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number.String. ▓▓▓▓▓▓ Undefined ...