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

Java服务器的JSON数据包三重加密算法(转载)

    博客分类:
  • java
 
阅读更多
mina的粘包拆包其实是蛮简单的,只是一开始没搞清楚原理。
Java服务器的JSON数据包三重加密算法
我们要约定数据包的格式,我这里的是(4个字节长度+json的string字符串)

1:写一个
ProtocolCodecFactory类,用来拦截数据包处理
内容如下
public class MessageCodecFactory implements ProtocolCodecFactory {
    private final DataEncoderEx encoder;
    private final DataDecoderEx decoder;
    
    public MessageCodecFactory() {
        encoder = new DataEncoderEx();
        decoder = new DataDecoderEx();
    }

    /* (non-Javadoc)
     * @see org.apache.mina.filter.codec.ProtocolCodecFactory#getDecoder(org.apache.mina.core.session.IoSession)
     */
    @Override
    public ProtocolDecoder getDecoder(IoSession session) throws Exception {
        return decoder;
    }

    /* (non-Javadoc)
     * @see org.apache.mina.filter.codec.ProtocolCodecFactory#getEncoder(org.apache.mina.core.session.IoSession)
     */
    @Override
    public ProtocolEncoder getEncoder(IoSession session) throws Exception {
        return encoder;
    }
}

2:在chain里面注册解码器
chain.addLast("codec", new ProtocolCodecFilter(new MessageCodecFactory()));
注意放在多线程上面,否则会导致解码混乱的情况
3:实现decode和encoder
CumulativeProtocolDecoder 这个类的作用很好,我贴一个网上的总结
A. 你的doDecode()方法返回true 时,CumulativeProtocolDecoder 的decode()方法会首
先判断你是否在doDecode()方法中从内部的IoBuffer 缓冲区读取了数据,如果没有,

则会抛出非法的状态异常,也就是你的doDecode()方法返回true 就表示你已经消费了
本次数据(相当于聊天室中一个完整的消息已经读取完毕),进一步说,也就是此时你
必须已经消费过内部的IoBuffer 缓冲区的数据(哪怕是消费了一个字节的数据)。如果
验证过通过,那么CumulativeProtocolDecoder 会检查缓冲区内是否还有数据未读取,
如果有就继续调用doDecode()方法,没有就停止对doDecode()方法的调用,直到有新
的数据被缓冲。
B. 当你的doDecode()方法返回false 时,CumulativeProtocolDecoder 会停止对doDecode()
方法的调用,但此时如果本次数据还有未读取完的,就将含有剩余数据的IoBuffer 缓
冲区保存到IoSession 中,以便下一次数据到来时可以从IoSession 中提取合并。如果
发现本次数据全都读取完毕,则清空IoBuffer 缓冲区。
简而言之,当你认为读取到的数据已经够解码了,那么就返回true,否则就返回false。这
个CumulativeProtocolDecoder 其实最重要的工作就是帮你完成了数据的累积,因为这个工
作是很烦琐的。


也就是说返回true,那么CumulativeProtocolDecoder会再次调用decoder,并把剩余的数据发下来
返回false就不处理剩余的,当有新数据包来的时候把剩余的和新的拼接在一起然后再调用decoder

public class DataDecoderEx extends CumulativeProtocolDecoder {

@Override
protected boolean doDecode(IoSession session, IoBuffer in,
ProtocolDecoderOutput out) throws Exception {
// TODO Auto-generated method stub

if(in.remaining()<4)//这里很关键,网上很多代码都没有这句,是用来当拆包时候剩余长度小于4的时候的保护,不加就出错咯 
{ 
return false;
}
        if (in.remaining() > 1) {
         
            in.mark();//标记当前位置,以便reset 
            int length =in.getInt(in.position());
         
            if(length > in.remaining()-4){//如果消息内容不够,则重置,相当于不读取size   
            System.out.println("package notenough  left="+in.remaining()+" length="+length);
                in.reset();   
                return false;//接收新数据,以拼凑成完整数据   
            }else{  
            System.out.println("package ="+in.toString()); 
            in.getInt();
             
                byte[] bytes = new byte[length]; 
                in.get(bytes, 0, length);   
                String str = new String(bytes,"UTF-8");    
                if(null != str && str.length() > 0){   
                String strOut = DateSecret.decryptDES(str);//别看这里的处理,这里是我的数据包解密算法~你可以直接拿str当数据
                out.write(strOut);    
                }   
                if(in.remaining() > 0){//如果读取内容后还粘了包,就让父类再给一次,进行下一次解析  
                //System.out.println("package left="+in.remaining()+" data="+in.toString()); 
                }   
                return true;//这里有两种情况1:没数据了,那么就结束当前调用,有数据就再次调用
            }   
        }   
        return false;//处理成功,让父类进行接收下个包   
}
}
public class DataEncoderEx extends ProtocolEncoderAdapter{

/* (non-Javadoc)
     * @see org.apache.mina.filter.codec.ProtocolEncoder#encode(org.apache.mina.core.session.IoSession, java.lang.Object, org.apache.mina.filter.codec.ProtocolEncoderOutput)
     */
    public void encode(IoSession session, Object message,
            ProtocolEncoderOutput out) throws Exception {
    System.out.println(message);
    IoBuffer buf = IoBuffer.allocate(100).setAutoExpand(true);
    String strOut = DateSecret.encryptDES(message.toString());//别看这里的处理,这里是我的数据包加密算法~你可以直接拿message.toString当数据
    buf.putInt(strOut.getBytes(Charset.forName("utf-8")).length);
buf.putString(strOut,Charset.forName("utf-8").newEncoder());
buf.flip();
out.write(buf);
    }

}



这样基本没神马问题,如有问题我会继续补充
分享到:
评论

相关推荐

    JSON数据包

    JSON数据包通常包含了库和工具,使得开发者能够方便地在Java环境中处理JSON。 在你提到的压缩包中,包括了`jsonlib`, `fastjson`, 和 `gson`这三个流行的Java JSON库。接下来,我们将详细探讨这三个库的特点和使用...

    返json数据包接口示例

    本示例聚焦于“返json数据包接口”,我们将深入探讨如何在.NET环境中创建这样一个接口,并通过具体的代码文件`ApiUinfo.ashx`和`ApiUinfo.ashx.cs`来理解其实现细节。 首先,`ApiUinfo.ashx`文件通常代表一个HTTP...

    Java组装json和java解析json数组

    附件内容为:Java组装map数据,然后转换为json数据格式;Java解析json数据

    Java实现的RSA加密解密算法示例

    Java实现的RSA加密解密算法示例 本文主要介绍了Java实现的RSA加密解密算法,结合实例形式分析了Java RSA加密解密算法的相关实现技巧。 知识点1:RSA加密解密算法简介 RSA加密解密算法是一种非对称加密算法,由Ron...

    河南省市县区JSON数据包.zip

    河南省市区县JSON数据包(176个文件,含18地级市,以及县市辖区),echarts geo 专用,如有需要其他省份数据下载地址:http://datav.aliyun.com/tools/atlas/ 一个一个下载整理。

    echarts实现地图以地名命名的河南省各地市区县JSON数据包.zip

    在给定的压缩包文件“echarts实现地图以地名命名的河南省各地市区县JSON数据包.zip”中,包含的资源是用于在ECharts中展示河南省地图的关键数据。 地图可视化通常需要特定的地理信息数据,这些数据以JSON格式存储,...

    JAVA-JSON工具转换类

    可能包含的方法有`toJson()`(将Java对象转换为JSON字符串)、`fromJson()`(将JSON字符串解析为Java对象)、`convertToMap()`(将JSON字符串转换为Map)以及`convertToList()`(将JSON字符串转换为List)等。...

    java 解析 json文件 java 解析 json文件

    Java解析JSON文件是Java开发中常见的一项任务,特别是在与Web服务交互或处理API响应时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其简洁和易于阅读及编写的特点,被广泛应用于网络数据传输...

    JAVA中用到的json包

    在Java编程语言以及基于J2EE的企业级应用开发中,JSON(JavaScript Object Notation)是一种广泛使用的轻量级数据交换格式。它易于人阅读和编写,同时也容易让机器解析和生成。JSON包在Java中扮演着至关重要的角色,...

    java服务端生成json(json服务端)

    Java服务端生成JSON是Web应用开发中的常见任务,主要用于数据交换。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在Java中,我们可以使用多种库来...

    省市县三级联动+全国行政区划json数据包

    这些数据通常是JSON格式,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在这个文件中,全国的省、市、县(区)的行政信息被组织成键值对的形式,...

    java和.net交换加密算法(.net版本)+(java版本)

    存在一些专门用于Java和.NET之间互操作的库,如protobuf、JSON等,它们可以帮助转换加密后的数据。此外,可以使用HTTP/HTTPS作为传输层,利用SSL/TLS提供端到端的安全通信。 9. **代码示例**: 提供的`.txt`文件...

    java解析json完整案例

    Java解析JSON是一个常见的任务,特别是在开发Web服务或者与API交互时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在Java中,我们可以使用多种库...

    java调用json参数的webservice

    在探讨Java调用带有JSON参数的WebService之前,我们首先需要了解几个关键的技术概念:Java、JSON以及WebService。 Java是一种广泛使用的编程语言,它具有面向对象、跨平台、多线程以及健壮性等特点。Java在企业级...

    java 解析或生成json所需要的包

    学习java解析json所需要的jar文件,包括commons-beanutils-1.8.3.jar、commons-collections-3.2.1.jar、commons-lang-2.5.jar、commons-logging-1.2.jar、ezmorph-1.0.6.jar、json-lib-2.4-jdk15.jar

    echart地图资源json数据包,包含全国各省各市

    在给定的压缩包文件中,"echart地图资源json数据包,包含全国各省各市",意味着这个数据包提供了ECharts用于绘制中国地图的JSON数据。 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读...

    使用Java操作JSON字符串对象

    使用Java操作JSON字符串对象,使用Java操作JSON字符串对象

    Java递归算法构造JSON树形结构

    Java 递归算法构造 JSON 树形结构 Java 递归算法构造 JSON 树形结构是指通过 Java 语言使用递归算法将数据库中的菜单表构建成树形的 JSON 格式发送给第三方。这种方法可以将复杂的树形结构数据转换成易于理解和处理...

    Java中使用Json

    在Java编程中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它使得人和机器都能轻易地阅读和编写。JSON格式基于JavaScript的一个子集,但与语言无关,因此在各种编程语言中,包括Java,都有广泛...

    JAVA操作JSON全套包,无需另外下载一次搞定

    在解析和操作JSON时,这个库能提供更多的数据结构和算法,有助于更高效地处理JSON数据。 5. **commons-beanutils-1.7.0.jar**:Apache Commons BeanUtils库简化了Java Bean的属性操作,提供了一种简单的机制来获取...

Global site tag (gtag.js) - Google Analytics