Hessian源码浅析-HessianSkeleton

hessian原理服务端源码分析(三) 上一篇文章分析了hessian客户端的源码,其实服务端的源码分析与客户端的差不多,只是服务端是先接收客户端的请求,将请求参数进行反序列化,再处理,将结果序列化转换成流返回给客户端,由于有了客户端源码分析,其他的就不多说了,直接上代码 1.为了能够跟进hessian服务端的源码,首先我们需要将导入hessian的jar包替换成源码,下面是我导入hessian源码的目录结构: 2.根据我们在he 阅读详情

Hessian服务端核心对象HessianSkeleton 主要做两件事

1.把客户端请求的流反序列化  得到 对应的方法名称 参数

2. 服务类(service)对应方法执行完成 把结果序列化到输出流

hessian服务端暴露服务是通过HessianServlet 

public class HessianServlet extends GenericServlet {
}

HessianServlet 的init方法主要初始化服务类(service) 和HessianSkeleton  每一个服务类对应一个HessianSkeleton  在HessianSkeleton中持有业务类的引用

	public void init(ServletConfig config) throws ServletException {
		super.init(config);

		//web.xml中home-class,service-class配置服务的实现类
		if (_homeImpl != null) {
			
		} else if (getInitParameter("home-class") != null) {
			String className = getInitParameter("home-class");

			Class homeClass = loadClass(className);

			_homeImpl = homeClass.newInstance();

			init(_homeImpl);
		} else if (getInitParameter("service-class") != null) {
			String className = getInitParameter("service-class");

			Class homeClass = loadClass(className);

			_homeImpl = homeClass.newInstance();

			init(_homeImpl);
		} else {
			if (getClass().equals(HessianServlet.class))
				throw new ServletException(
						"server must extend HessianServlet");

			_homeImpl = this;
		}
		//web.xml配置的 服务类实现接口 
		if (_homeAPI != null) {
		} else if (getInitParameter("home-api") != null) {
			String className = getInitParameter("home-api");

			_homeAPI = loadClass(className);
		} else if (getInitParameter("api-class") != null) {
			String className = getInitParameter("api-class");

			_homeAPI = loadClass(className);
		} else if (_homeImpl != null) {
			//如果没有配置服务实现类的接口  递归 找到服务类最顶层的接口
			_homeAPI = findRemoteAPI(_homeImpl.getClass());

			if (_homeAPI == null)
				_homeAPI = _homeImpl.getClass();
		}
		//TODO 
		_homeSkeleton = new HessianSkeleton(_homeImpl, _homeAPI);
	}

service方法 

	public void service(ServletRequest request, ServletResponse response)
			throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;
		//必须是post方式
		if (!req.getMethod().equals("POST")) {
			res.setStatus(500, "Hessian Requires POST");
			PrintWriter out = res.getWriter();
			res.setContentType("text/html");
			out.println("<h1>Hessian Requires POST</h1>");
			return;
		}
		String serviceId = req.getPathInfo();
		String objectId = req.getParameter("id");
		if (objectId == null)
			objectId = req.getParameter("ejbid");
		//保存到ThreadLocal中
		ServiceContext.begin(req, serviceId, objectId);
		try {
			InputStream is = request.getInputStream();
			OutputStream os = response.getOutputStream();
			response.setContentType("application/x-hessian");
			SerializerFactory serializerFactory = getSerializerFactory();
			//交给HessianSkeleton invoke方法处理
			invoke(is, os, objectId, serializerFactory);
		} finally {
			ServiceContext.end();
		}
	}

HessianSkeleton invoke方法核心代码 

  public void invoke(Object service,
                     AbstractHessianInput in,
                     AbstractHessianOutput out)
    throws Exception
  {
    //..略
	//反序列化 获得方法名称
    String methodName = in.readMethod();
    int argLength = in.readMethodArgLength();

    Method method;
    //_methodMap中获得对应的方法 
    method = getMethod(methodName + "__" + argLength);
    // ..略
    Class<?> []args = method.getParameterTypes();
    //获得方法参数
    Object []values = new Object[args.length];
    for (int i = 0; i < args.length; i++) {
      // XXX: needs Marshal object
      values[i] = in.readObject(args[i]);
    }
    Object result = null;
    try {
      result = method.invoke(service, values);
    } catch (Exception e) {
    	//...略
      return;
    }
    in.completeCall();
    // AbstractHessianOutput 序列化方法返回值
    out.writeReply(result);
    out.close();
  }

spring集成Hessian插件配置改成自动注入。 NULL 博文链接:https://xiaofancn.iteye.com/blog/2356498 立即下载

相关推荐

染色体外环状DNA:肿瘤研究新方向

染色体外环状DNA(ecDNA)是癌症中活化原癌基因扩增的主要方式。区别于常染色体,这类生物大分子主要以环状的形式存在于细胞核当中,长度分布在103-106数量级,无中心粒。ecDNA序列中包含一个或者多个基因与调控元件,结构开放,转录活性强,相比于在棒状染色体结构基因,ecDNA的生物功能活性更强。癌症中,成环的基因区域拷贝数往往增高,而超过一半的高拷贝数事件是ecDNA驱动生成。...

blackjimmy的博客 765

Hessian Requires POST,没有出现

如果正确写对了web.xml的话,启动服务,却没有出现Hessian Requires POST,建议可以在浏览器输入:项目后面加上你的业务接口类的名字

程序员小嗨 791

智能驾驶小白必看:MEB低速紧急制动系统的工作原理与传感器配置详解

本文深入解析了MEB低速紧急制动系统的工作原理与传感器配置。该系统作为智能驾驶的关键安全冗余,专为应对停车场、拥堵路段等复杂低速场景设计。文章详细拆解了其如何通过超声波雷达、环视摄像头等传感器融合感知环境,并基于碰撞时间(TTC)等模型进行风险评估与分级制动,最终实现主动防碰撞,是智能驾驶技术实用化的重要体现。

c2d3e4f的博客 1131

hessian调用只支持post方法

今天看hessian(版本4.0.7)调用源码时候发现com.caucho.hessian.server.HessianServlet的service方法有以下几句: [code="java"] HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletRe...

sd_zyl的专栏 595

【BigWorld 游戏服务器引擎】Cell 架构设计介绍,及Java实现方案的探索

横向扩展(Scalability):通过动态增减CellApp和BaseApp的数量,可以轻松应对玩家人数的变化。世界可以做得非常大,只需增加更多的 Cell。负载分离(Load Separation):将不同性质的负载分离,避免了单一进程瓶颈。CPU 密集型的实时计算(CellApp)和 I/O 密集型的数据操作(BaseApp)互不影响。高效的视野管理(AOI):每个 Cell 只关心自己区域内和边界上的实体,大大降低了计算复杂度。容错性:某个CellApp。

代码时光 1205

免费获取船舶轨迹数据?手把手教你用Python处理中国海洋卫星AIS数据

本文详细介绍了如何免费获取中国海洋卫星AIS数据,并使用Python进行船舶轨迹数据的处理与分析。从数据源评估到自动化处理流水线,再到高级分析与可视化技巧,手把手教你避开常见问题,实现高效数据处理。特别适合航运数据分析、物流优化和海上安全研究等领域的研究者和开发者。

weixin_42616115的博客 320

Hessian 配置时遇到的浏览器报500错误

在配置Hessian的时候,明明已经照着网上的教程配置好服务器端了,但在测试的时候发现并没有出现预期的Hessian Requires Post 字样,反而是服务器500错误。         奇怪之处在于此时的eclipse并没有报异常,在经过多次检查后,发现客户端可以连接服务器端,尽管服务器端一直都在报错。         初步猜测,可能是浏览器的问题(使用的是Google浏览器)。  

qq_22231211的博客 956

游程理论提取灾害事件特征V2---基于MATLAB语言的编程实现

游程理论,灾害事件,MATLAB

EWBA_GIS_RS_ER的博客 3793

Hessian学习总结(一)——Hessian入门

一、远程通讯协议的基本原理   网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络 IO 来实现,其中传输协议比较出名的有 http 、 tcp 、 udp 等等, http 、 tcp 、 udp 都是在基于 Socket 概念上为某类应用场景而扩展出的传输协议,网络 IO ,主要有 bio 、 nio 、 aio 三种方式,所有的分布式应用通讯都基于这个原理而实现...

weixin_33890499的博客 384

Xilinx FPGA 100G RDMA开发实战:基于AXI Lite配置的ROCE V2高速通信系统搭建

本文详细介绍了在Xilinx FPGA上搭建100G ROCE V2高速通信系统的实战过程。通过分析RDMA技术优势与FPGA实现的必要性,重点阐述了基于AXI Lite接口配置ERNIC IP核的关键步骤,包括硬件系统构建、驱动开发及与商用网卡的互通测试,旨在实现兼具高性能与灵活性的网络加速方案。

js777的博客 576

ABAP Bits and Bytes 完全参考,理解内存、字节、位运算与类型解释

ABAP开发中业务代码与底层字节处理的差异:业务层关注采购订单、会计凭证等语义信息,而接口开发需处理十六进制、位运算等底层操作。文章通过整数变量示例说明同一段字节在不同类型解释下会呈现不同值,并介绍x类型、位运算及类型转换的实际应用。这些知识在文件接口、加密传输等场景中尤为重要,开发者需注意字节序、编码等问题。建议将底层协议处理与业务逻辑分离,以保持代码清晰和可维护性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 142

Hessian的使用以及理解

Hessian的使用以及理解 Hessian版本:3.1.5 将包括如下的内容: Hessian的基本使用 Hessian的原理 Hessian和Spring 的结合使用 扩展 简单说来,Hessian是一个轻量级的RPC框架(RPC是什么?请参考这里)。它基于HTTP协议传输,使用Hessian二进制序列化,对于数据包比较大的情况比较友好。但是它的参数和返回值都需要实现Serializable接口

绝望的生鱼片 5万+

开源模型应用落地-qwen模型小试-入门篇(二)

在windows环境下,使用transformer设置模型参数/System Prompt/历史对话

以微薄之力,予他人些许温暖. 3237

Hessian源码分析--HessianSkeleton

HessianSkeleton是Hessian的服务端的核心,简单总结来说:HessianSkeleton根据客户端请求的链接,获取到需要执行的接口及实现类,对客户端发送过来的二进制数据进行反序列化,获得需要执行的函数及参数值,然后根据函数和参数值执行具体的函数,接下来对执行的结果进行序列化然后通过连接返回给客户端。 接下来我们按照源码一步一步进行分析,在上一篇博客Hessian源码分析--He

井底之蛙 2589

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Hessian源码分析(三)------ HessianSkeleton

HessianSkeleton是Hessian server端的核心类,主要功能是接收网络输入流(被包装为AbstractHessianInput),反序列化输入流得到methodName和参数,然后调用服务端的服务,得到结果后序列化为输出流,返回给客户端,主要流程如下图所示:HessianSkeleton的核心代码如下所示:public void invoke(Object se

走向架构师之路 6307

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Hessian源码分析-Server端

1 HessianServlet 2 HessianSkeleton 参考 Hessian源码分析–HessianServlet Hessian源码分析–HessianSkeleton

添仔哥哥 420

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Hessian源码分析--总体架构

Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。         Hessian理解起来也是比较简单的,其主要结构分为客户端和服务端,中间是基于http传输的。客户端主要做的事情就是把对远程接口调用序列化为流,并

井底之蛙 2336

hessian——源码分析(三)------ HessianSkeleton

HessianSkeleton是Hessian server端的核心类,主要功能是接收网络输入流(被包装为AbstractHessianInput),反序列化输入流得到methodName和参数,然后调用服务端的服务,得到结果后序列化为输出流,返回给客户端,主要流程如下图所示: HessianSkeleton的核心代码如下所示:   [java] view plaincopy...

刨根问底,挖到祖坟 165

Hessian源码分析

hessian的主要结构分客户端与服务端,中间基于http传输。客户端主要做的事情是把对远程接口调用序列化为流,并传输到服务端;服务端主要做的事情是把传输过来的流反序列化为对服务的请求,调用相应服务后把结果序列化为流返回给客户端。一次完整的调用如下图所示: HessianProxy是hessian client处理客户端请求的核心类,它采用proxy的设计模式,代理客户端对远程接口...

lqq19860619的博客 119

hessian源码分析

1.hessian源码分析(一)------架构 hessian的主要结构分客户端与服务端,中间基于http传输。客户端主要做的事情是把对远程接口调用序列化为流,并传输到服务端;服务端主要做的事情是把传输过来的流反序列化为对服务的请求,调用相应服务后把结果序列化为流返回给客户端。一次完整的调用如下图所示: HessianProxy是hessian client处理客户端请求的核心类,它...

lqq19860619的博客 199
上一篇: Hessian入门
下一篇: Hessian源码浅析-HessianProxy
胸口碎大石_
博客等级 码龄17年 1154粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值