码迷,mamicode.com
首页 > 其他好文 > 详细

16进制格式数据传输的服务框架——xxl-hex

时间:2015-11-28 19:57:22      阅读:948      评论:0      收藏:0      [点我收藏+]

标签:

github:https://github.com/xuxueli/xxl-hex

git.osc:http://git.oschina.net/xuxueli0323/xxl-hex

博客地址(内附使用教程):http://www.cnblogs.com/xuxueli/p/5003305.html

 

Tips:这篇基于hex的通讯方案,和网上其他的,或者你目前了解的完全不是同一个玩意儿,疑惑看代码;

简介:xxl-hex是一个轻量级的remoting onhttp工具,使用简单的方法提供了rpc的功能。 采用的是16进制编码协议,拥有以下特点:1、数据加密;2、跨语言;

跨语言,数据传输方案

  JSON:一种轻量级的数据交换格式,完全独立于语言(Bean对象 》》》 Json字符串);

  XML:可扩展标记语言,设计宗旨是传输数据(Bean对象 》》》 XML字符串);

  xxl-hex(本方案):一种需要预定规则的Hex数据传输方案(Bean对象 》》》 Hex字符串);

通讯方案HttpClient + Servlet

在设计xxl-hex之前,可选的通讯方案有NETTY、MINA、JETTY等等(可以参考我的另一个轮子:http://www.cnblogs.com/xuxueli/p/4845111.html),但是出于kiss考虑,使用最方便系统集成的HttpClient+Servlet方式;

实现原理,部分逻辑点介绍

  1、总调用逻辑为:Client端封装IRequest编码为Hex后Post给Server端,Server端解码后匹配Handler执行handle逻辑后分装IResponse响应给Client端,Client接收后,一次请求Finish。

  2、IRequest消息结构:IRequest消息首部存放该消息的ClassName,服务端可以根据ClassName反射实例化IRequest,并且匹配Handler执行handle逻辑;

  3、IRequest匹配Handler:服务端维护一张消息哈希表,根据请求消息的ClassName可以定位到处理的Handler,例如:handlerMap.put("com.xxl.demo.msg.request.DemoRequest", "com.xxl.service.impl.DemoHandler");

  4、Server端注册Handler:业务Handler必须为IHandler的子类并且需要被启动时初始化(可通过声明为Spring的Service搞定),无参构造里调用super.registry(XRequest.class);即可完成与XRequest的关系匹配;

使用教程

1、引入依赖(自行打JAR包,如若需要提供JAR包,可以给我邮件):

<dependency>
  <groupId>com.xxl</groupId>
  <artifactId>xxl-hex-core</artifactId>
  <version>0.0.1-SNAPSHOT</version>
</dependency>

2、API开发:Request、Response

package com.xxl.demo.msg.request;

import com.xxl.hex.core.codec.impl.IRequest;


public class DemoRequest extends IRequest {
	
	private String param;
	
	public String getParam() {
		return param;
	}
	public void setParam(String param) {
		this.param = param;
	}
	
}

  

package com.xxl.demo.msg.response;

import com.xxl.hex.core.codec.impl.IResponse;

public class DemoResponse extends IResponse {
	
	private String result;

	public String getResult() {
		return result;
	}

	public void setResult(String result) {
		this.result = result;
	}
	
}

 3、Server端开发:

  配置hexServlet:

     <servlet>
		<servlet-name>hexServlet</servlet-name>
		<servlet-class>com.xxl.hex.http.servlet.HexServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>hexServlet</servlet-name>
		<url-pattern>/hexServlet</url-pattern>
	</servlet-mapping>

  开发Handle:

package com.xxl.service.impl;

import org.springframework.stereotype.Service;

import com.xxl.demo.msg.request.DemoRequest;
import com.xxl.demo.msg.response.DemoResponse;
import com.xxl.hex.core.codec.impl.IRequest;
import com.xxl.hex.core.codec.impl.IResponse;
import com.xxl.hex.core.handler.IHandler;

@Service
public class DemoHandler extends IHandler{
	
	public DemoHandler() {
		super.registry(DemoRequest.class);
	}

	@Override
	public IResponse handle(IRequest request) {
		DemoRequest msg = (DemoRequest) request;
		DemoResponse res = new DemoResponse();
		res.setCode(200);
		res.setMsg("success");
		
		res.setResult("hi, jack. (" + msg.getParam() + ")");
		return res;
	}
	
}

4、Client端:

          DemoRequest request = new DemoRequest();
		request.setParam("hi, lucy.");
		String request_hex = ByteHexConverter.byte2hex(request.toHexByte());
		System.out.println(request_hex);
		
		String url = "http://localhost:8080/xxl-hex-demo-server/hexServlet";
		String response_hex = HttpUtil.sendHex(url, request_hex);
		System.out.println(response_hex);
		
		DemoResponse msg = (DemoResponse) DemoResponse.class.newInstance().fillHexByte(ByteHexConverter.hex2Byte(response_hex));
		System.out.println(BeanUtils.describe(msg));

  

运行截图:

  Server端:注册Handler

技术分享

  Client端:请求日志,log请求数据串;

技术分享

16进制格式数据传输的服务框架——xxl-hex

标签:

原文地址:http://www.cnblogs.com/xuxueli/p/5003305.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!