1.2
潍坊高远速通软件有限公司
目录
前言 ................................................................................................................................................... 1
本章提要 ............................................................................................................................................... 1
欢迎使用 Hprose.................................................................................................................................... 2
体例 ..................................................................................................................................................... 3
菜单描述 ......................................................................................................................................................... 3
屏幕截图 ......................................................................................................................................................... 3
代码范例 ......................................................................................................................................................... 3
运行结果 ......................................................................................................................................................... 3
获取帮助 ............................................................................................................................................... 3
电子文档 ......................................................................................................................................................... 3
在线支持 ......................................................................................................................................................... 3
升级 ................................................................................................................................................................ 3
联系我们 ............................................................................................................................................... 4
报告漏洞与需求 ..................................................................................................................................... 4
第一章 快速入门 .................................................................................................................................. 5
本章提要 ............................................................................................................................................... 5
安装 Hprose for Java .............................................................................................................................. 6
安装方法 ......................................................................................................................................................... 6
创建 Hprose 的 Hello 服务器 ................................................................................................................... 6
创建 Hprose 的 Hello 客户端 ................................................................................................................. 10
通过 invoke 方法动态调用 ............................................................................................................................... 10
通过接口方式调用 .......................................................................................................................................... 12
第二章 类型映射 ................................................................................................................................ 14
本章提要 ............................................................................................................................................. 14
基本类型 ............................................................................................................................................. 15
值类型 ........................................................................................................................................................... 15
引用类型 ....................................................................................................................................................... 15
基本类型的映射.............................................................................................................................................. 16
序列化类型映射 .......................................................................................................................................... 16
反序列化默认类型映射 ................................................................................................................................ 16
反序列化有效类型映射 ................................................................................................................................ 17
容器类型 ............................................................................................................................................. 19
列表类型 ....................................................................................................................................................... 19
序列化类型映射 .......................................................................................................................................... 19
反序列化类型映射 ...................................................................................................................................... 19
字典类型 ....................................................................................................................................................... 19
序列化类型映射 .......................................................................................................................................... 19
反序列化类型映射 ...................................................................................................................................... 19
对象类型 ............................................................................................................................................. 19
通过 ClassManager 来注册自定义类型 .............................................................................................................. 19
第三章 服务器 ................................................................................................................................... 21
本章提要 ............................................................................................................................................. 21
直接使用 HproseServlet 发布服务 ......................................................................................................... 22
发布实例方法 ................................................................................................................................................. 22
注册自定义类型.............................................................................................................................................. 28
隐藏发布列表 ................................................................................................................................................. 28
调试开关 ....................................................................................................................................................... 29
对象序列化模式.............................................................................................................................................. 29
P3P 开关 ........................................................................................................................................................ 30
跨域开关 ....................................................................................................................................................... 30
服务器事件 .................................................................................................................................................... 31
事件配置 ................................................................................................................................................... 31
onBeforeInvoke 事件 ................................................................................................................................... 31
onAfterInvoke 事件 ..................................................................................................................................... 31
onSendHeader 事件 .................................................................................................................................... 31
onSendError 事件 ....................................................................................................................................... 32
存取环境上下文.............................................................................................................................................. 32
发布静态方法 ................................................................................................................................................. 32
自己编写 Servlet 发布 Hprose 服务........................................................................................................ 33
扩展 HproseServlet ......................................................................................................................................... 33
HproseMethods 类型 ................................................................................................................................... 33
setGlobalMethods 方法 ................................................................................................................................ 34
使用 HproseHttpService 来构建 Servlet ............................................................................................................. 35
按请求发布方法 .......................................................................................................................................... 35
按会话发布方法 .......................................................................................................................................... 36
自己编写 JSP 发布 Hprose 服务 ............................................................................................................. 37
第四章 客户端 ................................................................................................................................... 39
本章提要 ............................................................................................................................................. 39
同步调用 ............................................................................................................................................. 40
通过 invoke 方法进行同步调用 ......................................................................................................................... 40
带名称空间(别名前缀)方法 ...................................................................................................................... 40
可变的参数和结果类型 ................................................................................................................................ 40
引用参数传递 ............................................................................................................................................. 41
自定义类型的传输 ...................................................................................................................................... 43
通过代理接口进行同步调用 ............................................................................................................................. 44
接口定义 ................................................................................................................................................... 44
带名称空间(别名前缀)方法 ...................................................................................................................... 45
可变的参数和结果类型 ................................................................................................................................ 45
泛型参数和结果 .......................................................................................................................................... 46
自定义类型 ................................................................................................................................................ 47
异步调用 ............................................................................................................................................. 48
通过 invoke 方法进行异步调用 ......................................................................................................................... 48
通过代理接口进行异步调用 ............................................................................................................................. 49
异常处理 ............................................................................................................................................. 53
同步调用异常处理 .......................................................................................................................................... 53
异步调用异常处理 .......................................................................................................................................... 53
超时设置 ............................................................................................................................................. 53
HTTP 参数设置 .................................................................................................................................... 53
代理服务器 .................................................................................................................................................... 53
持久连接 ....................................................................................................................................................... 54
HTTP 标头 ..................................................................................................................................................... 54
第五章 其它平台 ................................................................................................................................ 55
本章提要 ............................................................................................................................................. 55
Hprose for GAE ................................................................................................................................... 56
Hprose for Android .............................................................................................................................. 56
Hprose for JavaME ............................................................................................................................... 56
CDC 环境 ....................................................................................................................................................... 56
CLDC 1.0 环境 ................................................................................................................................................ 56
CLDC 1.1 环境 ................................................................................................................................................ 57
附录 API 参考 .................................................................................................................................. 58
本章提要 ............................................................................................................................................. 58
hprose.common 包 .............................................................................................................................. 59
HproseCallback 接口 ....................................................................................................................................... 59
handler 方法 .............................................................................................................................................. 59
HproseErrorEvent 接口 .................................................................................................................................... 59
handler 方法 .............................................................................................................................................. 59
HproseMethod 类 ........................................................................................................................................... 59
method 字段 .............................................................................................................................................. 59
obj 字段 ..................................................................................................................................................... 59
paramTypes 字段 ........................................................................................................................................ 59
HproseMethods 类 .......................................................................................................................................... 60
构造方法 ................................................................................................................................................... 60
addInstanceMethods 方法 ........................................................................................................................... 60
addMethod 方法 ......................................................................................................................................... 60
addMethods 方法 ........................................................................................................................................ 62
addMissingMethod 方法 ............................................................................................................................... 62
addStaticMethods 方法 ................................................................................................................................ 63
get 方法 ..................................................................................................................................................... 63
getAllNames 方法 ....................................................................................................................................... 63
getCount 方法 ............................................................................................................................................ 63
HproseException 异常 ..................................................................................................................................... 64
hprose.io 包 ........................................................................................................................................ 64
HproseMode 类 .............................................................................................................................................. 64
FieldMode 静态字段 .................................................................................................................................... 64
PropertyMode 静态字段 ............................................................................................................................... 64
HproseTags 类 ................................................................................................................................................ 64
TagArgument 静态字段 ................................................................................................................................ 64
TagBytes 静态字段 ...................................................................................................................................... 64
TagCall 静态字段 ........................................................................................................................................ 64
TagClass 静态字段 ...................................................................................................................................... 65
TagClosebrace 静态字段 .............................................................................................................................. 65
TagDate 静态字段 ....................................................................................................................................... 65
TagDouble 静态字段 .................................................................................................................................... 65
TagEmpty 静态字段 ..................................................................................................................................... 65
TagEnd 静态字段 ........................................................................................................................................ 65
TagError 静态字段 ...................................................................................................................................... 65
TagFalse 静态字段 ...................................................................................................................................... 65
TagFunctions 静态字段 ................................................................................................................................ 66
TagInfinity 静态字段 .................................................................................................................................... 66
TagInteger 静态字段 ................................................................................................................................... 66
TagList 静态字段 ......................................................................................................................................... 66
TagLong 静态字段 ....................................................................................................................................... 66
TagMap 静态字段 ........................................................................................................................................ 66
TagNaN 静态字段 ........................................................................................................................................ 66
TagNeg 静态字段 ........................................................................................................................................ 66
TagNull 静态字段 ........................................................................................................................................ 67
TagObject 静态字段 .................................................................................................................................... 67
TagOpenbrace 静态字段 .............................................................................................................................. 67
TagPoint 静态字段 ...................................................................................................................................... 67
TagPos 静态字段 ......................................................................................................................................... 67
TagQuote 静态字段 ..................................................................................................................................... 67
TagRef 静态字段 ......................................................................................................................................... 67
TagResult 静态字段 ..................................................................................................................................... 67
TagSemicolon 静态字段 ............................................................................................................................... 68
TagString 静态字段 ..................................................................................................................................... 68
TagTime 静态字段 ...................................................................................................................................... 68
TagTrue 静态字段 ....................................................................................................................................... 68
TagUTC 静态字段 ........................................................................................................................................ 68
HproseReader 类 ............................................................................................................................................ 68
stream 字段 ............................................................................................................................................... 68
构造方法 ................................................................................................................................................... 68
checkTag 方法 ............................................................................................................................................ 69
checkTags 方法 ........................................................................................................................................... 69
readArray 方法 ........................................................................................................................................... 69
readBigInteger 方法 .................................................................................................................................... 69
readBoolean 方法 ....................................................................................................................................... 69
readBytes 方法 ........................................................................................................................................... 69
readDate 方法 ............................................................................................................................................ 70
readDateTime 方法 ..................................................................................................................................... 70
readDouble 方法 ......................................................................................................................................... 70
readEmpty 方法 .......................................................................................................................................... 71
readEnum 方法 ........................................................................................................................................... 71
readInfinity 方法 ......................................................................................................................................... 71
readInteger 方法 ........................................................................................................................................ 71
readList 方法 .............................................................................................................................................. 71
readLong 方法 ............................................................................................................................................ 72
readMap 方法 ............................................................................................................................................. 72
readNaN 方法 ............................................................................................................................................. 72
readNull 方法 ............................................................................................................................................. 73
readObject 方法 ......................................................................................................................................... 73
readString 方法 .......................................................................................................................................... 73
readTime 方法 ............................................................................................................................................ 74
readUntil 方法 ............................................................................................................................................ 74
unserialize 方法 .......................................................................................................................................... 74
HproseWriter 类 ............................................................................................................................................. 74
stream 字段 ............................................................................................................................................... 74
构造方法 ................................................................................................................................................... 75
serialize 方法 .............................................................................................................................................. 75
writeArray 方法 .......................................................................................................................................... 75
writeBoolean 方法 ....................................................................................................................................... 77
writeBytes 方法 .......................................................................................................................................... 77
writeCollection 方法 .................................................................................................................................... 78
writeDate 方法 ........................................................................................................................................... 78
writeDouble 方法 ........................................................................................................................................ 79
writeEmpty 方法 ......................................................................................................................................... 79
writeEnum 方法 .......................................................................................................................................... 79
writeInfinity 方法 ........................................................................................................................................ 79
writeInteger 方法 ........................................................................................................................................ 79
writeList 方法 ............................................................................................................................................. 79
writeLong 方法 ........................................................................................................................................... 80
writeMap 方法 ............................................................................................................................................ 80
writeNaN 方法 ............................................................................................................................................ 80
writeNull 方法 ............................................................................................................................................. 80
writeObject 方法 ......................................................................................................................................... 80
writeString 方法 .......................................................................................................................................... 80
writeTime 方法 ........................................................................................................................................... 81
HproseFormatter 类 ........................................................................................................................................ 81
serialize 方法 .............................................................................................................................................. 81
unserialize 方法 .......................................................................................................................................... 82
hprose.client 包 ................................................................................................................................... 83
HproseClient 类 .............................................................................................................................................. 83
onError 事件 .............................................................................................................................................. 83
invoke 方法 ................................................................................................................................................ 83
useService 方法 .......................................................................................................................................... 84
HproseHttpClient 类 ........................................................................................................................................ 85
构造方法 ................................................................................................................................................... 85
getHeader 方法 .......................................................................................................................................... 85
setHeader 方法 ........................................................................................................................................... 85
isKeepAlive 方法 ......................................................................................................................................... 85
setKeepAlive 方法 ....................................................................................................................................... 85
getKeepAliveTimeout 方法 ........................................................................................................................... 86
setKeepAliveTimeout 方法 ............................................................................................................................ 86
getProxyHost 方法 ...................................................................................................................................... 86
getProxyPass 方法 ...................................................................................................................................... 86
getProxyPort 方法 ....................................................................................................................................... 86
getProxyUser 方法 ...................................................................................................................................... 86
setProxyHost 方法 ...................................................................................................................................... 86
setProxyPass 方法 ....................................................................................................................................... 86
setProxyPort 方法 ....................................................................................................................................... 87
setProxyUser 方法 ...................................................................................................................................... 87
useService 方法 .......................................................................................................................................... 87
hprose.server 包 .................................................................................................................................. 87
HproseServiceEvent 接口 ................................................................................................................................. 87
onAfterInvoke 方法 ..................................................................................................................................... 87
onBeforeInvoke 方法 ................................................................................................................................... 87
onSendError 方法 ....................................................................................................................................... 88
onSendHeader 方法 .................................................................................................................................... 88
HttpContext 类 ............................................................................................................................................... 88
构造方法 ................................................................................................................................................... 88
getApplication 方法 ..................................................................................................................................... 88
getConfig 方法 ........................................................................................................................................... 88
getRequest 方法 ......................................................................................................................................... 88
getResponse 方法 ....................................................................................................................................... 88
getSession 方法 .......................................................................................................................................... 89
getSession 方法 .......................................................................................................................................... 89
HproseHttpMethods 类 .................................................................................................................................... 89
HproseService 类 ............................................................................................................................................ 89
add 方法 .................................................................................................................................................... 89
addMissingMethod 方法 ............................................................................................................................... 92
getEvent 方法 ............................................................................................................................................. 92
setEvent 方法 ............................................................................................................................................. 92
getGlobalMethods 方法 ............................................................................................................................... 92
setGlobalMethods 方法 ................................................................................................................................ 93
getMode 方法 ............................................................................................................................................. 93
setMode 方法 ............................................................................................................................................. 93
isDebugEnabled 方法 .................................................................................................................................. 93
setDebugEnabled 方法 ................................................................................................................................ 93
HproseHttpService 类 ...................................................................................................................................... 93
getCurrentContext 方法 ............................................................................................................................... 93
handle 方法 ................................................................................................................................................ 93
isGetEnabled 方法 ....................................................................................................................................... 94
setGetEnabled 方法 ..................................................................................................................................... 94
isP3pEnabled 方法 ...................................................................................................................................... 94
setP3pEnabled 方法 .................................................................................................................................... 94
HproseServlet 类 ............................................................................................................................................ 94
前言
在开始使用 Hprose 开发应用程序前,您需要先了解一些相关信息。本章将为您提供这些信息,
并告诉您如何获取更多的帮助。
本章提要
欢迎使用 Hprose
体例
获取帮助
联系我们
报告漏洞与需求
前言
欢迎使用 Hprose
您还在为 Ajax 跨域问题而头疼吗?
您还在为 WebService 的低效而苦恼吗?
您还在为选择 C/S 还是 B/S 而犹豫不决吗?
您还在为桌面应用向手机网络应用移植而忧虑吗?
您还在为如何进行多语言跨平台的系统集成而烦闷吗?
您还在为传统分布式系统开发的效率低下运行不稳而痛苦吗?
好了,现在您有了 Hprose ,上面的一切问题都不再是问题!
Hprose (High Performance Remote Object Service Engine) 是一个商业开源的新型轻量级跨语言跨平
台的面向对象的高性能远程动态通讯中间件。它支持众多语言,例如 C++ ,.NET,Java,Delphi,Objective-C,
ActionScript ,JavaScript,ASP,PHP ,Python,Ruby ,Perl 等语言,通过 Hprose 可以在这些语言之间实现
方便且高效的互通。
Hprose 使您能高效便捷的创建出功能强大的跨语言,跨平台,分布式的电信级应用系统。如果您刚接
触网络编程,您会发现用 Hprose 来实现分布式系统易学易用。如果您是一位有经验的程序员,您会发现它
是一个功能强大的通讯协议和开发包。有了它,您在任何情况下,都能在更短的时间内完成更多的工作。
Hprose 是 PHPRPC 的商业化版本,它除了拥有 PHPRPC 的各种优点之外,它还具有更多特色功能。
Hprose 使用更好的方式来表示数据,在更加节省空间的同时,可以表示更多的数据类型,解析效率也更加
高效。在数据传输上,Hprose 以更直接的方式来传输数据,不再需要二次编码,可以直接进行流式读写,
效率更高。在远程调用过程中,数据直接被还原为目标类型,不再需要类型转换,效率上再次得到提高。
Hprose 不仅具有在 HTTP 协议之上工作的版本,以后还会推出直接在 TCP 协议之上工作的版本。 Hprose 在
易用性方面也有很大的进步,您几乎不需要花什么时间就能立刻掌握它。
Hprose 与其它远程调用商业产品的区别很明显——Hprose 是商业开源的,您可以在购买相应的授权以
后即可获得源代码的阅读或修改权,这样您就可以在遇到问题时更快的找到问题并修复它,或者在您无法
直接修复的情况下,更准确的将错误描述给我们,由我们来帮您更快的解决它。您还可以将您所修改的更
加完美的代码或者由您所增加的某个激动人心的功能反馈给我们,让我们能够更好的来一起完善它。正是
因为有这种机制的存在,您在使用该产品时,实际上可能遇到的问题会更少,因为问题可能已经被他人修
复了。
Hprose 与其它远程调用开源产品的区别更加明显,Hprose 不仅仅在开发运行效率,易用性,跨平台和
跨语言的能力上较其它开源产品有着明显的不可取代的综合优势,Hprose 还可以保证所有语言的实现具有
一致性,而不会向其他开源产品那样即使是同一个通讯协议的不同实现都无法保证良好的互通。而且 Hprose
具有完善的商业支持,可以在任何时候为您提供所需的帮助。不会向其它没有商业支持的开源软件那样,
当您遇到问题时只能通过阅读天书般的源代码的方式来解决。
Hprose 支持许多种语言,包括您所常用的、不常用的甚至从来不用的语言。您不需要掌握 Hprose 支
持的所有语言,您只需要掌握您所使用的语言就可以开始启程了。
本手册中有些内容可能在其它语言版本的手册中也会看到,我们之所以会在不同语言的手册中重复这
些内容是因为我们希望您只需要一本手册就可以掌握 Hprose 在这种语言下的使用,而不需要同时翻阅几本
书才能有一个全面的认识。
接下来我们就可以开始 Hprose 之旅啦,不过在正式开始之前,先让我们对本文档的编排方式以及如何
获得更多帮助作一下说明。当然,如果您对下列内容不感兴趣的话,可以直接跳过下面的部分。
2 Hprose 用户手册(Java 版)
体例
菜单描述
当让您选取菜单项时,菜单的名称将显示在最前面,接着是一个箭头,然后是菜单项的名称和快捷键。
例如“文件→退出”意思是“选择文件菜单的退出命令”。
屏幕截图
Hprose 是跨平台的,支持多个操作系统下的多个开发环境,因此文档中可能混合有多个系统上的截图。
代码范例
代码范例将被放在细边框的方框中:
public class Hello {
public static void main(String[] args) {
System.out.println("Hello Hprose!");
}
}
前言
运行结果
运行结果将被放在粗边框的方框中:
Hello Hprose!
获取帮助
电子文档
您可以从我们的网站 http://www.hprose.com/documents.php 上下载所有的 Hprose 用户手册电子版,
这些文档都是 PDF 格式的。
在线支持
我们的技术支持网页为 http://www.hprose.com/support.php。您可以在该页面找到关于技术支持的相
关信息。
升级
每 1-3 个月我们就会推出一个小版本更新,所有拥有升级许可证的正版用户都可以免费升级。每半年
到一年我们会发布一个 Hprose 的全新版本。所有正版用户都可以凭借授权许可证享受优惠升级。
Hprose 用户手册(Java 版) 3
前言
潍坊市高新区玉清东街以北中心次干道以西高新大厦(邮编 261061 )
+86-0536-2999015 (周一至周五,北京时间早上 9 点到下午 5 点)
联系我们
如果您需要直接跟我们取得联系,可以使用下列方法:
报告漏洞与需求
如果您在 Hprose 中发现了漏洞或需要一些新的功能,请告知我们。最好的方法是通过我们公司网站的
反馈系统进行反馈。我们的反馈系统专门用于收集所有有用的信息,它能帮助我们捕获缺陷和了解用户对
新功能的需求。您每报告一个缺陷或功能需求后,都将会相应的收到一封电子邮件,其中含有跟踪号码,
通过它,您可以及时了解报告的处理状态。当我们完成对报告的处理,我们会发送电子邮件告知您处理结
果及原因(例如:缺陷将在下次发布中被解决、 新特性将在下次发布时加入进来这并不是缺陷等等)。
4 Hprose 用户手册(Java 版)
第一章 快速入门
使用 Hprose 制作一个简单的分布式应用程序只需要几分钟的时间,本章将用一个简单但完整
的实例来带您快速浏览使用 Hprose for Java 进行分布式程序开发的全过程。
本章提要
安装 Hprose for Java
创建 Hprose 的 Hello 服务器
创建 Hprose 的 Hello 客户端
第一章 快速入门
安装 Hprose for Java
Hprose for Java 分为 javaSE/javaEE 版本和 javaME 版本。
Hprose for JavaSE/JavaEE 版本支持 JDK 1.2 及其更高版本。
Hprose for JavaSE/JavaEE 版本支持 Google 云计算平台 GAE (Google App Engine) for Java。
Hprose for JavaSE 版本支持 Android 应用开发。
Hprose for JavaME 版本支持 CDC, CLDC 的所有版本。
Hprose for JavaME 的 CLDC 1.1 版本还提供了带有部分 JavaSE 功能的扩展版本。:
Hprose for JavaEE 版本支持 Apache Tomcat、Glassfish 、 Web Logic、 Web Sphere 或其它任何一款可
以运行 Java Servlet 的应用服务器。
安装方法
直接将 Hprose.jar 或 HproseClient.jar 放入开发环境的运行库目录下,并添加到运行库路径中即可。或
者直接将源代码放入开发环境的源代码目录下即可。如果您使用的是 Hprose.jar 或者是包含了服务器部分
的全部源代码,请将 Servlet 规范的运行库也添加到运行库路径中。
创建 Hprose 的 Hello 服务器
我们以 Netbeans 作为开发环境为例,来介绍一下如何创建一个 Hprose 服务器,按照传统惯例,都是
以 Hello World 为例来作为开始的,我们这里稍稍做一下改变,我们创建的服务器将发布一个 sayHello 方法,
这样客户端就可以调用它来对任何事物说 Hello 啦。
首先启动 Netbeans 开发环境,打开菜单的“文件→新建项目”,选择“Java Web→Web 应用程序”:
6 Hprose 用户手册(Java 版)
然后选择下一步,将项目名称改为 HelloServer :
第一章 快速入门
再点下一步,选择好服务器后,点完成。
下面我们该把 Hprose.jar 放到该项目中来了。在 Netbeans 创建的 HelloServer 目录下,新建一个 lib 目
录,然后将 Hprose.jar 复制到其中。
接下来在项目中,打开 HelloServer 下“库”的右键菜单,点击“添加 JAR/文件夹...”,选择 Hprose.jar,
将其添加入库中。
Hprose 用户手册(Java 版) 7
第一章 快速入门
之后在“源包”上打开右键菜单,选“新建→Java 类...”,将类名改为 Hello,包名任意,也可以不填
写,只要跟后面配置 HproseServlet 时保持一致就可以啦。
Hello 类的代码如下:
public class Hello {
public String sayHello(String name) {
return "Hello " + name + "!";
}
}
8 Hprose 用户手册(Java 版)
第一章 快速入门
好了,下面我们只要再配置一下 Servlet ,就可以发布这个服务啦。
配置方法如下:
1. 打开“ HelloServer→配置文件→ web.xml”。
2. 打开“ Servlet”选单,点击“添加 Servlet 元素...”按钮,设置 Servlet 名称为 HelloServlet,Servlet
类为 hprose.server.HproseServlet, URL 模式为 /Hello 。
3. 在初始化参数部分,点“添加 (A)...”按钮,设置参数名为 class,参数值为 Hello,这里的 Hello 对
应我们刚才创建的 Hello 类。如果您在创建 Hello 类时包含有包名,这里也应该写包含了包名的全名。
配置完成后如下图所示:
这样我们的服务器端就创建好了,是不是相当的简单啊?
好了我们来看看效果吧,打开“HelloServer ”的右键菜单,选择“运行”,之后您会看到浏览器窗口被
打开,不过默认页面并不是我们的 Servlet 页面,没关系,我们直接在浏览器中更改一下 URL,改为:
http://localhost:8084/HelloServer/Hello,然后回车,如果看到如下页面就表示我们的服务发布成功啦。
Hprose 用户手册( Java 版) 9
第一章 快速入门
接下来我们来看一下客户端如何创建吧。
创建 Hprose 的 Hello 客户端
客户端我们以 Java 控制台程序为例,开发环境仍然为 Netbeans 。
客户端可以通过 invoke 方法动态调用服务,也可以通过接口方式来调用,下面我们来分别介绍这两种
方式。
通过 invoke 方法动态调用
首先我们先来看看如何使用 invoke 方法来动态调用服务。
在 Netbeans 中, 打开菜单的“文件→新建项目”,选择“Java→Java 应用程序”。
然后选择下一步,将项目名称改为 HelloClient ,并将主类名也改为 HelloClient ,然后点击完成即可。
10 Hprose 用户手册(Java 版)
第一章 快速入门
下面我们该把 HproseClient.jar 放到该项目中来了。在 Netbeans 创建的 HelloClient 目录下,新建一个
lib 目录,然后将 HproseClient.jar 复制到其中。
接下来在项目中,打开 HelloClient 下“库”的右键菜单,点击“添加 JAR/文件夹...”,选择 HproseClient.jar,
将其添加入库中。
Hprose 用户手册(Java 版) 11
第一章 快速入门
接下来开始编写 HelloClient 类的代码:
import hprose.client.HproseHttpClient;
import java.io.IOException;
public class HelloClient {
public static void main(String[] args) throws IOException {
HproseHttpClient client = new HproseHttpClient();
client.useService("http://localhost:8084/HelloServer/Hello");
String result = (String) client.invoke("sayHello", new Object[] { "Hprose" });
System.out.println(result);
}
}
最后我们来运行一下看看结果吧,如果没有操作错误的话,您应该可以看到如下的输出结果:
Hello Hprose!
通过 invoke 方法调用服务器方法很灵活,invoke 方法具有多个重载,即使是对同一个服务器方法,您
也可以通过指定不同的参数来获得不同类型的结果。后面我们会在详细介绍 Hprose 客户端时,再对 invoke
方法作更详细的介绍。
但是您也会发现,通过 invoke 调用不是那么的直观,参数需要自己写入数组,结果也需要自己转型,
那么有没有方法可以向本地调用那样来进行远程调用呢?可以,那就是通过接口方式调用。
通过接口方式调用
我们用与上面同样的方式来创建项目 HelloClient2 ,然后打开 HelloClient2.java,编辑其代码如下:
import hprose.client.HproseHttpClient;
import java.io.IOException;
interface IHello {
String sayHello(String name);
}
public class HelloClient2 {
public static void main(String[] args) throws IOException {
HproseHttpClient client = new HproseHttpClient();
client.useService("http://localhost:8084/HelloServer/Hello");
IHello hello = (IHello) client.useService(IHello.class);
String result = hello.sayHello("Hprose");
System.out.println(result);
}
}
现在代码虽然多了,但是在调用时,却方便了不少。
如果您曾经用过 RMI 或者其它的远程调用工具的话,您可能会惊讶的发现,这里的 IHello 接口在服务
器端并没有实现,只是有相同的方法,但在客户端仍然可以直接通过接口进行调用。Hprose 就是这样灵活,
12 Hprose 用户手册(Java 版)
第一章 快速入门
在 Hprose for Java 中接口并不是用来约束服务器与客户端必须有一致方法签名的手段,而仅
仅是用于实现客户端远程调用代理的工具。
您甚至可以定义不同于服务器实现的客户端接口,只要参数和结果类型是相容或者可以转换的类型,就可
以正常的进行调用。所以在 Hprose 中,您不但可以通过接口方式来调用 Java 服务器提供的服务,同样可
以调用非 Java 服务器提供的服务。
Hprose 用户手册(Java 版) 13
第二章 类型映射
类型映射是 Hprose 的基础,正是因为 Hprose 设计有良好的类型映射机制,才使得多语言互
通得以实现。本章将对 Hprose for Java 的类型映射进行一个详细的介绍。
本章提要
基本类型
容器类型
对象类型
基本类型
Hprose 中的整型为 32 位有符号整型数,表示范围是-2147483648 ~2147483647 (-231~ 2 31-1 )。
Hprose 中的长整型为有符号无限长整型数,表示范围仅跟内存容量有关。
Hprose 中的非数表示浮点型数中的非数(NaN )。
Hprose 中的无穷大表示浮点型数中的正负无穷大数。
Hprose 中的 UTF8 编码的字符,仅支持单字元字符。
Hprose 中的空表示引用类型的值为空(null )。
Hprose 中的空串表示空字符串或零长度的二进制型。
Hprose 中的二进制型表示二进制数据,例如字节数组或二进制字符串。
Hprose 中的字符串型表示 Unicode 字符串数据,以标准 UTF-8 编码存储。
Hprose 中的日期型表示年、月、日,年份范围是 0 ~ 9999 。
Hprose 中的时间型表示时、分、秒(毫秒,微秒,毫微秒为可选部分)。
Hprose 中的日期时间型表示某天的某个时刻,可表示本地或 UTC 时间。
值类型
第二章 类型映射
其中非数和无穷大其实是特殊的浮点型数据,只不过在 Hprose 中它们有单独的表示方式,这样可以使
它们占用更少的存储空间,并得到更快的解析。
另一个可能会引起您注意的是,这里把空和空串也作为值类型对待了。这里把它列为值类型而不是引
用类型,是因为 Hprose 中的值类型和引用类型的概念与程序设计语言中的概念不完全相同。这里的值类型
是表示在 Hprose 序列化过程中,不做引用计数的类型。在序列化过程中,当遇到相等的值类型时,后写入
的值将与先写入的值保持相同的形式,而不是以引用的形式写入。
引用类型
空字符串和零长度的二进制型并不总是表示为空串类型,在某些情况下它们也表示为各自的引用类型。
空串类型只是对二进制型和字符串型的特殊情况的一种优化表示。
引用类型在 Hprose 中有引用计数,在序列化过程中,当遇到相等的引用类型时,后写入的值是先前写
入的值的引用编号。
Hprose 用户手册(Java 版) 15
第二章 类型映射
byte, short, int, Byte, Short, Integer, Enum
Float.POSITIVE_INFINITY ,Double.POSITIVE_INFINITY
Float.NEGATIVE_INFINITY ,Double.NEGATIVE_INFINITY
char, Character, char[1],单字符 String,单字符 StringBuffer
char[], String, StringBuffer, BigDecimal
java.util.Date, java.util.Calendar
后面介绍的容器类型和对象类型也都属于引用类型。
基本类型的映射
Java 类型与 Hprose 类型的映射关系不是一一对应的。在序列化过程中可能会有多种 Java 类型对应同
一种 Hprose 类型,在反序列化过程中还分为默认类型映射和有效类型映射,对于有效类型映射还分为安全
类型映射和非安全类型映射两种。我们下面以列表的形式来说明。
序列化类型映射
反序列化默认类型映射
默认类型是指在对 Hprose 数据反序列化时,在不指定类型信息的情况下得到的反序列化结果类型。
16 Hprose 用户手册(Java 版)
第二章 类型映射
Integer, Long, Float, Double,
BigInteger, BigDecimal, String,
Character
Byte, Short, Boolean, Enum, java.util.Date,
java.util.Calendar, java.sql.Date,
java.sql.Time, java.sql.Timestamp
BigInteger, BigDecimal, String
Byte, Short, Integer, Long, Float, Double,
Boolean, Enum, java.util.Date,
java.util.Calendar, java.sql.Date,
java.sql.Time,java.sql.Timestamp,Character
Byte,Short,Integer,Long,Float,BigInteger,
Boolean, Enum, java.util.Date,
java.util.Calendar, java.sql.Date,
java.sql.Time,java.sql.Timestamp,Character
Float.NaN, Double.NaN,String
反序列化有效类型映射
有效类型是指在对 Hprose 数据反序列化时,可以指定的反序列化结果类型。当指定的类型为安全类型
时,反序列化总是可以得到结果。当指定的类型为非安全类型时,只有当数据符合一定条件时,反序列化
才能得到结果,不符合条件的情况下,可能会得到丢失精度的结果或者抛出异常。当指定的类型为非有效
类型时,反序列化时会抛出异常。
Hprose 用户手册(Java 版) 17
第二章 类型映射
Float.POSITIVE_INFINITY,
Double.POSITIVE_INFINITY, String
Float.NEGATIVE_INFINITY,
Double.NEGATIVE_INFINITY, String
Boolean.TRUE, Byte,Short,Integer,
Long, Float, Double, BigInteger,
BigDecimal, String, Character
Boolean.FALSE,Byte,Short,Integer,
Long, Float, Double, BigInteger,
BigDecimal, String, Character
byte[0] ,char[0],"",StringBuffer
Byte, Short, Integer, Long, Float, Double,
BigInteger, BigDecimal, Enum,
java.util.Calendar,
java.util.GregorianCalendar,java.util.Date,
java.sql.Date, java.sql.Timestamp
String,StringBuffer,char[],byte[]
Byte, Short, Integer, Long, Float, Double,
BigInteger, BigDecimal, Character
java.util.Calendar,
java.util.GregorianCalendar,
java.util.Date, java.sql.Date,
java.sql.Timestamp, Long
java.util.Calendar,
java.util.GregorianCalendar,
java.util.Date, java.sql.Time,
java.sql.Timestamp, Long
java.util.Calendar,
java.util.GregorianCalendar,
java.util.Date,
java.sql.Timestamp, Long
java.sql.Date, java.sql.Time
18 Hprose 用户手册(Java 版)
第二章 类型映射
容器类型
Hprose 中的容器类型包括列表类型和字典类型两种。下面我们来分别介绍它们与 Java 类型的映射关系。
列表类型
序列化类型映射
除 byte[] ,char[] 以外的所有其它数组类型和所有实现了 Collection 接口的类型均映射为 Hprose 列表
类型。
反序列化类型映射
Hprose 列表类型默认映射为 Java 的 ArrayList 类型。有效类型为:
所有数组类型
所有实现了 Collection 接口的可实例化类型
字典类型
序列化类型映射
所有实现了 Map 接口的类型均映射为 Hprose 字典类型。
反序列化类型映射
Hprose 字典类型默认映射为 Java 的 HashMap 类型。有效类型为:
所有实现了 Map 接口的可实例化类型
所有拥有与字典中 Key 所对应的属性或字段相同的自定义可序列化可实例化类型
对象类型
Java 中自定义的可序列化对象类型在序列化时被映射为 Hprose 对象类型。
Hprose 对象类型在反序列化时被映射为:
Java 中自定义的可序列化对象类型
HashMap(当上述类型定义不存在时)
通过 ClassManager 来注册自定义类型
自定义可序列化类型要跟其它语言交互时,默认情况下需要包名和类名都要跟其他语言的定义匹配。
有没有办法让已有的类在不需要修改包名或类名的情况下,就能跟其它语言中的类型交互呢?
通过 hprose.io.ClassManager 的register 方法就可以轻松实现这个需求。例如您有一个 my.package.User
的类,希望传递给 PHP ,但是在 PHP 中与之对应的类是 User ,那么可以这样做:
ClassManager.register(my.package.User, 'User');
Hprose 用户手册(Java 版) 19
第二章 类型映射
Hprose 所支持的 Java 自定义可序列化对象类型仅是 Java 可序列化类型的一个子集。Hprose
对 Java 对象类型的序列化分为两种,一种是按属性序列化,一种是按字段序列化。这两种方
式下都需要在定义类时实现 java.io.Serializable 接口。按属性序列化时,只有 get(is )和
set 存取方法都定义的属性会被序列化。按字段序列化时,没有标明 transient 的字段都会被
序列化。
20 Hprose 用户手册(Java 版)
第三章 服务器
前面我们在快速入门一章里学习了如何创建一个简单的 Hprose for Java 服务器,在本章中您
将深入的了解 Hprose for Java 服务器的更多细节。
本章提要
直接使用 HproseServlet 发布服务
自己编写 Servlet 发布 Hprose 服务
自己编写 JSP 发布 Hprose 服务
第三章 服务器
直接使用 HproseServlet 发布服务
因为在快速入门里面我们已经详细通过图解方式介绍了通过直接使用HproseServlet 发布服务的整个过
程,这里就不再通过图解方式介绍了,下面我们更多关注的是代码部分。
通过 HproseServlet 发布服务很简单,直接通过配置方式就可以,如果要发布的类是现成的,您不需要
编写一行代码就可以完成发布。
发布的方法可以是静态方法,也可以是实例方法。但必须是 public 方法。您还可以同时发布多个类中
的方法。下面先介绍如何发布类中的实例方法。
发布实例方法
在前面快速入门一章里,您已经看过传输简单类型的例子了。所以下面将以传输复杂类型为例,来介
绍发布多个类中的实例方法,其中还包括了继承、覆盖、重载方法发布等内容。
先来看第一个类:
package hprose.exam;
import java.util.HashMap;
import java.util.Map;
public class Exam1 {
protected String id;
public Exam1() {
id = "Exam1";
}
public String getID() {
return id;
}
public int sum(int[] nums) {
int sum = 0;
for (int i = 0, n = nums.length; i < n; i++) {
sum += nums[i];
}
return sum;
}
public Map<String, String> swapKeyAndValue(Map<String, String> strmap) {
Map.Entry[] entrys = strmap.entrySet().toArray(new Map.Entry[strmap.size()]);
strmap.clear();
for (Map.Entry<String, String> entry: entrys) {
strmap.put(entry.getValue(), entry.getKey());
}
return strmap;
}
}
22 Hprose 用户手册(Java 版)