浅析利用Hessian跨Web网站发送数据包

笔者,不玩游戏已经有一个月的时间了。昨天偶然发现大家都在玩吃鸡,于是好奇心作祟,昨个不知不觉就到了5点多。笔者现在的电脑配置是10年前的,现在最大的期待是能够有一台配置高、外观漂亮的电脑。好了,每天闲扯一下其实很开心,也主要是现在的游戏大都是3D体验感的,笔者晕3D渲染(配置低的电脑更明显),没办法啊。好了废话不多说了,现在我们实现一种跨Web网站的数据推送技术:从当前的Web网站生成一个数据文件包,然后将该数据文件包推送到另一个Web网站中,实现网站展现效果的实时推送。对此,笔者尝试使用Hessian解决跨Web服务进行服务器间的数据推送。
总结一下hessian:
1、 相比WebService,Hessian更简单、快捷。
2、采用的是二进制RPC协议
RPC是指远程过程调用协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。
3、对象必须进行序列化
由于使用二进制RPC协议传输数据,对象必须进行序列化,实现Serializable 接口
4、通过 Hessian 本身提供的 API 来发起请求。
5 、Hessian 通过其自定义的串行化机制将请求信息进行序列化,产生二进制流。
6、Hessian 基于 Http 协议进行传输。
7、响应端根据 Hessian 提供的 API 来接收请求。
8、Hessian 根据其私有的串行化机制来将请求信息进行反序列化,传递给使用者时已是相应的请求信息对象了。
9 、处理完毕后直接返回, hessian 将结果对象进行序列化,传输至调用端。
调用端通过 HessianProxyFactory 的 create 方法就是创建接口的代理类,该类实现了接口, JDK 的 proxy 类会自动用 InvocationHandler 的实现类(该类在 Hessian 中表现为 HessianProxy )的 invoke 方法体来填充所生成代理类的方法体。
Hessian 的这个远程过程调用,完全使用动态代理来实现的。
除去 spring 对其的封装,调用端主要是通过 HessianProxyFactory 的 create 方法就是创建接口的代理类,该类实现了接口, JDK 的 proxy 类会自动用 InvocationHandler 的实现类(该类在 Hessian 中表现为 HessianProxy )的 invoke 方法体来填充所生成代理类的方法体。
调用端系统启动时:
根据 serviceUrl 和 serviceInterface 创建代理。
HessianProxyFactoryBean 类
HessianClientInterceptor 类
createHessianProxy(HessianProxyFactory proxyFactory)
HessianProxyFactory 类
public Object create(Class api, String urlName)
调用端调用 hessian 服务时:
HessianProxy 类的 invoke(Object proxy, Method method, Object []args) 方法
String methodName = method.getName();// 取得方法名
Object value = args[0]; // 取得传入参数
conn = sendRequest(mangleName, args) ; // 通过该方法和服务器端取得连接
httpConn = (HttpURLConnection) conn;
code = httpConn.getResponseCode(); // 发出请求
// 等待被调用端返回相应…………
is = conn.getInputStream();
Object value = in.readObject(method.getReturnType()); // 取得返回值
HessianProxy 类的 URLConnection sendRequest(String methodName, Object []args) 方法:
URLConnection conn = _factory.openConnection(_url); // 创建 URLConnection
OutputStream os = conn.getOutputStream();
AbstractHessianOutput out = _factory.getHessianOutput(os); // 封装为 hessian 自己的输入输出 API
out.call(methodName, args);
return conn;
被调用端接收请求并处理请求
被调用端截获相应请求交给:
org.springframework.remoting.caucho.HessianServiceExporter
具体处理步骤如下:
a) HessianServiceExporter 类
(HessianExporter) invoke(request.getInputStream(), response.getOutputStream());
b) HessianExporter 类
(Hessian2SkeletonInvoker) this.skeletonInvoker.invoke(inputStream, outputStream);
c) Hessian2SkeletonInvoker 类
将输入输出封转化为转化为 Hessian 特有的 Hessian2Input 和 Hessian2Output
Hessian2Input in = new Hessian2Input(isToUse);
in.setSerializerFactory(this.serializerFactory);
AbstractHessianOutput out = null;
int major = in.read();
int minor = in.read();
out = new Hessian2Output(osToUse);
out = new HessianOutput(osToUse);
out.setSerializerFactory(this.serializerFactory);
(HessianSkeleton) this.skeleton.invoke(in, out);
d) HessianSkeleton 类
读取方法名
String methodName = in.readMethod();
Method method = getMethod(methodName);
读取方法参数
Class []args = method.getParameterTypes();
Object []values = new Object[args.length];
执行相应方法并取得结果
result = method.invoke(service, values);
结果写入到输出流
out.writeObject(result);
总结: 由上面源码分析可知,被调用端接收处理请求都是通过 hessian 自己的 API 。输入输出流都要封装为 hessian 自己的 Hessian2Input 和 Hessian2Output
笔者一直坚信,简单代码迭代出复杂功能。
下篇继续,实地过程中的hessian,跨Web服务的数据推送。
参考资料《Hessian百度百科》

原文地址:http://blog.51cto.com/13479739/2160472

时间: 2024-10-23 14:41:08

浅析利用Hessian跨Web网站发送数据包的相关文章

利用fiddler抓取Android app数据包

前言 做Android开发的朋友经常需要做网络数据的获取和提交表单数据等操作,然而对于调试程序而言,很难知道我们的数据到底是以怎样的形式发送的,是否发送成功,如果发送失败有是什么原因引起的.fiddler工具为我们提供了很方便的抓包操作,可以轻松抓取浏览器的发出的数据,不管是手机APP,还是web浏览器,都是可以的. 什么是fiddler 百度百科上是这样说的:Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的"进出&quo

Linux网络之设备接口层:发送数据包流程dev_queue_xmit

转自:http://blog.csdn.net/wdscq1234/article/details/51926808 写在前面 本文主要是分析kernel-3.8的源代码,主要集中在Network的netdevice层面,来贯穿interface传输数据包的流程,kernel 博大精深,这也仅仅是一点个人愚见,作为一个笔记形式的文章,如有错误或者表述不当之处,还请大家留言批评指正,非常感谢! 主要涉及的file:kernel-3.18/net/core/dev.c kernel-3.18/net

winpcap 发送数据包

第一:打开VS2010,创建一个新的项目,再对VS做一些设置.如下: 项目-->**属性(alt+F7)配置属性-->清单工具-->输入和输出-->嵌入清单-->否 项目-->**属性(alt+F7)配置属性-->C/C++-->常规-->附加包含目录--> 项目-->**属性(alt+F7)配置属性-->链接器-->常规-->附加库目录--> 项目-->**属性(alt+F7)配置属性-->链接器--&

发送数据包

#include "stdafx.h" #include <stdlib.h>#include <stdio.h> #include <pcap.h> void main(int argc, char **argv){pcap_t *fp;char errbuf[PCAP_ERRBUF_SIZE];u_char packet[100];int i;pcap_if_t *alldevs;pcap_if_t *d;int inum;int j=0; /*

VC模拟发送数据包-百度关键词查找

VC模拟发送数据包-百度关键词查找 逗比汪星人2009-09-06上传 VC模拟发送数据包-百度关键词abcdef查找 详情 http://blog.csdn.net/wangningyu http://download.csdn.net/detail/wangningyu/1637723

使用Charles检测HTTPS网站的数据包

1.下载Charles 下载地址:https://www.charlesproxy.com/download/ 2.安装Charles的证书 选择Help->SSL Proxying->Install Charles Root Certificate 打开钥匙串,设置信任Charles的根证书 3.Charles开启HTTPS监听 首先开启HTTP监听 设置HTTP监听的端口号和Socket监听的端口号 下面开启HTTPS监听 设置HTTPS监听的端口号,端口号前面的星号可以换成域名 4.给i

TCP和UDP发送数据包的大小问题

用UDP协议发送时,用sendto函数最大能发送数据的长度为:65535-20-8=65507字节,其中20字节为IP包头长度,8字节为UDP包头长度.用sendto函数发送数据时,如果指的的数据长度大于该值,则函数会返回错误. 用TCP协议发送时,由于TCP是数据流协议,因此不存在包大小的限制(暂不考虑缓冲区的大小),这是指在 用send函数时,数据长度参数不受限制.而实际上,所指定的这段数据并不一定会一次性发送出去,如果这段数据比较长,可能会被分段发送,如果比较短,可能会等待和下一次数据一起

raw socket 发送数据包

TRawSocket = class(TObject) private buf: array[0..BUFLEN - 1] of char; FdwNotifyWnd: Cardinal; hsocket: Cardinal; str: string; public constructor Create; destructor Destroy; override; function createSocket: Integer; procedure destroySocket; function

Linux命令(35):ping命令-向网络主机发送数据包

ping命令 功能说明 ping是最常用的网络连接命令,ping会向指定的网络主机发送特殊网络数据包IMCP ECHO_REQUEST.多数网络设备收到该数据包会做出回应,通过此方法即可难网络连接是否正常,用法如下: ping [参数] [主机名或IP] 常用参数 选项 说明 -c 发送指定数据包后停止 -s 指定发送的数据字节数,预设值是56 -t 设置存活数值TTL的大小 -i 设置秒数,每隔几秒发送一次数据包,默认是1秒 示例                     测试连接性 [[ema