Hessian源码浅析-HessianProxy

硅谷刷屏的ClawdBot,让Mac mini卖爆了!创始人爆料:一人开发、100% AI 写代码 这两天,个人 AI 助手 ClawdBot 席卷硅谷,国内外社交平台上全是关于它的讨论。 在试用后,网友们纷纷给出了很高的评价。“它是迄今为止最伟大的 AI 应用,相当于你 24 小时全天候专属 AI 员工。”Creator Buddy 创始人兼 CEO Alex Finn 盛赞道,“这就是他们 (Anthropic) 希望 Claude Cowork 呈现的样子。” 阅读详情

Hessian客户端主要是通过proxy代理来实现 当客户端调用远程接口方法时 会被HessianProxy 代理  HessianProxy invoke方法主要做以下工作

1.把调用的 方法名称 参数 序列化

2.通过HttpURLConnection向服务端发送调用请求

3.服务端返回的结果 反序列化

Proxy是由HessianProxyFactory创建

HessianProxyFactory的create方法

	public Object create(Class<?> api, URL url, ClassLoader loader) {
		if (api == null)
			throw new NullPointerException(
					"api must not be null for HessianProxyFactory.create()");
		InvocationHandler handler = null;
		//api  远程接口
		handler = new HessianProxy(url, this, api);
		return Proxy.newProxyInstance(loader, new Class[] { api, HessianRemoteObject.class }, handler);
	}

当调用远程接口的方法时 会激活HessianProxy代理的invoke方法 invoke方法主要向服务端发送请求 反序列化服务端返回的结果

public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		String mangleName;
		// 从缓存中获取methodName
		synchronized (_mangleMap) {
			mangleName = _mangleMap.get(method);
		}
		// 如果缓存中没有
		if (mangleName == null) {
			String methodName = method.getName();
			Class<?>[] params = method.getParameterTypes();
			//如果是 equals, hashcode ,getHessianType,getHessianURL 
			//直接调用url的对应方法返回结果   不会向服务端发送请求
			if (methodName.equals("equals") && params.length == 1
					&& params[0].equals(Object.class)) {
				Object value = args[0];
				if (value == null || !Proxy.isProxyClass(value.getClass()))
					return Boolean.FALSE;
				Object proxyHandler = Proxy.getInvocationHandler(value);
				if (!(proxyHandler instanceof HessianProxy))
					return Boolean.FALSE;
				HessianProxy handler = (HessianProxy) proxyHandler;
				return new Boolean(_url.equals(handler.getURL()));
			} else if (methodName.equals("hashCode") && params.length == 0)
				return new Integer(_url.hashCode());
			else if (methodName.equals("getHessianType"))
				return proxy.getClass().getInterfaces()[0].getName();
			else if (methodName.equals("getHessianURL"))
				return _url.toString();
			else if (methodName.equals("toString") && params.length == 0)
				return "HessianProxy[" + _url + "]";
			//重载方法支持 默认false
			if (!_factory.isOverloadEnabled())
				mangleName = method.getName();
			else
				//重载方法处理  最终已  methodName_参数类型_参数类型..形式返回
				mangleName = mangleName(method);
			//缓存起来
			synchronized (_mangleMap) {
				_mangleMap.put(method, mangleName);
			}
		}
		InputStream is = null;
		HessianConnection conn = null;
		try {
			//序列化 方法名称  参数  向服务端发出请求  
			//mangleName 方法定义 可能是methodName_参数类型_参数类型.. 
			//args 参数
			conn = sendRequest(mangleName, args);
			//获得HttpURLConnection 的输入流
			is = conn.getInputStream();
			AbstractHessianInput in;
			int major = is.read();
			int minor = is.read();
			in = _factory.getHessianInput(is);
			in.startReplyBody();
			//反序列化服务端返回结果 
			Object value = in.readObject(method.getReturnType());
			if (value instanceof InputStream) {
				value = new ResultInputStream(conn, is, in, (InputStream) value);
				is = null;
				conn = null;
			} else
				in.completeReply();
			//返回最终结果
			return value;
		} catch (HessianProtocolException e) {
			throw new HessianRuntimeException(e);
		} finally {
		//..略
		}
	}

sendRequest 方法主要序列化请求信息(方法,参数) 然后向服务端发送请求  HessianConnection包装了HttpURLConnection

protected HessianConnection sendRequest(String methodName, Object[] args)
			throws IOException {
		//包装了java HttpURLConnection
		HessianConnection conn = null;
		conn = _factory.getConnectionFactory().open(_url);
		boolean isValid = false;

		try {
			addRequestHeaders(conn);
			OutputStream os = null;
			try {
				os = conn.getOutputStream();
			} catch (Exception e) {
				throw new HessianRuntimeException(e);
			}
			AbstractHessianOutput out = _factory.getHessianOutput(os);
			//序列化
			out.call(methodName, args);
			out.flush();
			//发出网络请求
			conn.sendRequest();
			isValid = true;
			return conn;
		} finally {
			if (!isValid && conn != null)
				conn.destroy();
		}
	}



【AHE数据集】中国2019年多源热排放数据集-500m空间分辨率 【AHE数据集】中国2019年多源热排放数据集 阅读详情

相关推荐

Android HCE实战:手把手教你用Kotlin实现NFC公交卡模拟(含完整APDU指令解析)

本文是一份Android HCE实战指南,详细讲解如何使用Kotlin实现NFC公交卡模拟。内容涵盖HCE服务搭建、APDU指令(如SELECT AID、GET PROCESSING OPTIONS)的完整解析与响应逻辑,并提供读卡器端测试代码,帮助开发者深入理解基于主机的卡模拟技术。

qsc901234567的博客 1117

hessian源码分析(一)------架构

在计费中心的对外交互这块采用了hessian,有必要对hessian的运行机理和源码做一定的解析。大致翻了翻源码后,发现hessian的主要结构分客户端与服务端,中间基于http传输。客户端主要做的事情是把对远程接口调用序列化为流,并传输到服务端;服务端主要做的事情是把传输过来的流反序列化为对服务的请求,调用相应服务后把结果序列化为流返回给客户端。一次完整的调用如下图所示:Hess

走向架构师之路 1万+

思澈sdk-新建lcd

co5300至此有3个同ID的驱动,在co5300xxxx.c的LCD_DRIVER_EXPORT(co5300, LCD_ID, &lcdc_int_cfg, &CO5300_drv, LCD_PIXEL_WIDTH, LCD_PIXEL_HEIGHT, 2);2 在customer\peripherals\Kconfig_lcd中添加如下配置(注意修改的地方有两个LCD_USING_TFT_CO5300_143)5 在该文件中的config LCD_DPI配置项下添加:(这里300为DPI)

gongyuan073的专栏 1388

常见问题汇总(二十七)——Hessian

1、HessianProtocolException: '' is an unknown code 服务端和客服端编译环境不同导致 解决方案: public HessianProxyFactoryBean shippingCost(){ HessianProxyFactoryBean proxy = new HessianProxyFactoryBean(); ...

不忘初心的博客 925

保姆级教程:用TI IWR6843雷达板跑通3D人体追踪demo(附CCS/UniFlash避坑指南)

本文提供了一份详尽的TI IWR6843毫米波雷达开发板3D人体追踪demo实现指南,涵盖开发环境搭建、工程导入编译、固件烧录及可视化工具配置全流程。特别针对CCS和UniFlash使用中的常见问题给出解决方案,帮助开发者快速掌握3D People Tracking技术应用。

weixin_29159441的博客 504

第四天 Labview交互也很轻松(4.1 DAQ数据采集)

LabVIEW DAQ数据采集有很大的优势,NI提供了超过5千万条I/O通道,支持多种主流总线(如USB、PCI、PCIe、PXI等),并为所有这些设备提供统一的编程接口,实现软硬件的无缝集成。LabVIEW包含全套范例,覆盖各类应用,用户无需从头创建整个数据采集系统,可以快速启动并执行这些范例程序。所有NI DAQ硬件都采用NI-DAQmx驱动程序,支持多种编程语言,并包含了这些编程语言的示例代码,使得与NI硬件的通信变得更加便捷。

weixin_38637405的博客 2617

Hessian源码分析--HessianProxy

在上一篇博客 Hessian源码分析--HessianProxyFactory 中我们了解到,客户端获得的对象其实是HessianProxy生成的目标对象,当调用目标对象的方法时,会调用HessianProxy的invoke方法,如下,当调用HelloService的helloWorld函数时,会调用HessianProxy的invoke函数(对代理机制不懂的同学可以去学习一下)。 Hess

井底之蛙 2013

基于CutLSTM-ATT 模型的刀具磨损预测-【一个月之内发一篇中文核心辅导】

基于CutLSTM-ATT 模型的刀具磨损预测-【一个月之内发一篇中文核心辅导】

315

Hessian学习

Hessian

宏微的博客 528

内模控制(IMC)——理论、应用与实践

内模控制方法的核心思想是利用被控对象的数学模型(即内模)构建控制器,使得控制器可以“预知”被控系统的动态响应,从而在控制输入中提前补偿模型的固有特性和扰动影响。常见的内模控制结构中,将系统分为无延迟部分和扰动部分,并利用内部模型预测输出值,再通过反馈回路进行误差修正。utuimctufbtutui​mctuf​bt其中,uimctu_imc(t)ui​mct为内模预测得到的预补偿控制量,ufbtu_fb(t)uf​bt。

闲人编程的博客 2633

【WebRTC】【Unity】Unity Web RTC1-Unity中简单实现远程画面

平台:基本常用平台包括安卓,苹果(max和IOS),Windows64,Linux都行。10. 注意,如果从移动设备浏览器连接服务,信令服务器的SSL证书一定要先设好。想要在Unity中实现实时远程桌面,找到了Render Streaming这个手段,本篇介绍相应的使用方法和实例。8. 打开电脑浏览器,地址栏输入http://127.0.0.1,点击Receiver Sample。新建Unity项目,模板选Third Person,Project Name随意。启动App,控制台出现如下信息表示成功。

每日出拳老爷子的博客 2518

Spring框架学习【Spring使用Hessian实现远程调用】

1.Spring中除了提供HTTP调用器方式的远程调用,还对第三方的远程调用实现提供了支持,其中提供了对Hessian的支持。 Hessian是由Caocho公司发布的一个轻量级的二进制协议远程调用实现方案,Hessian也是基于HTTP协议的,其工作原理如下: (1).客户端: a.发送远程调用请求: 客户端程序—>发送远程调用请求—>Hessian客户端拦截器—>封装远程调用请求—>H

zhixiang2010的专栏 2874

SAP CBC 集成质量系统初始化接入实战指南

摘要 本文探讨了SAP S/4HANA Cloud Public Edition项目中质量系统的初始接入过程。质量系统并非开箱即用,而是需要经过SAP Central Business Configuration(CBC)的Scope and Organizational Structure阶段部署后才能具备完整功能。文章重点分析了几个关键环节:CBC里程碑确认的时机选择、Identity Authentication的初始管理员设置、Business Role Template的创建规范等。实施过程中需特

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

Hessian入门案例和源码浅析

一、简介 二、使用 Server  Client 三、原理 服务端源码浅析 1. HessianServlet的init方法,创建接口的类对象和接口的实现类对象,并初始化HessianSkeleton对象。 2. service方法内则是调用HessianSkeleton对象的invoke方法处理请求 3. HessianSkeleton的invoke方法 Hessian客户端源...

z1340954953 823

计算机控制技术及应用

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

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Hessian源码分析(二)------ HessianProxy

Hessian在客户端一块采用Proxy模式,当客户端调用远程接口时,HessianProxy会代理这个动作,在invoke方法中,把客户端请求的方法和参数序列化为预订格式的输出流,主要流程如下图所示: 下面我将详细解析一下invoke源码:public Object invoke(Object proxy, Method method, Object []args)

走向架构师之路 8577

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

hessian——源码分析(二)------ HessianProxy《转》

Hessian在客户端一块采用Proxy模式,当客户端调用远程接口时,HessianProxy会代理这个动作,在invoke方法中,把客户端请求的方法和参数序列化为预订格式的输出流,主要流程如下图所示:   下面我将详细解析一下invoke源码:   [java] view plaincopy public Object invoke(Object prox...

刨根问底,挖到祖坟 202

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Hessian源码分析-Client端

1 HessianProxyFactory 2 HessianProxy 参考 Hessian源码分析–HessianProxyFactory Hessian源码分析–HessianProxy

添仔哥哥 460

Hessian源码分析--总体架构

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

井底之蛙 2336

Spring Hessian调用端代码浅析

最近公司内部系统相互通信调用用到了spring的hessian机制,后来有空研究了一下spring hessian的机制,在这里做一个简单的摘要,有不对的地方希望指正;首先看客户端的基础类HessianProxyFactoryBean,他是一个工厂bean,意味着他具有包装bean的功能,当你调用spring的ApplicationCon...

weixin_34232744的博客 136

Hessian源码分析--HessianProxyFactory

HessianProxyFactory是HessianProxy的工厂类,其通过HessianProxy来生成代理类。 如下面代码: HessianProxyFactory factory = new HessianProxyFactory(); HelloService helloService = (HelloService) factory.create(HelloService.cla

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值