第一部分 基础 1
第1章 一种新的计算模式 1
1·1 Jini的历史 1
1·1·1 Jini的设想 2
1·1·2 更广泛的应用 3
1·1·3 Jini的公开 4
1·1·4 许可证 4
1·1·5 共享源码许可 4
1·2 获取和安装Jini 5
1·2·1 安装Java2 6
1·2·2 安装Jini 7
1·2·3 设置环境 9
1·2·4 启动Jini运行时的服务 10
1·2·5 通过GUI启动所需服务 11
1·2·6 用命令行方式启动所需服务 15
1·2·7 运动例子程序 19
1·3 参考读物和资源 20
2·1·1 传统网络系统 21
第2章 分布式系统 21
2·1 网络中的焦点 21
2·1·2 网络并不透明 22
2·2 新的分布式计算模型 25
2·2·1 需要强类型 26
2·2·2 远程多态性的例子 27
2·2·3 远程特性是接口的一部分而与实现无关 28
2·3 参考读物 29
3·1·1 简明性 31
3·1·2 可靠性 31
3·1 Jini设计的中心 31
第3章 Jini模型 31
3·1·3 可伸缩性 32
3·2 设备不可知论 33
3·3 Jini不是什么 33
3·3·1 Jini不是名字服务器 33
3·4 Jini的五个基本概念 34
3·3·4 Jini不是RMI 34
3·3·5 Jini不是分布式操作系统 34
3·3·3 Jini不是企业JavaBeans 34
3·3·2 Jini不是JavaBeans 34
3·4·1 发现 35
3·4·2 查找 37
3·4·3 租借 41
3·4·4 远程事件 45
3·4·5 事务 51
3·5 后面的内容 56
4·1 成为Jini服务 57
第4章 部署方案 57
4·2 如何为设备和服务使用Jini 58
4·3 在通用计算机上运行Jini 58
4·4 在支持Java的设备上运行Jini 60
4·4·1 Jini和Java子集 60
4·4·2 版本问题 61
4·5 Jini使用设备代理 61
4·6 基本Jini服务的需求 63
4·7 适于使用Jini的情况 63
4.10 后面的内容 64
4·9 参考读物 64
4·8 不适于使用Jini的情况 64
第二部分 Jini的开发 65
第5章 Jini起步 65
5·1 运行Jini服务 65
5·2 按部署情况进行开发 66
5·2·1 运行多个HTTP服务器 67
5·2·2 警惕代码基问题 67
5·2·6 考虑把可下载代码捆绑为一个JAR文件 68
5·2·5 注意CLASSPATH 68
5·2·4 注意安全策略 68
5·2·3 设置安全管理器 68
5·2·7 小结 69
5·3 第一个Jini程序:Hello、World 69
5·3·1 实现服务代理 72
5·3·2 包装”应用程序 73
5·3·3 使用发现和查找 75
5·3·4 其他细节 76
5·3·5 使用服务模板来寻找服务 78
5·3·6 查找一个服务 79
5·3·7 编译并运行例子程序 80
5·4 扩展Hello、World程序的事件能力 84
5·4·1 编写远程事件接收器 86
5·4·2 通过Notify()请求事件 87
5·4·3 编译并运行程序 88
5·5 带有租借的Hello、World例子 91
5·5·1 一个简单的方法 92
5·5·2 编译和运行程序 97
5·6 使用可激活的后端进程 99
5·7 后面的内容 109
第6章 深入理解:发现 110
6·1 发现是什么 110
6·1·1 用组划分群体的名称空间 111
6·1·2 发现的分类 111
6·1·3 发现机制的要求 112
6·2 发现概述 112
6·2·1 IP组播基础 112
6·2·2 服务发起的发现 113
6·2·3 查找服务发起的发现 113
6·2·4 “直接”发现 114
6·3 在应用程序中使用发现 115
6·3·1 DiscoveryListener接口 115
6·3·2 DiscoveryEvent封装了发现信息 115
6·3·3 使用LookupDiscovery控制组播发现 116
6·3·4 使用LookupLocator来控制单播发现 123
6·4 发现协议的内部知识 127
6·4·1 组播请求协议 127
6·4·2 组播通告协议 129
6·4·3 单播发现协议 132
6·5 发现内部的其他问题 137
6·5·1 组播限制及原则 137
6·5·2 组播路由结构 137
6·5·3 安全性 138
6·5·4 主机和网络的需求 138
6·5·5 一些用于实现发现的接口 138
6·6 小结 139
6·7 后面的内容 139
7·1·1 属性是什么 140
7·1 属性基础知识 140
第7章 使用属性描述服务 140
7·1·2 属性的特殊语义 141
7·2 搜寻属性 143
7·3 谁修改属性 144
7·4 标准属性 144
7·5 创建新属性 145
7·6 属性和Bean 147
7·6·1 使用EntryBeans类把Entry映射为Bean 147
7·6·3 项目Bean类 148
7·6·2 如何找到项目Bean 148
7·6·4 标准项目Bean 149
7·6·5 例子:容量Bean 149
7·6·6 另一个例子:使用GUI Bean 151
7·7 参考读物 153
第8章 深入理解:使用查找服务 154
8·1 查找概述 154
8·1·1 查找服务是Jini服务 154
8·1·3 客户如何使用查找 155
8·1·2 服务如何使用查找 155
8·2 发布服务代理:加入协议 156
8·2·1 JoinManager类 157
8·2·2 管理服务ID 159
8·3 在应用程序中使用JoinManager 160
8·3·1 编译并运行例子程序 165
8·3·2 通过JoinManager使用属性 165
8·3·3 限制修改服务控制的属性 166
8·4 客户如何使用查找服务 167
8·4·2 搜寻服务 168
8·4·1 客户生命周期 168
8·4·3 从查找服务请求事件 174
8·4·4 客户方其他问题 180
8·5 管理查找服务 182
8·5·1 服务管理的简要介绍 183
8·5·2 查找管理接口 183
8·5·3 管理Reggie查找服务的实现 184
8·6 查找服务的联合 184
8·7 例子:查找服务隧道 189
8·9 小结 195
8·10 后面的内容 195
8·8 参考读物 195
第9章 一个Jini查找服务浏览器 196
9·1 浏览器做什么 196
9·2 使用浏览器 197
9·3 创建管理构件 197
9·3·1 DestroyAdminPanel 198
9·3·2 StorageLocationAdminPanel 199
9·3·3 用于管理集合的ListBox 201
9·3·4 DiscoveryAdminPanel 204
9·3·5 JoinAdminPanel 207
9·3·6 AdminPanel 211
9·4 通用Jini类型的Jlist表元交付工具 212
9·4·1 LookupCellRenderer 213
9·4·2 ServiceCellRenderer 214
9·4·3 AttrCellRenderer 215
9·5 浏览器框架的核心 217
9·5·1 在列表中存储数据 217
9·5·2 使用发现 218
9·5·4 处理列表事件 220
9·5·3 接收服务事件 220
9·5·5 Browser类 221
9·6 建立并运行浏览器 228
9·7 后面的内容 229
第10章 深入理解:租借 230
10·1 分布式系统中的可靠性 230
10·1·3 使用租借解决问题 231
10·2 租借方案 231
10·1·2 可升级能力的需要 231
10·1·1 自修复的需要 231
10·3 租借的代价 234
10·4 创建租借使用方 234
10·4·1 租约接口 234
10·4·2 LeaseMap接口 238
10·5 用于租借使用者的高层API 239
10·6 租借服务 242
10·6·1 租借服务概述 243
10·6·2 远程租借API 243
10·6·3 用于远程租借的事件和接收器 247
10·6·4 租借服务的实现 248
10·6·5 编译并运行例子程序 257
10·7 租借的实际使用 259
10·7·1 谁处理租约续订 259
10·7·2 租借的危险 261
10·7·3 委托给外部JVM与委托给内部类 261
10·8 小结 261
10·9 后面的内容 262
11·1 租借接口及实现 263
第11章 输出被租借的资源 263
11·2 Landlord范型 264
11·2·1 标识被租借资源 266
11·2·2 实现landlord接口 266
11·3 一个例子 267
11·4 小结 280
11·5 后面的内容 280
第12章 良性的服务 281
12·1 服务的责任 281
12·2·1 通过代管管理 282
12·2 服务管理 282
12·2·2 管理接口 283
12·2·3 实现管理代管程序 283
12·2·4 例子:管理LeaseSertvice 284
12·3 为服务提供用户界面 291
12·4 小结 297
12·5 后面的内容 297
第13章 一个完整的例子:打印服务 298
13·1 打印服务的要求 298
13·2·1 服务的超类 299
13·2 服务开发者的工具套件 299
13·2·2 管理的工具 303
13·3 定义打印服务API 306
13·4 与客户通信:事件和接收器 307
13·5 远程打印接口 308
13·6 打印服务代理 309
13·7 打印机管理API和用户界面 310
13·8 打印服务的内部实现 312
13·8·1 打印 318
13·8·2 持久数据的格式 319
13·8·3 实现打印服务管理 320
13·9 打印客户 323
13·10 编译并运行例子程序 326
13·11 进一步的工作 328
13·12 小结 328
13·13 后面的内容 329
第14章 深入理解:远程事件 330
14·1 通知的需要 330
14·3·1 无序传送 332
14·3 远程事件与本地事件的区别 332
14·2 Jini事件设计的中心 332
14·3·2 部分失败 333
14·3·3 延迟与计算 333
14·4 应用的语义 333
14·5 Jini事件编程模型 334
14·5·1 Remote Event类 334
14·5·2 RemoteEventListener接口 337
14·5·3 其他事件接口 338
14·6 例子:心跳事件 339
14·6·1 用于事件注册的工具套件 340
14·6·2 一个简单的事件生成器 344
14·6·3 测试HeartbeatGenerator的客户程序 352
14·6·4 编译并运行Heartbeat例子 355
14·7 第三方事件代管程序 358
14·7·1 设计为可组合 358
14·7·2 实际应用组合 359
14·7·3 如何通过管道传送事件 359
14·7·4 建立管道 360
14·7·5 接收器角度的管道 361
14·7·6 通过代管程序租借 362
14·8 例子:事件邮箱 363
14·8·1 EventMailbox服务 364
14·8·2 邮箱客户 371
14·8·3 编译并运行例子程序 374
14·9 小结 377
4·10 后面的内容 378
第15章 JavaSpaces 379
15·1 什么是JavaSpaces 379
15·1·3 JavaSpaces的前身 380
15·1·2 基于属性的搜寻 380
15·1·1 对象的文件系统 380
15·2 获取并安装JavaSpaces 381
15·2·1 从Sun公司下载JavaSpaces 381
15·2·2 解包分发软件 382
15·2·3 检查分发软件 382
15·2·4 设置环境 383
15·2·5 启动运行时服务 383
15·4 JavaSpaces编程模型 389
15·3 暂态性和持久性JauaSpaces 389
15·4·1 事务的简要介绍 390
15·4·2 JavaSpaces API 390
15·5 例子:使用JavaSpaces记录持久性事件 394
15·5·1 搜寻能力的设计 394
15·5·2 群体监视程序Watcher 397
15·5·3 记录事件数据的使用者程序 402
15·5·4 编译并运行程序 407
15·6 用JavaSpaces解决分布式计算的问题 409
15·7 参考读物 410
15·8 后面的内容 411
第16章 分布式事务 412
16·1 致性与部分失败 412
16·2 经典”事务模式 413
16·3 Jini中的事务 414
16·4 使用Jini事务编程 416
16·4·1 事务管理器 416
16·4·2 创建事务 416
16·4·3 事务接口 417
16·4·5 在JavaSpaces中使用事务 419
16·4·4 事务参与者 419
16·5 事务的其他内容及习惯用法 427
16·5·1 事务和可视化 427
16·5·2 事务的嵌套 427
16·5·3 事件和序列号 428
16·5·4 使用事务隐藏数据 429
16·6 小结 429
附录 431
附录A RMI入门 431
附录B Java和Jini系统的常用属性 448