在tomcat核心处理中有这么一个需求——“为了提高编码性能,对于socket接收到的字节流不马上进行某种编码的转码,而是应该保留字节流的形式,在需要时、在指定编码时才进行转码工作”。MessageBytes正是为解决这个问题而提出的一个类。

消息字节封装了不同类型方式用于表示信息,它包含了四种类型:T_BYTES、T_CHARS、T_STR、T_NULL,分别表示字节类型、字符类型、字符串类型、空。由于web服务器通信过程使用ASCII码通信,对应的是字节,所以这里选取T_BYTES类型作为案例说明,其他类型与之类似。消息字节的使用方法很简单,假如有一个字节数组byte[] buffer,它坐标的第3到第20之间的字节数组组成的字符表示Request对象中的方法变量的值,那么用以下代码简单表示:

①   public class Request{

MessageBytes methodMB = new MessageBytes();

public MessageBytes method() {

returnmethodMB;

}

}

②   Request request = new Request();

request.method().setBytes(buffer, 3, 18);

执行上面操作后就完成对字节数组的某段进行标记操作,方便以后获取指定的一段字节数组,参照下图,你可以用多个消息字节对buffer标记,例如对请求变量、协议版本等变量进行标记,每个消息字节实例标识了一段字节数组,可以通过如下获取并转为字符串类型:

request.method().toString();

使用起来很简单,接着看下实际实现原理,化繁为简,由于tomcat底层接收的是字节流,于是只考虑T_BYTES的情况。

①   MessageBytes类

public class MessageBytes {

private finalByteChunk byteC = new ByteChunk();

public voidsetBytes(byte[] b, int off, int len) {

byteC.setBytes(b,off, len);

}

public StringtoString() {

returnbyteC.toString();

}

}

②   ByteChunk类

public class ByteChunk {

privatebyte[] buff;

private intstart = 0;

private intend;

public voidsetBytes(byte[] b, int off, int len) {

buff= b;

start= off;

end= start + len;

}

public StringtoString() {

Charsetcharset=Charset.forName("ISO_8859_1");

CharBuffercb = charset.decode(ByteBuffer.wrap(buff, start, end - start));

returnnew String(cb.array(), cb.arrayOffset(), cb.length());

}

}

前面示例中methodMB.setBytes(buffer, 3, 18)其实是调用了ByteChunk的setBytes方法,把字节流及始末坐标设置好,后面methodMB.toString()同样调用了ByteChunk的toString方法,根据指定编码进行转码,这里是ISO_8859_1。这样一来就达到了延迟处理模式的效果,在需要时才根据指定编码转码并获取字符串,不需要的话则无需转,处理性能得到提高。

Tomcat对于socket接收的信息都用消息字节表示,好处是实现一种延迟处理模式,提高性能。而且实际上tomcat还引入了字符串缓存,在转码之前会先从缓存中查找是否有对应的编码的字符串,如果存在则不必再执行转码动作而直接返回对应的字符串,性能进一步得到优化。为了性能我们必须要多做一些额外的工作,这也是tomcat接收到的信息为何不直接用字符串String保存的原因。

喜欢研究java的同学可以交个朋友,下面是本人的微信号:

消息字节——MessageBytes的更多相关文章

  1. NSQ源码剖析——主要结构方法和消息生产消费过程

    目录 1 概述 2 主要结构体及方法 2.1 NSQD 2.2 tcpServer 2.3 protocolV2 2.4 clientV2 2.5 Topic 2.6 channel 3 启动过程 4 ...

  2. WebSocket与消息推送

    B/S结构的软件项目中有时客户端需要实时的获得服务器消息,但默认HTTP协议只支持请求响应模式,这样做可以简化Web服务器,减少服务器的负担,加快响应速度,因为服务器不需要与客户端长时间建立一个通信链 ...

  3. ZeroMQ接口函数之 :zmq_recvmsg – 从一个socket上接收一个消息帧

    ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq-recvmsg zmq_recvmsg(3)         ØMQ Manual - ØMQ/4.1.0 Nam ...

  4. ZeroMQ接口函数之 :zmq_sendmsg – 从一个socket上发送一个消息帧

    ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq-sendmsg zmq_sendmsg(3)        ØMQ Manual - ØMQ/4.1.0 Name ...

  5. HTML5 学习总结(五)——WebSocket与消息推送

    B/S结构的软件项目中有时客户端需要实时的获得服务器消息,但默认HTTP协议只支持请求响应模式,这样做可以简化Web服务器,减少服务器的负担,加快响应速度,因为服务器不需要与客户端长时间建立一个通信链 ...

  6. HTML5 学习笔记(五)——WebSocket与消息推送

    B/S结构的软件项目中有时客户端需要实时的获得服务器消息,但默认HTTP协议只支持请求响应模式,这样做可以简化Web服务器,减少服务器的负担,加快响应速度,因为服务器不需要与客户端长时间建立一个通信链 ...

  7. System V IPC(1)-消息队列

    一.概述                                                    System V三种IPC:消息队列,信号量,共享内存.这三种IPC最先出现在AT&am ...

  8. 消息队列接口API(posix 接口和 system v接口)

    消息队列 posix API 消息队列(也叫做报文队列)能够克服早期unix通信机制的一些缺点.信号这种通信方式更像\"即时\"的通信方式,它要求接受信号的进程在某个时间范围内对信 ...

  9. 【原创】Kafka 0.11消息设计

    Kafka 0.11版本增加了很多新功能,包括支持事务.精确一次处理语义和幂等producer等,而实现这些新功能的前提就是要提供支持这些功能的新版本消息格式,同时也要维护与老版本的兼容性.本文将详细 ...

随机推荐

  1. mycat 1.6 简单的操作实例

    环境: centos7.4 + mysql5.7.20 + mycat1.6单台主机上安装了5台mysql_5.7.20 实例(3306,3307,3308,3309,3310)3306为独立实例 ( ...

  2. Linux配置服务器的一点总结

    一.Linux初始化服务 首先搞清楚四个概念: 进程:正在运行的程序,有自己独立的内存空间. 线程:是进程的下属单位,开销较进程小,没有自己独立的内存空间. 作业:由一系列进程组成,来完成某一项任务. ...

  3. Docker学习笔记【二】

    Docker运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker会从镜像仓库下载该镜像. 1.获取镜像,默认从Docker Hub中获取. 命令 docker pull 2.运行容器, ...

  4. H3C交换机如何配置管理VLAN

    1.输入"system-view"(简写"sys"),进入系统配置模式[H3C],2.下面就可以开始取消默认管理vlan了,输入"undo inter ...

  5. jquery datagrid添加冻结列等

    frozenColumns:[[ { field: 'xh', checkbox: true }, { field: "CZ", title: "操作", wi ...

  6. JPA 的 CascadeType 属性 和 FetchType属性 和 各种映射关系

    代码地址:https://gitee.com/a247292980/lgp20151222 CascadeType CascadeType.PERSIST级联新增(又称级联保存): CascadeTy ...

  7. 数据结构之堆Heap

    1. 概述 堆(也叫优先队列),是一棵完全二叉树,它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆).它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等. 2. 堆 ...

  8. C# 异步转同步

    当我们的程序运行时,调用了一段异步的逻辑A,这段异步的逻辑无法转化为同步(如动画.下载进度等) 而,我们又需要等待异步逻辑A处理完成,然后再执行其它逻辑B. 那就迫切需要将异步转同步了! //参数bo ...

  9. 73. Set Matrix Zeroes(中等)

    Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. 重点是空间复 ...

  10. Structured Streaming + Kafka 集成中遇到的问题

    官方指导:http://spark.apache.org/docs/2.2.0/structured-streaming-kafka-integration.html 1.版本问题  起初用的kafk ...