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

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请求数据串;

时间: 2024-09-29 04:52:30

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

Nginx将utf8编码的url解码成\x的16进制格式导致无法匹配静态文件的问题处理

例如请求/touch/article/北京/full.html,到达nginx后变成/ /touch/article/%E5%8C%97%E4%BA%AC/full.html, Nginx静态文件配置: location ~* ^/touch/article/.*\.html$ { expires -1; root /home/htmlfile; charset UTF-8; if ( !-f $request_filename ){ proxy_pass http://client.api.c

16进制格式的string转化为byte[]

例如将"ae00cf'转化为0xae00cf,"3031"转成new byte[]{0x30,0x31}; public static byte[] GetBytes(string hexString, out int discarded) { discarded = 0; string newString = ""; char c; // remove all none A-F, 0-9, characters for (int i=0; i<he

C语言打印16进制出现0xffffff现象的问题剖析!

今天在博问里面看到一个朋友的问题,大致是在网络程序中,打印出来的16进制数,莫名的出现ffffff.例如,某个byte真是值为0xc9,打印出来确是0xffffffc9.原博问连接如下:http://q.cnblogs.com/q/71073/ 其实类似的问题不是只在网络程序中才会出现的,看示例代码: 1 #include <stdio.h> 2 int main() 3 { 4 char c = 0xc9; 5 printf("A:c = %2x\n",(unsigned

C# 16进制与字符串、字节数组之间的转换

1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制 Console.WriteLine("十进制166的二进制表示: "+Convert.ToString(166, 2)); //十进制转八进制 Console.WriteLine("十进制166的八进制表示: "+Convert.ToString(166, 8)); //十进制转十六进制 Console.WriteLine("十进制166的十六进制表示: "+Con

C# 16进制与字符串、字节数组之间的转换(转)

1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串   //十进制转二进制 Console.WriteLine("十进制166的二进制表示: "+Convert.ToString(166, 2)); //十进制转八进制 Console.WriteLine("十进制166的八进制表示: "+Convert.ToString(166, 8)); //十进制转十六进制 Console.WriteLine("十进制166的十六进制表示: "+C

从16进制转换成汉字

/// <summary> /// 从16进制转换成汉字 /// </summary> /// <param name="hex"></param> /// <returns></returns> public static string GetChsFromHex(string hex) { if (hex == null) throw new ArgumentNullException("hex&qu

16进制和汉字之间的互转!《转》

/****************************16进制转汉字***********************************/AnsiString TForm1::Hex_To_Chinese(AnsiString Hex){        //中英文数字参杂在一起也可以转换        AnsiString ret;        for(int i=1; i<Hex.Length()+1; i += 2)        {                AnsiStrin

C#串口通讯,16进制与字符串、字节数组之间的转换。

1.将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制Console.WriteLine("十进制166的二进制表示: "+Convert.ToString(166, 2));//十进制转八进制Console.WriteLine("十进制166的八进制表示: "+Convert.ToString(166, 8));//十进制转十六进制Console.WriteLine("十进制166的十六进制表示: "+Convert.ToStrin

读取16进制文件和校验图片格式的问题。 文件名后缀

概要: 前段时间,要做这样一个校验:当不符合要求的文件,通过修改文件后缀名后,仍然不允许上传. 我想这是大家经常会遇到的一个校验问题.我才用的办法是:用16进制读取文件头部(不妨成为head),比较head和常见文件头部16进制编码,进行判断. 我个人认为,这个校验方法有弊端,例如当两中不同的文件的文件头编码一样时,一种符合上传要求,一种不符合上传要求,起不到校验功能,例如office 2007和zip. 但是这个方法还是很实用的,毕竟文件头一样的不同文件总是不多的,而且在网站上传是碰到的就更少