Java学习从入门到精通

时间:2022-01-21 04:17:33

Java学习从入门到精通  

Java Learning Path (一)、工具篇

一、 JDK (Java Development Kit)

JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库(rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK。因此掌握JDK是学好Java的第一步。最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK等等。其中IBM的JDK包含的JVM(Java Virtual Machine)运行效率要比Sun JDK包含的JVM高出许多。而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。但不管怎么说,我们还是需要先把Sun JDK掌握好。

1、 JDK的下载和安装
JDK又叫做J2SE(Java2 SDK Standard Edition),可以从Sun的Java网站上下载到,http://java.sun.com/j2se/downloads.html ,JDK当前最新的版本是J2SDK1.4.2,建议下载该版本的JDK,下载页面在这里:http://java.sun.com/j2se/1.4.2/download.html

下载好的JDK是一个可执行安装程序,默认安装完毕后会在C:\Program Files\Java\目录下安装一套JRE(供浏览器来使用),在C:\j2sdk1.4.2下安装一套JDK(也包括一套JRE)。然后我们需要在环境变量PATH的最前面增加java的路径C:\j2sdk1.4.2\bin。这样JDK就安装好了。

2、 JDK的命令工具
JDK的最重要命令行工具:
java: 启动JVM执行class
javac: Java编译器
jar: Java打包工具
javadoc: Java文档生成器
这些命令行必须要非常非常熟悉,对于每个参数都要很精通才行。对于这些命令的学习,JDK Documentation上有详细的文档。


二、 JDK Documentation

Documentation在JDK的下载页面也有下载连接,建议同时下载Documentation。Documentation是最最重要的编程手册,涵盖了整个Java所有方面的内容的描述。可以这样说,学习Java编程,大部分时间都是花在看这个Documentation上面的。我是随身携带的,写Java代码的时候,随时查看,须臾不离手。


三、 应用服务器(App Server)

App Server是运行Java企业组件的平台,构成了应用软件的主要运行环境。当前主流的App Server是BEA公司的Weblogic Server和IBM公司的Websphere以及免费的Jboss,选择其中一个进行学习就可以了,个人推荐Weblogic,因为它的体系结构更加干净,开发和部署更加方便,是Java企业软件开发人员首选的开发平台。下面简要介绍几种常用的App Server:

1、 Tomcat
Tomcat严格意义上并不是一个真正的App Server,它只是一个可以支持运行Serlvet/JSP的Web容器,不过Tomcat也扩展了一些App Server的功能,如JNDI,数据库连接池,用户事务处理等等。Tomcat被非常广泛的应用在中小规模的Java Web应用中,因此本文做一点下载、安装和配置Tomcat的介绍:

Tomcat是Apache组织下Jakarta项目下的一个子项目,它的主网站是:http://jakarta.apache.org/tomcat/ ,Tomcat最新版本是Tomcat4.1.27,软件下载的连接是:http://www.apache.org/dist/jakarta/tomcat-4/binaries/ 。

下载Tomcat既可以直接下载zip包,也可以下载exe安装包(个人建议zip更干净些),不管哪种情况,下载完毕安装好以后(zip直接解压缩就可以了)。需要设置两个环境变量:

JAVA_HOME=C:\j2sdk1.4.2
CATALINA_HOME=D:\tomcat4 (你的Tomcat安装目录)

这样就安装好了,启动Tomcat运行CATALINA_HOME\bin\startup.bat,关闭Tomcat运行shutdown.bat脚本。Tomcat启动以后,默认使用8080端口,因此可以用浏览器访问http://localhost:8080来测试Tomcat是否正常启动。

Tomcat提供了两个Web界面的管理工具,URL分别是:
http://localhost:8080/admin/index.jsp 
http://localhost:8080/manager/html 
在启用这两个管理工具之前,先需要手工配置一下管理员用户和口令。用一个文本工具打开CATALINA_HOME\conf\tomcat-users.xml这个文件,加入如下几行:

<role rolename="manager"/>
<role rolename="admin"/>
<user username="robbin" password="12345678" roles="admin,manager,tomcat"/>

这样用户“robbin”就具备了超级管理员权限。重新启动Tomcat以后,你就可以使用该用户来登陆如上的两个管理工具,通过Web方式进行Tomcat的配置和管理了。

2、 BEA Weblogic
Weblogic可以到BEA的网站上免费注册之后下载到最新的Weblogic8.1企业版,License可以免费使用1年时间,其实这已经完全足够了。Weblogic的下载连接:http://commerce.bea.com/index.jsp.../edocs.bea.com/ 。

3、 IBM Webshpere
Websphere同样可以下载到免费的试用版本,到IBM的developerWorks网站可以看到Websphere试用产品的下载和相关的Websphere的资料,developerWorks中文网站的连接是:http://www-900.ibm.com/developerWorks/cn/wsdd/ ,Websphere的下载连接:http://www7b.software.ibm.com/wsdd/...WASsupport.html 。

4、 Jboss
Jboss是免费开源的App Server,可以免费的从Jboss网站下载:http://www.jboss.org/index.html,然...n.com/idea.html 


四、 Java应用的运行环境

Java的应用可以简单分为以下几个方面:

1、 Java的桌面应用
桌面应用一般仅仅需要JRE的支持就足够了。

2、 Java Web应用
Java的Web应用至少需要安装JDK和一个web容器(例如Tomcat),以及一个多用户数据库,Web应用至少分为三层:
Browser层:浏览器显示用户页面
Web层:运行Servlet/JSP
DB层:后端数据库,向Java程序提供数据访问服务

3、 Java企业级应用
企业级应用比较复杂,可以扩展到n层,最简单情况会分为4层:
Browser层:浏览器显示用户页面
Client层:Java客户端图形程序(或者嵌入式设备的程序)直接和Web层或者EJB层交互
Web层:运行Servlet/JSP
EJB层:运行EJB,完成业务逻辑运算
DB层:后端数据库,向Java程序提供数据访问服务

4、 Java嵌入式应用
Java嵌入式应用是一个方兴未艾的领域,从事嵌入式开发,需要从Sun下载J2ME开发包,J2ME包含了嵌入式设备专用虚拟机KVM,和普通的JDK中包含的JVM有所不同。另外还需要到特定的嵌入式厂商那里下载模拟器。


Java Learning Path(二)、书籍篇

学习一门新的知识,不可能指望只看一本,或者两本书就能够完全掌握。需要有一个循序渐进的阅读过程。我推荐Oreilly出版的Java系列书籍。

在这里我只想补充一点看法,很多人学习Java是从《Thinking in Java》这本书入手的,但是我认为这本书是不适合初学者的。我认为正确的使用这本书的方法应该是作为辅助的读物。《Thinking in Java》并不是在完整的介绍Java的整个体系,而是一种跳跃式的写作方法,是一种类似tips的方法来对Java很多知识点进行了深入的分析和解释。

对于初学者来说,最好是找一本Java入门的书籍,但是比较完整的循序的介绍Java的语法,面向对象的特性,核心类库等等,在看这本书的同时,可以同步来看《Thinking in Java》,来加深对Java的理解和原理的运用,同时又可以完整的了解Java的整个体系。

对于Java的入门书籍,蔡学镛推荐的是Oreilly的《Exploring Java, 2nd Edition》 或者《Java in a Nutshell,2nd Edition(针对C++背景)》,我并没有看过这两本书。其实我觉得电子工业出版社的《Java 2编程详解》或者《Java 2从入门到精通》就很不错。

在所有的Java书籍当中,其实最最有用的,并不是O'reilly的 Java Serials,真正最最有用处是JDK的Documentation!几乎你想获得的所有的知识在Documentation里面全部都有,其中最主要的部分当然是Java基础类库的API文档,是按照package来组织的,对于每一个class都有详细的解释,它的继承关系,是否实现了某个接口,通常用在哪些场合,还可以查到它所有的public的属性和方法,每个属性的解释,意义,每个方法的用途,调用的参数,参数的意义,返回值的类型,以及方法可能抛出的异常等等。可以这样来说,所有关于Java编程方面的书籍其实都不过是在用比较通俗易懂的语言,和良好的组织方式来介绍Documentation里面的某个package里面包含的一些类的用法而已。所以万变不离其宗,如果你有足够的能力来直接通过Documentation来学习Java的类库,那么基本上就不需要看其他的书籍了。除此之外,Documentation也是编程必备的手册,我的桌面上有三个Documentation的快捷方式,分别是J2SDK1.4.1的Documentation,Servlet2.3的Documentation和J2SDKEE1.3.1的Documentation。有了这个三个Documentation,什么其他的书籍都不需要了。

对于Java Web 编程来说,最核心的是要熟悉和掌握HTTP协议,这个就和Java无关了,在熟悉HTTP协议之后,就需要熟悉Java的实现HTTP协议的类库,也就是Servlet API,所以最重要的东西就是Servlet API。当然对于初学者而言,直接通过Servlet API来学习Web编程有很大的难度,我推荐O'reilly的《Java Server Pages 》这本书来学习Web 编程。

EJB的书籍当中,《Enterprise JavaBeans, 2nd Edition》是一本很不错的书, EJB的学习门槛是比较高,入门很难,但是这本书完全降低了学习的难度,特别重要的一点是,EJB的学习需要结合一种App Server的具体实现,所以在学习EJB的同时,必须同步的学习某种App Server,而这本书相关的出了三本书,分别是Weblogic6.1,Websphere4.0和JBoss3.0上面部署书中例子的实做。真是既有理论,又有实践。在学习EJB的同时,可以边看边做,EJB的学习会变得很轻松。

但是这本书也有一个问题,就是版本比较旧,主要讲EJB1.1规范和部分EJB2.0的规范。而Ed Roman写的《Mastering EJB 2.0》这本书完全是根据EJB2.0规范写的,深入浅出,覆盖了EJB编程的各个方面,并且还有很多编程经验tips,也是学习EJB非常推荐的书籍之一。

如果是结合Weblogic来学习J2EE的话,《J2EE应用与BEA Weblogic Server》绝对是首选读物,虽然是讲述的Weblogic6.0,仍然值得购买,这本书是BEA官方推荐的教材,作者也是BEA公司的工程师。现在中文版已经随处可见了。这本书结合Weblogic介绍了J2EE各个方面的技术在Weblogic平台上的开发和部署,实践指导意义非常强。

在掌握了Java平台基础知识和J2EE方面的知识以后,更进一步的是学习如何运用OO的方法进行软件的设计,那么就一定要学习“设计模式”。Sun公司出版了一本《J2EE核心模式》,是每个开发Java企业平台软件的架构师必备的书籍。这本书全面的介绍了J2EE体系架构的各种设计模式,是设计师的必读书籍。

Java Learning Path(三)过程篇

每个人的学习方法是不同的,一个人的方法不见得适合另一个人,我只能是谈自己的学习方法。因为我学习Java是完全自学的,从来没有问过别人,所以学习的过程基本上完全是自己摸索出来的。我也不知道这种方法是否是比较好的方法,只能给大家提供一点参考了。

学习Java的第一步是安装好JDK,写一个Hello JWorld, 其实JDK的学习没有那么简单,关于JDK有两个问题是很容易一直困扰Java程序员的地方:一个是CLASSPATH的问题,其实从原理上来说,是要搞清楚JRE的ClassLoader是如何加载Class的;另一个问题是package和import问题,如何来寻找类的路径问题。把这两个问题摸索清楚了,就扫除了学习Java和使用JDK的最大障碍。推荐看一下王森的《Java深度历险》,对这两个问题进行了深入的探讨。

第二步是学习Java的语法。Java的语法是类C++的,基本上主流的编程语言不是类C,就是类C++的,没有什么新东西,所以语法的学习,大概就是半天的时间足够了。唯一需要注意的是有几个不容易搞清楚的关键字的用法,public,protected,private,static,什么时候用,为什么要用,怎么用,这可能需要有人来指点一下,我当初是完全自己琢磨出来的,花了很久的时间。不过后来我看到《Thinking in Java》这本书上面是讲了这些概念的。

第三步是学习Java的面向对象的编程语言的特性的地方。比如继承,构造器,抽象类,接口,方法的多态,重载,覆盖,Java的异常处理机制。对于一个没有面向对象语言背景的人来说,我觉得这个过程需要花很长很长时间,因为学习Java之前没有C++的经验,只有C的经验,我是大概花了一个月左右吧,才彻底把这些概念都搞清楚,把书上面的例子反复的揣摩,修改,尝试,把那几章内容反复的看过来,看过去,看了不下5遍,才彻底领悟了。不过我想如果有C++经验的话,应该一两天时间足够了。那么在这个过程中,可以多看看《Thinking in Java》这本书,对面向对象的讲解非常透彻。可惜的是我学习的时候,并没有看到这本书,所以自己花了大量的时间,通过自己的尝试和揣摩来学会的。

第四步就是开始熟悉Java的类库。Java的基础类库其实就是JDK安装目录下面jre\lib\rt.jar这个包。学习基础类库就是学习rt.jar。基础类库里面的类非常非常多。据说有3000多个,我没有统计过。但是真正对于我们来说最核心的只有4个,分别是
java.lang.*;
java.io.*;
java.util.*;
java.sql.*;

这四个包的学习,每个包的学习都可以写成一本厚厚的教材,而O'reilly也确实是这样做的。我觉得如果时间比较紧,是不可能通过读四本书来学习。我觉得比较好的学习方法是这样的:
首先要通读整个package的框架,了解整个package的class,interface,exception的构成,最好是能够找到介绍整个包框架的文章。这些专门介绍包的书籍的前几章应该就是这些总体的框架内容介绍。

对包整体框架的把握并不是要熟悉每个类的用法,记住它有哪些属性,方法。想记也记不住的。而是要知道包有哪些方面的类构成的,这些类的用途是什么,最核心的几个类分别是完成什么功能的。我在给人培训的时候一般是一次课讲一个包,所以不可能详细的介绍每个类的用法,但是我反复强调,我给你们讲这些包的不是要告诉你们类的方法是怎么调用的,也不要求你们记住类的方法调用,而是要你们了解,Java给我们提供了哪些类,每个类是用在什么场合,当我遇到问题的时候,我知道哪个类,或者哪几个类的组合可以解决我的问题,That'all!,当我们具体写程序的时候,只要你知道该用哪个类来完成你的工作就足够了。编码的时候,具体的方法调用,是边写代码,边查Documentation,所有的东西都在Documentation里面,不要求你一定记住,实际你也记不住3000多个类的总共将近10万个方法调用。所以对每个包的总体框架的把握就变得极为重要。

第五步,通过上面的学习,如果学的比较扎实的话,就打好了Java的基础了,剩下要做的工作是扫清Documentation里面除了上面4个包之外的其他一些比较有用处的类。相信进展到这一步,Java的自学能力已经被培养出来了,可以到了直接学习Documentation的水平了。除了要做GUI编程之外,JDK里面其他会有用处的包是这些:
java.text.*;
java.net.*;
javax.naming.*;
这些包里面真正用的比较多的类其实很少,只有几个,所以不需要花很多时间。

第六步,Java Web 编程
Web编程的核心是HTTP协议,HTTP协议和Java无关,如果不熟悉HTTP协议的话,虽然也可以学好Servlet/JSP编程,但是达不到举一反三,一通百通的境界。所以HTTP协议的学习是必备的。如果熟悉了HTTP协议的话,又有了Java编程的良好的基础,学习Servlet/JSP简直易如反掌,我学习Servlet/JSP就用了不到一周的时间,然后就开始用JSP来做项目了。

在Servlet/JSP的学习中,重头仍然是Servlet Documentation。Servlet API最常用的类很少,花比较少的时间就可以掌握了。把这些类都看一遍,多写几个例子试试。Servlet/JSP编程本质就是在反复调用这些类来通过HTTP协议在Web Server和Brower之间交谈。另外对JSP,还需要熟悉几个常用JSP的标记,具体的写法记不住的话,临时查就是了。

此外Java Web编程学习的重点要放在Web Application的设计模式上,如何进行业务逻辑的分析,并且进行合理的设计,按照MVC设计模式的要求,运用Servlet和JSP分别完成不同的逻辑层,掌握如何在Servlet和JSP之间进行流程的控制和数据的共享,以及Web Application应该如何配置和部署。

第七步,J2EE编程
以上的学习过程如果是比较顺利的话,进行到这一步,难度又陡然提高。因为上面的知识内容都是只涉及一个方面,而像EJB,JMS,JTA等核心的J2EE规范往往是几种Java技术的综合运用的结晶,所以掌握起来难度比较大。

首先一定要学习好JNDI,JNDI是App Server定位服务器资源(EJB组件,Datasouce,JMS)查找方法,如果对JNDI不熟悉的话,EJB,JMS这些东西几乎学不下去。JNDI其实就是javax.naming.*这个包,运用起来很简单。难点在于服务器资源文件的配置。对于服务器资源文件的配置,就需要看看专门的文档规范了,比如web.xml的写法,ejb-jar.xml的写法等等。针对每种不同的App Server,还有自己的服务资源配置文件,也是需要熟悉的。

然后可以学习JTA,主要是要理解JTA对于事务的控制的方法,以及该在什么场合使用JTA。这里可以简单的举个例子,我们知道一般情况可以对于一个数据库连接进行事务控制(conn.setAutoCommit(false),....,conn.commit()),做为一个原子操作,但是假设我的业务需求是要把对两个不同数据库的操作做为一个原子操作,你能做的到吗?这时候只能用JTA了。假设操作过程是先往A数据库插一条记录,然后删除B数据库另一个记录,我们自己写代码是控制不了把整个操作做为一个原子操作的。用JTA的话,由App Server来完成控制。

在学习EJB之前要学习对象序列化和RMI,RMI是EJB的基础。接着学习JMS和EJB,对于EJB来说,最关键是要理解EJB是如何通过RMI来实现对远端对象的调用的,以及在什么情况下要用到EJB。

在学习完EJB,JMS这些东西之后,你可能会意识到要急不可待学习两个领域的知识,一个是UML,另一个是Design Pattern。Java企业软件的设计非常重视框架(Framework)的设计,一个好的软件框架是软件开发成功的必要条件。在这个时候,应该开始把学习的重点放在设计模式和框架的学习上,通过学习和实际的编程经验来掌握EJB的设计模式和J2EE的核心模式。

J2EE规范里面,除了EJB,JMS,JTA,Servlet/JSP,JDBC之外还有很多很多的企业技术,这里不一一进行介绍了。

另外还有一个最新领域Web Services。Web Services也完全没有任何新东西,它像是一种黏合剂,可以把不同的服务统一起来提供一个统一的调用接口,作为使用者来说,我只要获得服务提供者给我的WSDL(对服务的描述),就够了,我完全不知道服务器提供者提供的服务究竟是EJB组件,还是.Net组件,还是什么CORBA组件,还是其他的什么实现,我也不需要知道。Web Services最伟大的地方就在于通过统一的服务提供方式和调用方式,实现了整个Internet服务的共享,是一个非常令人激动的技术领域。Web Services好像目前还没有什么很好的书籍,但是可以通过在网络上面查资料的方式来学习。

Java Learning Path(四) 方法篇

Java作为一门编程语言,最好的学习方法就是写代码。当你学习一个类以后,你就可以自己写个简单的例子程序来运行一下,看看有什么结果,然后再多调用几个类的方法,看看运行结果,这样非常直观的把类给学会了,而且记忆非常深刻。然后不应该满足把代码调通,你应该想想看如果我不这样写,换个方式,再试试行不行。记得哪个高人说过学习编程就是个破坏的过程,把书上的例子,自己学习Documentation编写的例子在运行通过以后,不断的尝试着用不同的方法实现,不断的尝试破坏代码的结构,看看它会有什么结果。通过这样的方式,你会很彻底的很精通的掌握Java。

举个例子,我们都编过Hello World

public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}

很多初学者不是很理解为什么main方法一定要这样来定义public static void main(String[] args),能不能不这样写?包括我刚学习Java的时候也有这样的疑问。想知道答案吗?很简单,你把main改个名字运行一下,看看报什么错误,然后根据出错信息进行分析;把main的public取掉,在试试看,报什么错误;static去掉还能不能运行;不知道main方法是否一定要传一个String[]数组的,把String[]改掉,改成int[],或者String试试看;不知道是否必须写args参数名称的,也可以把args改成别的名字,看看运行结果如何。

我当初学习Java的时候就是这样做的,把Hello World程序反复改了七八次,不断运行,分析运行结果,最后就彻底明白为什么了main方法是这样定义的了。

此外,我对于staic,public,private,Exception,try{ }catch {}finally{}等等等等一开始都不是很懂,都是把参考书上面的例子运行成功,然后就开始破坏它,不断的根据自己心里面的疑问来重新改写程序,看看能不能运行,运行出来是个什么样子,是否可以得到预期的结果。这样虽然比较费时间,不过一个例子程序这样反复破坏几次之后。我就对这个相关的知识彻底学通了。有时候甚至故意写一些错误的代码来运行,看看能否得到预期的运行错误。这样对于编程的掌握是及其深刻的。

其中特别值得一提的是JDK有一个非常棒的调试功能,-verbose 
java –verbose
javac –verbose 以及其它很多JDK工具都有这个选项
-verbose 可以显示在命令执行的过程中,JVM都依次加载哪里Class,通过这些宝贵的调试信息,可以帮助我们分析出JVM在执行的过程中都干了些什么。

另外,自己在学习过程中,写的很多的这种破坏例程,应该有意识的分门别类的保存下来,在工作中积累的典型例程也应该定期整理,日积月累,自己就有了一个代码库了。遇到类似的问题,到代码库里面 Copy & Paste ,Search & Replace,就好了,极大提高了开发速度。最理想的情况是把一些通用的例程自己再抽象一层,形成一个通用的类库,封装好。那么可复用性就更强了。

所以我觉得其实不是特别需要例程的,自己写的破坏例程就是最好的例子,如果你实在对自己写的代码不放心的话,我强烈推荐你看看JDK基础类库的Java源代码。在JDK安装目录下面会有一个src.zip,解开来就可以完整的看到整个JDK基础类库,也就是rt.jar的Java源代码,你可以参考一下Sun是怎么写Java程序的,规范是什么样子的。我自己在学习Java的类库的时候,当有些地方理解的不是很清楚的时候,或者想更加清晰的理解运作的细节的时候,往往会打开相应的类的源代码,通过看源代码,所有的问题都会一扫而空。

Java Learning Path(五)资源篇

1、 http://java.sun.com/ (英文)
Sun的Java网站,是一个应该经常去看的地方。不用多说。

2、http://www-900.ibm.com/developerWorks/cn/ 
IBM的developerWorks网站,英语好的直接去英文主站点看。这里不但是一个极好的面向对象的分析设计网站,也是Web Services,Java,Linux极好的网站。强烈推荐!!!

3、http://www.javaworld.com/ (英文)
关于Java很多新技术的讨论和新闻。想多了解Java的方方面面的应用,这里比较好。

4、http://dev2dev.bea.com.cn/index.jsp 
BEA的开发者园地,BEA作为最重要的App Server厂商,有很多独到的技术,在Weblogic上做开发的朋友不容错过。

5、http://www.huihoo.com/ 
灰狐动力网站,一个专业的中间件网站,虽然不是专业的Java网站,但是在J2EE企业应用技术方面有深厚的造诣。

6、http://www.theserverside.com/home/ (英文)
TheServerSide是一个著名的专门面向Java Server端应用的网站。

7、http://www.javaresearch.org/ 
Java研究组织,有很多优秀的Java方面的文章和教程,特别是在JDO方面的文章比较丰富。

8、http://www.cnjsp.org/ 
JSP技术网站,有相当多的Java方面的文章和资源。

9、http://www.jdon.com/ 
Jdon论坛,是一个个人性质的中文J2EE专业技术论坛,在众多的Java的中文论坛中,Jdon一个是技术含量非常高,帖子质量非常好的论坛。

10、http://sourceforge.net/
SourgeForge是一个开放源代码软件的大本营,其中也有非常非常丰富的Java的开放源代码的著名的软件。

Jini技术常见问题解答

来源:ChinaITLab

2002-12-24 12:39:00

 


  Jini技术概述 
  
  
  问题1:什么是JiniTM技术? 
  
  
  Jini技术是基于Java技术的一种新的技术突破,它使各种设备可以非常简单地连接到任意无准备的网络(impromptu network)上,从而使得对新的网络服务的访问和发送变得就象接入电话一样简单。建立在Java软件基础结构之上的Jini技术可以使所有类型的数字设备,在不需要大量的计划、安装或人为干预的情况下,共同运行在一个社区(community)中。每个设备可提供该社区中的其它设备可能需要使用的服务。这些设备还提供了它们自己的用户接口或程序接口,这就保证了可靠性和兼容性。 
  
  
  问题2:什么是无准备社区(impromptu community)? 
  
  
  用无准备社区可以描述当两个或多个使用Jini技术的设备一起共享它们的服务时的情形。由于设备之间不需要为连接到该社区而具备彼此间的预先了解,因此可以说该社区是无准备的。Jini技术允许设备动态地建立通信以共享和交换网络中的服务。无准备社区是一种动态环境,它消除了对设备配置或安装驱动的需求。 
  
  
  例如,假设有一台接入网络的照相机。在不需要安装驱动、插入CD-ROM或软盘以及从键盘键入命令的情况下,该照相机即可立即连入网络。该照相机标识它自己并提供服务。如果照相机能够说话,它可能会说:"我是照相机,谁要照相?"你可能有一台使用Jini技术的要加入到该网络的膝上型电脑,这时你可能访问该照相机,照一张相,并把照片发送到你自己的磁盘驱动器上,或为打印而将它发送到另一个设备上。 
  
  
  问题3Jini技术有哪些益处? 
  
  
  所有的Jini技术都是为了简化网上的交互。Java平台已经将这种简化启动,而Jini则将其进一步完善。简化意味着改善的生产力、费用降低和便于使用。Jini技术让你使用网络就象使用电话一样的简单。它使ISVsIHVs和部件制造商得以扩展到新的市场,并提供基于网络的改良的产品和服务。Jini软件还允许传统的服务供应商能够动态地增加和管理网络服务。 
  
  
  问题4Jini技术一般都用在哪些地方? 
  
  
  几乎所有需要处理数字信息输入和输出的设备都有可能连接到使用Jini技术的社区,这不仅包括传统的计算机硬件和软件,而且还包括应用消费品,如个人数字助理(PDA)、数字相机、录象机、电视、DVD播放机、蜂窝电话和CD播放机等。传统的部件和外设制造商对此已显示了极大的兴趣,他们都希望将自己转化为增值网络服务供应商。另外,企业服务供应商对此也非常有兴趣,他们期望简化并扩展他们的网络能力。 
  
  
  问题5Jini技术迎合了什么发展趋势? 
  
  
  随着处理器和其它技术设备价格的下降,传统的计算机的定义和用途正在扩展。使用的技术也从原来的单用户PCs和几百万美元的大型计算机发展到今天的基于网络的计算应用。对能够将全球连通的宽带网络的投资仍在进行。网络设备本身也不限于传统的计算机。相反地,从数字相机到蜂窝电话到家用电器都使用了某种类型的微处理器,并且具备一定程度的网络智能。但是,今天的网络对一般用户来说仍然是复杂的,不容易管理和使用。他们正在寻找更简单而可靠的网络解决方案。通过采用象实用工具一样的网络以达到对信息、数据和服务的共享和计算,这种方式将变得越来越普遍。分布式计算技术将被用来驾御网络的各种功能。在许多领域,由于Java技术的普遍采用,将会提供一种"编写一次,随处运行"的软件平台。网络的这种发展趋势--随处可用、简单、采用Java以及分布式计算技术--Jini技术的产生奠定了基础。 
  
  
  问题6:业界对Jini技术的反响如何? 
  
  
  反响非常热烈。市场上对有关能够简化网络的技术的需求是非常大的。对出于研究和非赢利(组织内部)目的的用户,Sun可免费提供Jini技术的源代码。因而,一大批组织机构已开始调研Jini技术。同时,一大批从事电子消费品、计算机外部设备、企业级计算、计算机系统、网络服务供应以及软件的公司也已购买了Jini技术许可证,并在其商业化的数字产品和服务中使用Jini技术。 
  
  
  问题7Jini技术的主要设计者有哪些? 
  
  
  在 Bill Joy 和 Jim Waldo 的领导下,一些在分布式计算领域的精英参加了Jini技术开发项目。他们包括Java远程方法调用(Java RMI)的发明和设计者Ann WollrathJavaSpaces技术的设计者、同时也是与James Gosling共同完成"Java programming language"的作者Ken Arnold、以及 协会的负责人和查找/发现(Lookup/Discovery)的设计者Bob Scheifler。 
  
  
  问题8:我从哪里可以找到有关Jini技术的更多信息? 
  
  
  从下列网址可以找到有关Jini技术的更多信息:http://www.sun.com/jini 
  
  Jini技术详解 
  
  
  问题9Jini技术是如何运作的? 
  
  
  基于有关协议和一套Java技术接口,Jini技术使设备和应用程序可进入到网上虚拟机的无准备社区之中。采用Jini技术的设备使用一种被称作发现(discovery)的进程来寻找同样也采用Jini技术的设备。然后这些设备可向Jini技术的查找服务(lookup service)发送对象--这些对象代表了该设备所提供的服务以及它们的定义特征和属性。当一个设备需要使用社区中的一项服务时,它可以从Jini技术的查找服务中下载所需的对象,包括任何代码,如应用程序、设备驱动或用户接口等。 
  
  
  问题10:当一个新设备被接入网络时,会怎么样呢? 
  
  
  为将设备的服务提供给本地社区,该设备必须使用Jini技术来注册它所提供的服务。这可通过两个步骤来完成。首先,该设备轮询本地网络以确认Jini技术的查找(lookup)服务的所在位置;然后,再将自己注册在该查找服务上。这两个步骤被称作discoveryjoin进程。对该设备提供的每一个服务,该进程都向查找服务上载一个Java对象,作为该服务的接口。 
  
  
  问题11Jini软件可在什么设备上运行? 
  
  
  Jini软件即Java软件代码。它可以运行在任意的数字设备上,如蜂窝电话、数字相机、个人数字助理(PDA),甚至还包括智能磁卡等。 
  
  
  问题12:为了使用Jini技术,是不是网上的所有设备都必须采用Java平台。 
  
  
  不是。这些设备可以允许网上的其它部件代表它们来执行需要Java技术的Jini软件。通过将Jini软件所需要的某些特定的Java功能委托给第三者,一个设备可以不必有它自己的虚拟机,并且在几乎不需要有附加代码的情况下,即可成为Jini技术网络的部件。成为网络社区的组成部分所需要的所有功能可由网络中与该设备有伙伴关系的另一系统来实现。 
  
  
  问题13:我怎样才能知道我在网上具有一个Java虚拟机? 
  
  
  不管你知道还是不知道,你的机器可能已经正在使用一个或者几个Java虚拟机了。它们被嵌套于大多数Web浏览器以及各种设备中。如果对一个发现(discovery)的询问(query)出现了一个响应,则表示在网络上具有了一个Java虚拟机。 
  
  
  问题14:一个应用程序是如何使用Jini软件的? 
  
  
  为使用社区中的服务,一个应用程序必须首先用发现协议来定位一个Jini技术的查找服务,然后它则可以使用该查找服务来定位能够提供所需服务类型的设备。应用程序则可以从该查找服务中下载一个可被用来与选定的设备进行交互的Java对象,该对象被用来处理任何有关设备的细节;运行应用程序的机器不需要具备该设备的驱动程序。 
  
  
  问题15:如果一个设备被断开连接,会怎么样呢? 
  
  
  Jini使用一种被称作"租用(leasing"的技术来检测什么时候一个服务是不可用的。当一个设备在查找服务注册后,它会收到一个"租用"。这个租用必须被定期更新。如果未被更新,查找服务则会将该设备从服务列表中删除。删除一个设备不影响由其余社区成员所提供的状态或服务。 
  
  
  问题16: Jini技术适用于我现在的网络吗
  
  
  因为Jini技术是基于Java平台的所以它可以运行于任何具有至少一个Java虚拟机(JVM)的网络包括采用传统操作环境的网络如采用Novell Netwaremicrosoft Windows的网络。 
  
  
  问题17: 使用Jini技术需要替换现存软件或硬件吗
  
  
  不需要。通过添加某些Jini软件现存数字设备可被升级以达到使用Jini技术的目的。例如一旦你的PC拥有了Jini软件它便可以使用其它设备的服务并且其本身也可被当作一个服务而提供给其它设备。甚至于那些连接在你的PC上的设备,如磁盘或打印机,在添加了适当的Jini软件后,也可以作为服务提供给其它设备。 
  
  
  即使PC被升级以使用Jini技术,该PC上使用的现有软件也不需要改动。通过改变软件而在网络上提供服务则需要对软件进行升级。 
  
  Jini技术的开发 
  
  
  问题18:我可以将Jini技术添加到我的现行软件上吗?我应该怎样做? 
  
  
  可以。第一步,要为你的代码提供一个Java软件的包装器,这样这些代码即可在一个Java虚拟机(JVM)内运行。你可以找到有关这个过程的很好的文本说明,因为目前有数以千计的开发者都要实现这个过程。第二步是将那些可告知你的程序来宣布它自己的代码添加到查找服务上。我们将提供一些示例代码及升级工具来帮助你完成这一步。 
  
  
  问题19:什么是Jini技术社区? 
  
  
  Jini技术社区由任意对创建应用程序或服务感兴趣的开发组织或个人所组成。该社区的成员必须执行基本的Sun社区资源许可(Sun Community Source Licence SCSL))协议以获得对Jini技术源代码的访问。他们分享一定的权力和责任以保护Jini技术的开放的和可扩展的性质。这些成员可参加用户小组、开发论坛及顾问讨论会,还可能获得来自Sun Microsystems和其它社区成员的开发与技术支持。 
  
  
  问题20Sun拥有哪类计划可以支持各类组织使用Jini技术进行开发? 
  
  
  为鼓励Jini技术社区内的创新,Sun为使用Jini技术的商业性的产品提供全方位的技术信息、支持服务以及市场支援。从具有深入技术信息和共享资源库的免费Web站点,到专业级的技术支持以及超级合作营销机会,Sun的计划可帮助开发者为Jini技术探索新的用途,开发具有创新的产品和服务,以及为使用Jini软件创建用户需求。 
  
  
  问题21:有可以使用的Jini技术开发工具吗? 
  
  
  因为Jini技术是基于Java平台的,所以任何可被用在Java软件开发上的现有开发工具都可被用在Jini软件的开发上。除此之外,实用工具类和实现正在被开发,并可免费获取。 这将会减低使用Jini技术的服务和客户(clients)的开发难度。 
  
  
  问题22:是否有创建Jini技术部件或服务的可视开发工具? 
  
  
  在当前这个早期阶段,还没有为Jini技术使用的商业性的可视工具包。然而,我们的确期望社区成员能够提交这类工具,并且我们鼓励商务公司为Jini技术开发类似于用在其它技术上的工具包。 
  
  
  问题23:现在就可以获得Jini技术吗?我怎样才能得到它?
  
  
  可以。Jini技术Core Platform (内核平台)的源代码和规范可以从网上下载。网址是:http://www.sun.com/jini/。虽然可免费下载,但你必须通过鼠标的点击来表示接受 Sun 的社区资源许可协议(Sun Community Source Licence SCSL))。 
  
  
  问题24:社区资源许可协议是如何运作的? 
  
  
  Sun的社区资源许可(SCSL)协议是为在开发者社区中发布资源代码而设计的一种许可模型。该模型是根据Sun Microsystems最近发布的由Richard GabrielBill Joy设计的社区资源许可原则(Community Source Licensing Principles)而提出的。 
  
  
  为了促进和提高Jini技术,按照SCSL协议,Sun在开发者社区中基本上与其他成员分享了源代码的权利。Sun还致力于建立一种责任以保证兼容性;并提出了一种业务模式--通过提倡协议的接受者创建专利改进项目,以奖励创新和发明。 
  
  
  有关社区资源许可协议的进一步运作细节,请参见我们的网址的Licensing部分,网址是:http://www.sun.com/jini/licensing/。 
  
  
  问题25: Jini技术的价格体系是怎样的
  
  
  对那些希望对Jini技术的源代码进行评估、改进、完善和作为内部使用的协议接受者来说只要遵守Sun社区资源许可(SCSL)协议就可以免费使用Jini技术源代码。一旦你或你的公司决定将Jini技术产品作为商业性的使用你则必须同意SCSL(附件E)中的有关商业性使用条款并签定Jini Compatibility Logo(Jini兼容性标志)许可协议。标志许可包括了使用标志的年度价格或单价(per-unit fee)。 
  
  
  问题26:我能够使源代码更新吗? 
  
  
  所有的Jini技术的协议的接受者都可以访问我们的Jini技术站点。在这里,我们为协议的接受者(包括Sun本身)安排了一个区域,使他们可以将程序调试、更新、使用的工具、示例以及与Jini技术有关的其它技术支持问题发送给社区的其他成员。我们期待着每天都收到新的信息。Sun将在适当的时候、适当的位置将核心代码做必要的改动。所有的情况都会在网上通知。 
  
  
  问题27:我如何将代码回赠给Jini技术社区? 
  
  
  在我们的网址上有这方面的详细步骤。该网址是: http://developer.java.sun.com/developer/products/jini/index.html. 
  
  JiniJava技术 
  Jini软件的底层结构是用Java编程语言编写的,它可以与所有的Java核心技术协同工作。 
  
  
  问题33Jini技术适应Enterprise JavaBean部件吗? 
  
  
  Enterprise JavaBeans(EJB)部件可作为服务器部件的开发和部署模型。通过将Jini软件的底层结构添加到这些部件上,EJB可以容易地成为Jini技术的服务。 
  
  
  问题34:什么是JavaSpaces技术? 
  
  
  JavaSpaces技术是为Java软件对象的相关组的简单通信和存储而提供的服务。 
  
  
  问题35:我是否需要完整的事务管理程序来使用Jini技术? 
  
  
  使用Jini技术不需要任何事务处理管理程序。服务可以使用免费的Jini两阶段提交事务管理程序,也使用对它们合适的任何其它事务管理程序,或者根本不使用事务管理程序。 
  
  
  问题36: 我可以在eJavapJava技术中使用Jini技术吗
  
  
  这两种技术都将实现在Java 2环境基础上的改善,以便更好地支持Jini软件。有关开发工作的时间表将很快公之于众。 
  
  Jini技术和操作系统 
  
  
  问题37: Jini软件是一种网络操作系统吗
  
  
  不是。Jini软件是一种运行于Java平台之上用来创建一个虚拟机联盟的结构。每个虚拟机都运行在一个系统之上,操作系统又在网络上。网络操作系统是一种包含了与其它计算机通过网络进行通信的软件的操作系统。UNIXNovell Netware就是网络操作系统的例子。 
  
  
  问题38: Windwos CE不能做同样的事情吗
  
  
  不能。Windows CE是一种可被安装在与传统的计算机相独立的设备上的操作系统。Jini软件不是操作系统它是一种编程模型它使开发者可以创建并管理它们自己的操作环境并连接到一个普通的网络上。该设备可自行管理自己并按照基于网络的一套规则运转其使用的操作系统是基于用户的考虑来决定的。 
  
  
  问题39: Jini技术与Microsoft"即插即用"相比是怎样的? 
  
  
  Microsoft"即插即用"特性并不是在所有方面都是可以利用的。从目前所报道的有关它的底层结构的情况看,我们认为:这一特性根本不可和Jini技术相比较。"即插即用"特性是绑缚在Microsoft操作系统上、由Microsoft领导的一个封闭的集团所定义的。而Jini技术则是独立于操作系统、由Jini软件用户社区所控制的,该用户社区具有免费访问、 扩展和更改Jini技术源代码的权力。"即插即用"是关于如何连接设备的,它要求把设备的驱动代码提供到客户或由用户手工安装驱动程序。而Jini技术是关于如何连接服务的,这种服务既可以是设备,也可以是软件,而且,Jini技术固有的代码灵活性允许设备将它们的驱动程序代码传递到客户,而不需要用户的干预。 
  
  Jini和其它查找技术 
  
  
  问题40:将使用Jini技术的网络上的查找技术与其它诸如LDAPJNDIJava Naming and Directory Interface(tm))等目录服务相比,结果会怎么样呢? 
  
  
  Jini技术中的查找服务是一个轻型的、但功能强大的服务库。 
  
  
  它使用Java平台的类型系统作为名空间,这种结构是独特的--这意味着它不是存储固定的名-值对(name-value pairs),而是存储对象和反映对象实际行为的对象图。这在一个分布式系统中有两个明显的优势。第一,你可以按照你所期望的行为,而不是仅仅用它们的名称来搜索一个对象或一个服务。第二,当你在目录中一旦发现一个对象时,即使以前不曾"见过"它,你也可以立即知道如何使用它。 
  
  
  例如,或许你要查找一个存储服务。你可以直接发出对某种行为的请求,如可移动的、固定的、本地的、远程的等等。按照你的请求,你可以收到若干选择,包括可写的CDZip驱动或其它许多任意的安装在你的网络上的介质类型。一旦你选择了某种你要使用的服务,则该服务的接口和驱动程序会自动地包含在你的选择之中,你不必担心它们是否曾经被安装过。 
  
  
  Jini的查找技术被设计为对这些请求的一种服务。而LDAPJNDI可支持对你同样重要的其它服务。Jini技术不必替换你的现存系统,企业级目录服务可被提供为Jini技术服务中的服务,这就使客户可以容易地找到它们所需要的企业级信息。 
  
  
  问题41:什么是SLP,它与Jini软件的关系是怎样的? 
  
  
  Jini技术和SLP(服务定位协议)都是网络上的动态查找服务机制。然而,与SLP不同的是,Jini技术是基于Java平台的,它提供了代码的灵活性。代码的灵活性意味着你可以在网络上移动代码以及与它相关的行为(代理)。你可以在Jini技术的查找服务中存储任何Java对象或对象图(object graph),包括驱动程序、代理(proxies)、智能代理(smart proxies)和GUI等。应用程序可以用查找服务提取并执行它们。 
  
  
  问题42:我听说一种称作Salutation的业内新发明,它与Jini技术类似吗? 
  
  
  Salutation提供了类似于被称作Information Management Service(IMS)的服务库那样的查找服务,这与Jini技术的查找服务类似。然而,IMS只支持按照名-值对的搜索,而不支持象Jini技术那样的按照对象类型的搜索。Salutation允许服务之间的相互搜索,但一旦找到后,它便直接使用RPC。由于Jini软件是基于Java技术的,因而它支持代码的可移动性。这就允许你使用代理(agent)在网络上移动行为。 
  
  
  问题43HAVi是家庭网络的新发明,Jini技术适用于它吗? 
  
  
  HAVi(家庭音频/视频交互操作性)是一种针对家用电子设备的家庭网络系统。Jini技术不但应用于家庭网络环境,也应用于企业和InternetHAVi组织最近已宣布,它将使用Java编程语言作为它选定的语言,这就使它可以更容易地将HAVi集成到使用Jini软件的网络中。我们期望看到基于Jini技术的软件桥梁能够允许无缝共享HAVi设备和服务。 
  
  
  问题44HPJetSend协议与Jini软件是一种相似的技术吗? 
  
  
  HP JetSend是为固定功能和可编程的设备而设计的信息交换协议。Jini技术为软件服务和硬件服务都提供了一种体系结构,并为动态行为支持代码的灵活性。利用Jini技术,服务可被动态地发现并自动注册,驱动程序也可被自动地安装。通过在JetSend设备和Jini技术之间提供一个网关,JetSend设备可与Jini技术一起运行。 
  
  Jini技术和补充网络技术 
  
  
  问题45Jini技术适应firewire技术吗? 
  
  
  Firewire技术主要致力于如何使PC与外部设备的连接变得更简单。通过提供将外部设备连接于较大的网络和Internet的方法, Jini技术进一步完善了FirewireUSB技术。Jini技术还提供了附加的服务如租用、事务处理和JavaSpace技术等。我们期望看到建立在那些重要技术之上的Jini技术。 
  
  
  问题46: Jini技术适用于USB
  
  
  通用串行总线(USB)是一个网络传输层设计它的目的是为了在硬件中采用 "即插即用"功能。虽然它解决了某些Jini技术可以解决的问题Jini技术使USB向更深一步发展了。Jini技术是一个单独的、统一的传输层它可与网络直接会话使用Jini技术的服务既可以是硬件也可以是软件。Jini技术适用于USB, 正象它适用于以太网和Firewire一样。 
  
  
  问题47: Jini技术适用于家用电话线网络联盟(Home Phoneline Networking Alliance (HPNA))
  
  
  HPNA是一个创新它为家庭现有电话配线提供了 "以太网"的能力。HPNA所要解决的问题主要是各种现存家用配线(较老的单对非双绞线、3类双绞线和5类双绞线)以及如何管理在各种配线拓扑上的带宽限制。这种技术不是针对 "自发网络的概念的在自发网络中的设备的引导和加入是与家庭或办公室中的其它设备一起进行的。HPNA可能是Jini技术在家庭中的一个潜在的发送机制这里,家庭的网络配线已经不存在或者说安装这样的配线的费用是不能接受的。 
  
  
  问题48Jini技术适合于Bluetooth吗? 
  
  
  Bluetooth是为在PDA、膝上电脑、移动电话和其它便携式设备之间使用低成本、短距离无线电链接而制定的网络传输技术规范。当两个Bluetooth设备相互靠近时,它们可以自动探测到对方,并建立网络链接。然后,它们便可以利用Jini技术去寻找能够提供它们所需要的服务的其它设备。Jini技术适用于Bluetooth,正象它适用于其它网络传输协议一样。 

JINI的阿拉丁神灯能亮多久?

来源:ccw

2002-10-29 10:42:00

 


  Jini刚刚推出时,很多人用精灵来形容它,并且进一步解释说,Jini的原义是阿拉伯神话里的阿拉丁神灯,小小的神灯用手搓几下就会跑出巨大且无所不能的精灵。对Jini的这种寓意,我们可以从JiniLogo中明显地体会到。确实,Jini规范的各种实现可以为网络带来强大的能量,它对网络的魔力不亚于阿拉丁神灯。不过—— 
  Jini1999125日由Sun公司发布。在推出Jini之初,Sun希望它支持X联网(无限联网),即各种数字设备都可以与网络相连,并自动管理该网络。无论设备有多大或是多小,是PC机外设、消费类电子产品、信息家电,还是企业设备,都可以通过Jini规范的实现相互连接,相互提供服务,从而架构起网络资源共享的分布式网络运算环境。家庭网络只是Jini应用的冰山一角,那是因为Sun的思路是让Jini首先进入消费类电子设备领域,实现各种家用信息设备的联网。
  服务处于核心地位 
  Jini提供的分布式结构体系也有人称之为分布式的网络操作系统,它突破了传统C/S的模式,形成了一个统一的动态分布系统,可以用来解决网络成员之间的交互通信问题。像冰箱、空调、打印机、数码相机、存储设备等都可以成为网络成员之一,随时为其他任何成员提供服务。 
  服务是贯穿Jini系统的核心,Jini规范把服务定义为可以被人、程序或另一个服务使用的某种东西。 这种服务的概念除了与家庭网络中服务的概念不谋而合,也与无处不在的电子商务的服务理念遥相对应。 
  目前Jini并不支持对等的双节点连接,而至少要求有三个节点(如图1所示):服务提供者、服务请求者和Jini查询服务。在Java语言中,服务作为对象出现,或者由几个其他的对象组成,服务的对外接口定义了可以向该服务请求的操作,服务的类型决定组成服务的接口。当一个提供服务的设备加入网络,就通过Java对象注册自己能够提供的服务,包括服务的内容、属性等常规信息,实现对自己的推销。服务请求者通过这些Java对象提供的API去发现和使用相应的服务。 
    
  服务的实现对服务请求者是隐藏的,服务请求者看到的只是服务提供的Java对象,只要下载一定的接口程序即可实现与服务的交互,所以事实上的通信都是在Java对象和服务之间进行。在Jini底层的网络交互可以使用各种类型的网络技术,如RMICORBASOAP都可以实现这样的通信。不过在Jini规范中主要通过RMIRemote Method Invocation)实现远程对象通信。 
  小精灵 大威力 
  Jini的体系架构如图2所示,由基础架构(infrastructure)、编程模型(programming model)和服务(services)三部分组成。三个部分相辅相成,共同构成Jini体系。基础架构与编程模型一起支持服务的提交、注册与发现,而编程模型需要基础架构的支持。 
  其中基础架构为Java对象的执行、对象之间的通信等提供各种资源和环境,同时负责在网络上查找和发现服务。从结构图中可以看到,Jini基础架构为整个Jini系统的Jini设备(如磁盘驱动器、打印机、计算机等)发现适当的服务以及新服务和新设备的加入提供了发现/加入机制。只要是与Jini基础架构相连的服务都可以通过发现服务找到。有新设备加入的时候,发现服务自动将其纳入自己的管理;同样地,当一个Jini设备离开Jini系统时,其服务将自动从发现服务中删除.
   
  简单地说,一段段Jini程序把网络上的每台设备作为Java虚拟机连接在一起。无论什么时候新加入一台数码摄像机,其他信息家电设备都可以很快识别出来,并加以利用。 
  
  Jini的编程模型由租赁接口、事件接口、事务接口等组成。租赁接口定义了基于事件的资源分配和释放方法;事件接口将JavaBean组件所使用的事件模型扩展为分布式事件模型,来支持Jini服务基于事件的通信;事务接口则引入了一种面向对象的协议,使用表决提交两个阶段来统一对象之间的相关行为,以保证事件序列的完整发生。 
  
  与OSGi一样,Jini也是基于Java技术的规范,不受操作系统平台和网络连接标准的限制,可以扩展到任何设备上,而且其体积小,可以用于各种传统的家电设备。此外,因为Jini可以自动识别并管理家庭网络的每一个信息设备,所以管理费用相对较低。 
  Jini的路如何走? 
  起初对于Jini的发展,很多商家都非常看好,在1999Jini推出的时候,有多达37家企业和机构申请了Jini许可证,其中包括BEACiscoCAEricssonKodakMotorolaNovellNokiaPhilipsSamsungSeagateSony3ComToshiba等公司。
  目前Jini的知识产权归Sun公司所有,任何需要使用Jini技术的公司或组织都需要购买Jini许可。SCSLSun Community Source License)就是Jini技术吸引多方支持的机制,它对每个拥有Jini技术许可的公司或组织开放Jini基础架构的源代码,它们可以通过公开的进程免费使用、修改该技术框架。 
  但因为种种原因,Jini的发展速度并不如预计的那么快。20001016日,Sun推出了Jini Technology Starter Kit v1.120028Jini Technology Starter Kit v1.2.1_001发布。但实际支持Jini的设备并不多见。而且目前SunOSGi的支持力度非常大,有人担心这可能会导致Sun减少对Jini的投入。虽然OSGiJini并不是直接竞争的关系,甚至也有人提出了两者融合的想法,但到现在为止,这两个规范仍然是独立发展。 
  其实除了OSGiSun还加入了UPnPHAVi等其他组织。虽说各种制订规范的组织是一个个技术团体,但某些时候它们更是一种利益集团。Sun希望在更多的领域分到一杯羹而加入多个组织,有人担忧这样的做法会分散太多Sun的精力而影响Jini的发展。且先不去评论Sun的做法如何,至少目前看来Jini的走势并不算明朗。 
  

Jini技术介绍()

一:Jini白皮书什么是Jini?
  JiniSun公司的研究与开发项目,它能极大扩展Java技术的能力。Jini技术可使范围广泛的多种硬件和软件---即可与网络相连的任何实体---能够自主联网。
  Jini可以使人们极其简单地使用网络设备和网络服务,就象今天我们使用电话一样---通过网络拨号即插即用。Jini的目标是最大限度地简化与网络的交互性。
  Jini利用了Java技术的优势。Jini包含了少量类库格式的Java代码和某些惯例,可在网络上创建一个Java虚拟机的"王国",就象我们人类创造一个社区一样。在这个王国里的人、设备、数据和应用程序等网络公民均被动态地连接起来,从而能够共享信息和执行任务。
  主要趋势---网络的普及这个世界正在网络化。例如,在今天,一个企业要想取得成功就必须建立网络。商业网络正在不断扩大,而且已经能够与供应商和客户实现直接交互。与无线网络的交互也几乎成为家常便饭。企业和消费者都要求能与网络进行更广泛的交流。出差在外的人无不希望在到达饭店后就能把自己的计算机插入网络接口,不但能与自己单位的工作环境进行交互工作,而且还能与饭店的本地服务,如打印机或传真机等进行交互工作。父母可能希望只需使用移动电话或笔记本电脑就能与家里的摄像机相连,通过它来察看家里的情况。人们无不希望随时随地能够连接和立即使用本地的定制服务。在不远的将来,我们将看到网络渗透到很多其它环境。例如,将会出现把电视机和立体声设备等音频/视频设备与家庭办公室的电脑和外设连接起来的网络,并控制安全监视器和温控恒温器等网络设备。电缆和ASDL等高带宽媒介将为家庭提供全新的服务。服务供应商不断为驾驶员提供越来越多的服务,网络也必将随之进入汽车领域。除导航系统外,游览景点和当地餐馆名单等本地服务也将出现在驾驶员的屏幕上。只要汽车与远程诊断设备相连,它就能自动完成对汽车的维护,并在汽车出现问题时通知驾驶员。

  商业机遇---网络服务Jini所能带来的商业机遇是新型的网络服务。
  例如,产品制造商将在基于网络的产品上提供新的服务。例如,磁盘可被看作与网络相连的存储服务,能向磁带和其它新型服务提供自动存储备份。联网的摄像机可能将提供诸如安全监视等新型成像服务。这些新的服务使制造商成为新型的网络服务供应商。
  Jini还能帮助传统的服务供应商提供新型服务。
  例如,某媒体服务供应商可能希望向某消费者的家庭打印机提供报纸? 服务。无线服务供应商可能希望通过蜂窝电话提供相似的服务。
  Jini还可简化对现有服务的管理。
  在隔天交货的情况里,Jini简化了分布在各处的工人与网络连通的方式。在个人银行里,基于Jini的计算机和外设可简化分行的系统管理。对于无线服务供应商,Jini可使蜂窝电话具备类似于电话的网络功能:屏幕大小、处理能力、使所提供的服务根据每一部电话的特点而专门设计。

 问题是,在今天的环境中,联网还是太复杂了。例如,无论是把PC连接到网络上,还是使用联网的打印机都非常复杂。只有经验丰富的系统管理员才有能力处理装载驱动程序、设置配置文件等复杂的工作。显然,我们不可能指望一般消费者也能管理今天这样复杂的网络。
  今天的网络还很脆弱和很不灵活。对网络稍加改动就可能造成不可挽救的大混乱。向网络中添加诸如磁盘存储等功能的过程也很复杂。例如,要想添加一个磁盘驱动器,我们就必须打开机箱,处理设置跳线器,并解决一系列复杂的设置问题。即使专家也会头疼。
  实际上,从消费者的角度看,他们所需要的只不过是把硬件和软件插入联网的环境,并立即就能使用可用的服务:就象我们今天插接电话一样。在今天,当消费者从商店购买一部电话后,他不必对电话进行配置。消费者只需给电话服务供应商打一个电话,服务就会送上门。最后,消费者只需把电话插好,就能使用电话服务了。自主的联网。
  Jini的价值Jini的作用就是能简化与网络的交互性。
  从消费者的角度看,消费者把可插接的设备和软件插入网络,就像今天插接一部电话一样简单。
  从传统服务供应商的角度看,Jini简化了Services Delivery (服务提供)的管理。设备不但能向网络推出增值服务,而且还能提供设备的属性和功能。现在,服务供应商可以针对每台设备设计服务。当然,Jini还将有可能打开一扇通向新的网络化服务的大门。
  从产品制造商的角度看,Jini打开了全新的市场。因为Jini简化了设备向网络提供增值服务的能力。所以,产品就不仅仅作为商品而投入竞争,而是作为增值服务的产品参与竞争。
  从Java程序员的角度看,Jini简化了编写分布式应用程序的工作,因而,任何Java程序员都能利用基于Jini的新设备编写应用程序和服务。因此,企业不再需要聘用有限的专家资源编写分布式应用程序,任何Java程序员都能为基于Jini的网络开发服务。
  Jini的起源Bill Joy1994年之前向Sun公司实验室提交了一份包括以下三个主要概念的建议书:
  可在所有平台上运行的语言运行该语言的虚拟机,和允许分布式虚拟机像单一系统那样工作的网络化系统到1995年,这种语言和虚拟机相继面市,即Java编程语言和Java虚拟机。但该系统的概念则仍保留在Sun公司的研究与开发实验室,作进一步的研究和开发。这个系统的概念就是Jini
  Jini战略部署与合作伙伴Sun公司部署了广泛的战略,力求将Jini推向市场。我们可以这样说,Jini与任何向网络化环境提*品和/或服务的企业都密切相关。这包括传统的设备制造商、服务供应商和软件开发商。

Jini将如何进行授权?
  为推动Jini的进一步创新,使其尽快被市场所接受,Jini源代码将象Netscape公司的Mozilla模型一样向所有开发商公开。为确保兼容性和质量,正在考虑对商业产品进行标记。围绕授权方式的很多具体细节目前仍在最后确定过程之中。拟议中的授权草案将于今年8月公布。
  Jini技术概述
  Jini技术可划分为两个范畴:体系结构和分布式编程。此外,还将提供在Jini上运行的网络服务。
  基础结构
  Jini基础结构解决设备和软件如何与网络连接并进行注册等基本问题。
   
  基础结构的第一种要素称作Discovery and Join (发现与联合)Discovery and Join解决设备和应用程序在对网络一无所知的情况下如何向网络进行首次注册这样的难题。
  基础结构的第二个要素是Lookup (搜索)Lookup可被看作网络中所有服务的公告板。
  Network Services ---网络服务Other Services ---其它服务Leasing ---租用Transactions ---交易Distributed Event---分布式事件Other OS ---其它操作系统Other CPU ---其它CPU DISCOVERY AND JOIN 设备或应用程序插入网络后需要完成的第一个任务就是发现该网络,并使网络发现该设备或应用程序。我们之所以使用Discovery and Join这样的说法,是因为设备或应用程序事前不可能对网络有任何了解。
  Discovery的工作原理如下:
  当基于Jini的设备插入网络后,它就通过一个众所周知的端口向网络发送一个512字节的多路广播Discovery包。在其它信息中,该包包含对自己的引用。
  Jini Lookup在众所周知的端口上进行监听。当接收到Discovery包后,Lookup就利用该设备的接口将Lookup的接口传递回插接的设备或应用程序。
  现在,该设备或应用程序已经发现了该网络,并准备将其所有特性上载到Jini Lookup。上载特性是Discovery and JoinJoin这方面的特性。
  现在该设备或应用程序使用在Discovery阶段所接收到的Lookup接口与网络相连。上载到Lookup的特性包括该设备或应用程序所提供的所有增值服务(如驱动程序、帮助向导、属性等)
  LookupLookup是网络上所有服务的网络公告板。Lookup不但存储着指向网络上服务的指针,而且还存储着这些服务的代码和/或代码指针。
  例如,当打印机向Lookup注册时,打印机将打印机驱动程序或驱动程序接口上载到Lookup。当客户机需要使用打印机时,该驱动程序和驱动程序接口就会从Lookup下载到客户机。这样,就不必事先把驱动程序装载到客户机上。
  打印机还可能把其它增值服务装载入Lookup。例如,打印机可能存储关于自己的属性(如它是否支持postscript,或它是否为彩色打印机)。打印机还可能存储可在客户机上运行的帮助向导。
  如果网络上没有Lookup,则网络就会使用一个Peer Lookup (对等Lookup )程序。当需要服务的客户机在网络上找不到Lookup时,Peer Lookup就开始工作。在这种情况下,客户机可发送与Lookup所用的相同的Discovery and Join包,并要求任何服务供应商进行注册。随后,服务供应商就会在客户机上注册,尽管那不是Lookup

 分布式编程Jini分布式编程为Java增添了创建分布式系统所必需的其它功能。尤其是Jini分布式编程可提供租用、分布式交易和分布式事件。
  租用租用与租用一套公寓很类似。我们在租用一套公寓时,一般会商定使用该公寓的时间。类似地,在Jini中,对象彼此之间商定租期。例如,当某设备使用Discovery and Join协议发现网络时,它就注册一段租用时间。在租约到期之前,该设备必须重新商定租期。这样,如果租约到期或设备拔下后,该设备在Lookup中的记录就会被自动删除。这就是分布式垃圾收集的工作原理。
  分布式事件在单一的计算机中,事件肯定能被接收方接收到,序列也肯定能按照顺序进行。
  但在分布式环境中,分布的事件可能不是按照顺序被接收,或者,某个事件还可能丢失。
  为便于在Java环境中处理分布的事件,Jini为分布的事件提供了一个简单的Java API。例如,当一个分布的事件发生时,该事件都带有一个事件号和序列号。利用这种信息,接收方就能检查事件是否丢失(序列号丢失)或事件是否按照顺序接收(序列号顺序不对)到。
  分布式交易在分布式Java环境中,有时需要一种很简便的方法,来确保在整个交易完成之前,在该交易中发生的所有事件都被真正提交了(两阶段提交)。
  为便于进行此类分布式计算,Jini提供了一种简单的Java API。该API可使对象起动一个能管理交易的交易管理器。每个参与交易的对象都向交易管理器注册。
  当交易发生时,如果某个参与的对象说,交易中的某个事件没有发生,则此信息就被送回交易管理器。随后,交易管理器就告诉所有参与的对象回滚(rool back)到前一个已知状态。类似地,如果所有对象都完成了其交易的过程,则整个交易就向前进行。
  Jini上的网络服务在Jini基础结构和分布式编程之上,可提供便于分布式计算的网络服务。JavaSpace就是这样的一种网络服务。
  欲知有关JavaSpace的详细情况,请访问http://java.sun.com/products/javaspace我们期待着将来在Jini上建立更多其它的网络服务。
  欲知有关Jini技术的详细情况,请访问http://java.sun.com/products/jini

Jini 能给您带来什么

    Jini是实现大规模分布式计算的一种关键技术。它不仅可以解决网络兼容性的问题,更加不同凡响的是,通过这种技术可以在网络计算机设备和应用程序之间进行有效的交互和合作。Jini通过使用面向对象的语言JAVA,将即插即用特性赋予了各种各样的设备,例如PC、手持式电脑、蜂窝电话以及48KB的小内存设备,从而减少了网络上的冲突。但是,Jini网络的实现还需要开发人员艰苦不懈的努力。在此之前,程序员们仍要面临编写分布式应用程序的挑战。

  Jini是一种用JAVA语言编写的代码,这种代码可以在网络上自动地检测计算机设备,并且注册它们所提供的服务。它是为在网络上提供分布式操作系统服务而采纳的开放式体系结构的核心部分。

  Sun公司为下个世纪的网络计算绘制了一幅蓝图,将这幅蓝图变为现实的技术就是JiniJini是一种基于JAVA的体系结构,它提供操作系统的服务,并且将其功能扩展至整个网络。更一般地讲,Jini是在JAVA虚拟机(JVM)顶端运行的一个JAVA软件,为设备提供即插即用的网络功能。Sun在它的蓝图中描绘了这样一幅场景:在未来,任何一台装有微处理器以及小容量RAM的设备之间都能够相互合作,从而达到了计算上一个崭新的境界。虽然这是一种超前意识,但是采用Jini至少使我们离未来的蓝图又进了一步———它可以使我们免受设备驱动程序不兼容的困扰,并且不再让用户在登录到网络上时遇到麻烦。

  举个例子,在Sun所勾画出的蓝图中,用户可以将掌上型电脑插入网络插槽并且能够被立即识别出来,从而自动地成为了网络的一部分。有了这样的手持式设备,用户就可以方便地访问一台计算机上的数据,并且利用另外一台计算机所提供的服务来处理这些数据;接下来他还可以在最近的一台打印机上打印数据,而不用在掌上型电脑上预装打印机驱动程序。这样不可思议的事是通过这部掌上型电脑自动下载一个基于JAVA的打印机驱动程序来实现的。网络与应用程序之间这种自动而便捷的集成可以应用到从PC到蜂窝电话的几乎任何一种电子设备之上。

  这种分布式的计算体系结构并不新奇,Sun公司的Jini也不是实现下世纪网络世界的操作系统唯一的技术。Lucent Technologies公司在1997年推出了为嵌入式系统设计的Inferno技术,该技术在逻辑上与JAVA极为相似,也包含了虚拟机概念、编程语言以及通信协议;Oak Ridge国家实验室也推出了称为并行虚拟机(PVM)的技术,它旨在通过网络上完全不同的机器之间进行合作而提供一种低价位的超级计算机;IBM力推的T Spaces在概念与实现上与Sun也很类似;而脚踩两条船的Microsoft也正在研究分布式操作系统,他们关于分布式操作系统的大手笔项目称做MillenniumMicrosoft希望通过Millennium取得两大伟绩:一是将桌面操作系统完全而无缝地分布到世界范围的网络中去,二是将程序员带往不再考虑底层机器细节的更高抽象层次上。这两个目标对于分布式系统来讲是相当关键而密不可分的。但是,由于Sun拥有JAVA编程语言以及相应的虚拟平台,它在将操作系统引入下个世纪中处于一个极为特殊的地位。


  Jini是如何工作的


  Jini解决的并不是诸如一个特定的应用程序如何在网络上进行工作这样的细节问题,而是为这些服务提供一种极为关键的能力,使得它们彼此之间可以意识到对方的存在,进而建立起相互的连接。Jini的核心是Sun JDK12中的JAVA Remote Method InvocationRMI),这是一种使JAVA对象之间可以在网上实现交互的网络服务。这样看来,Jini就可以看作是JAVA软件组件模型JAVABeans在理论与实践上的一种延伸了。

  Jini网络就像是一个市场,在其中商人们贩卖自己的商品。在Jini网络中,商人们就是最终用户、设备或者应用程序。贩卖的过程是这样的:一个新的商人来到这个市场,他宣告了自己的到来,并且很快建立起了商店;然后他将所卖的商品以及提供的服务写下来,像许多其他的商人一样写在一张卡片上,而这些卡片的信息就公布在一个布告栏中;Jini提供了这种销售的机制,根据它的规定,商人们被授予在布告栏上贴广告的地方,并在那里发布消息;顾客们则在布告栏前驻足,寻找他们感兴趣的卡片信息,然后从卡片上抄下与商家联系的方式;接下来顾客就与商人在诸如“什么时候交货”或者“怎么买卖”这样的细节问题上讨价还价;而商人们交易时所遵循的交易规则是由Sun的另外一个标准JAVASpaces来规定的;对于顾客来讲,商人之间的*交易是不可见的。

  Jini所蕴涵的意思当然比这个比喻要来得丰富得多:例如消息在布告栏上不会被偷走,以及广告所占据的实际空间并不需要考虑等等。但是,这个虚拟市场也存在着固有的问题:例如这些商人对他们的顾客缺乏判断的准则,还有当网络发生故障、商家突然消失时如何进行交易也是需要考虑的问题

  Jini中,这个由商人和顾客组成的市场被称为一个“联盟”。Jini通过一种“发现并加入”(Discovery and Join)服务为该联盟分配空间;它的另一种“查找”(Lookup)服务用来在布告栏中发布信息,并且接受交易要求;Jini由一种“出租”(Leasing)模型来解释何时可以将卡片从布告栏上撤走,以及制订合同所需遵循的规则;并且由一张“访问控制列表”(Access Control List)来规定谁可以使用特定的服务;服务的提供与进行由JAVASpaces和实际的应用程序共同操纵;商人之间交流所采用的通用语言由JAVARMI规定来决定。

  JiniJAVASpaces一起为当前集中式的系统服务带来了一种转变。一个操作系统实际上就是一些子功能的集合,但是它进行的是一些复合式的操作。JiniJAVASpaces打破了这种单一的模式,而把许多服务分布到网络的不同部分上去,从而将OS分成了若干子系统,并且将这些子系统分散到了网络、客户机以及服务器上。对于实现分布式的合作来说,Jini是这种JAVA基础结构中起步性的关键步骤。由于JAVA具备面向对象的特性以及执行可传输代码的能力,Jini可以在网络上分发大量的软件对象。这些独立的应用程序或者对象可以根据用户的需要在网络上传输,从而与其他对象进行交互。
  Jini是如何工作的


  Jini将会给企业带来的影响


  Jini和分布式系统在降低网络交互的复杂性方面将使企业得益非浅。许多公司内部的计算机设备种类繁多,诸如PC、打印机、手持式设备、蜂窝电话以及服务器等等,简直令人头痛。比方说,如果一台打印机发生了故障,那么立刻所有的网络用户就需要修改他们工作站上的打印设置。而Jini能自动识别网络上的变化,并且对用户透明地在网络上传输像打印驱动程序这样的代码,从而彻底地解决了这样的问题。Jini的梦想也为崭新的商业运作模式创造了可能,Sun希望在不远的将来,新的经营模式会产生于基于Jini的灵活机动的网络,比如出租大型硬盘组的磁盘空间等等。由于公司们正在致力于挖掘新的商机,Jini很可能为现在任何人都想象不到的计算机硬件工作模式提供其所需要的基础。


  Jini走出第一步


  像Jini这样的分布系统技术毫无疑问会成为今后十年里发展的主要力量,但是,Jini的应用还很不成熟。目前,它只不过是为开发人员更好地利用网络及其资源编写应用程序的基础工具。在更为基础的层次上,厂商们需要为他们所有可能在Jini网络上运行的设备编写基于JAVA的驱动程序,或者为驱动程序编写JAVA接口。

  问题在于:何时Jini才能走出研究和开发阶段,何时它才能成为真正的产品从而造福于企业?

  Jini的实质是JAVA。而在网络或者多台计算机上提供分布式的服务正是JAVA的目标。由于Jini基础结构使用的是JAVA RMI以及面向对象的编程,因此Jini对于JAVA和面向对象的程序员来说会显得更为直接,但是编写分布式应用程序比一个单独应用程序来说总归复杂得多。例如,开发一个经常在一开始时用作介绍的应用程序“Hello World”,在集中的操作系统以及应用模型中,可能只需编写几行代码就可以在屏幕上显示出“HelloWorld”消息,甚至新手在几分钟之内就可以编写出这个程序。但是如果是在分布式的环境中,编写同样应用程序的复杂性就会大大提高了。程序员们必须考虑到诸如网络故障、延迟以及安全等方面的问题。尽管JiniJAVAspaces提供了分布式的安全模型以及对象处理机制,但是让它们能为今天的程序员们所应用还要经过相当长的时间。正像其他计算机方面的问题一样,这是一个培训和普及的问题,因为程序员们需要学习如何编写出高质量的分布式应用程序。

  从另一方面看,Jini已得到了令人鼓舞的支持。Sun已经同诸如QuantumEricsson这样的公司建立起了伙伴关系,他们们均表示要采用该技术;Novell也表示要为Jini提供创建目录的服务。尽管目前重要的合作伙伴并未作出任何许诺,但至少一家并不著名的公司———Malaysian已经将Jini应用了起来。

  Jini在很多方面是大多数传统操作系统无法匹敌的。虽然像Microsoft这样的公司正在研究自己的分布式计算系统,但目前Jini仍是领先的。一方面,程序员们已经可以创建Jini应用程序了,对于JAVA程序员来说,他们已经熟悉了许多Jini的特性;另一方面,由于JVM的普及,Jini必须与各种各样的环境进行合作和集成。由于分布式系统的前景无可限量,我们可以打赌:Sun或者是Microsoft将为未来的分布式操作环境制订标准。Jini建立在JAVA坚强的基石之上,并且JAVA深入人心,它代表了早些时候在计算模式上要进行广泛而深远转变的一种热潮;而Microsoft则控制了当前OS的标准。

  创造强有力的系统和应用程序,从而更好地利用网络资源、使用分散的资源来解决大型的问题,这就是我们的目标。将这个梦想变为现实还需要长时间的努力,但至少目前,Jini已经在解决网络上互操作性的矛盾上给我们带来了希望,同时是它使得设备驱动程序的问题已经成为了过去。

Jini的作用

    为分布式系统中的设备提供即插即用的网络功能

Jini竞争的技术

    LucentInferno

    Oak Ridge国家实验室的并行虚拟机(PVM

    IBM T Spaces

Jini的短处

    对编程人员要求高,编程复杂,需要学习一段时间才能掌握

初识JINI技术

 一、前言 

  长久以来许多工程师们,都一直期盼著一个超大型的计算系统,这系统是由网路上许多机器,从超大型主机乃至嵌入在某些设备上的微小晶片,彼此相互合作而成。所有的工作,都可以在任何时间被分散到网路上的任何地方、任何种类的机器上去处理。这样的系统有很好的弹性,并且可以藉由不断地更新设备,来解决更多问题。

  然而,我们 要一致的语言,以及更强的通讯协定( superprotocols)等,让网路上众多繁杂的成员,能彼此顺利地沟通。但是就目前的情况,要达到这样的目的很难,因此我们可以考虑把一种特殊的程式码(genetic code)嵌入到许多软硬体之服务中,使得网路上的成员可以轻易的相互分享彼此资源,这就是 Jini 所要达成的目标。 

  Jini 是由 SUN 公司 R&D 的Bill Joy 所提出的一项技术。我们可以藉著使用Jini,创造出一个富有弹性、容易管理、且可随时随地使用各种服务的网路计算环境。为了让使用者知道网路上有哪些服务可被使用,我们必须建立一个联盟( federation ),让网路上的服务主动加入。当有某个服务加入联盟时,也等於同时向整个网路告知:「我可以被使用,有谁 要我的服务?」。使用者透过联盟,可以得知有哪些服务可以使用。然而,我们要如何才能很简单、很轻易地使用这些服务关於这个问题,也就是 Jini 的工作重点之一。 

  让我们来看看Jini 是怎堋做的。网路上的服务要能够成为联盟的一份子,不管是硬体服务也好、软体服务也好,都必须嵌入Jini 的程式码。此外,网路上还必须提供 JVM的环境,才能执行Jini程式以获得这些服务。

  Jini的程式码是利用 SUN 公司所提供的 Jini package 撰写而成。Jini package使用的语言是Java,并且包含了许多处理网路上资源的相关功能。例如:如何帮助网路服务寻找(discovery)、以及加入(join)联盟;或者帮助网路服务处理分散式的承租(leasing)、交易( transactions)等的问题。而这些网路服务彼此沟通时,所应用的技术是 RMI(Java Remote Method Invocation )。简言之,网路上的服务藉由 Jini 所提供的介面,得以相互沟通、合作,来完成使用者的

  二、体系结构 

  Jini system 是由基础建设( infrastructure)、程式设计模型( programming model )、服务( services) 三方面所构成。如图一所示 : 

· 基础建设( infrastructure) 

Jini 基础建设的核心包含以下几个部分: 

1. Discovery Protocol: 

提供了如何让网路上任何种类的资源加入联盟的方式。

2. eXtended RMI : 

Jini的元件彼此沟通时所使用的机制。

3. Distributed Security: 

定义了Jini 联盟成员的使用权限。

4. Lookup Service: 

用来展现联盟中的所有成员,以及帮助使用者寻找网路资源,或者负责提供联盟中的资源给使用者用。

· 程式设计模型( programming model ) 

Jini 提供一些分散式的程式设计模型,而 Jini 的基础构造,就是利用这些模型来组合。模型所提供的介面(Interface),包括以下几个类型: 

1. Leasing Interface: 

负责管理物件被使用的时间。

2. Two Phase Commit Interface : 

是一个轻量级的(light-weight)、物件导向的( object-oriented)介面。负责管理分散式交易( transaction)的动作,如:roll back 、roll forward 等。

3. Events Interface: 

在分散式计算的环境中,必须确保程式执行的先後顺序,利用事件的观念可以帮助我们解决这个问题。

· 服务(services) 

有了Jini的架构以及程式设计模型後,我们可以利用这些技术来设计管理网路资源的服务,以促进分散式计算的发展。例如:JavaSpacesTwo Phase Commit Manager。 

  三、JavaSpace 

  Jini提供了在分散式环境中寻找( look-up)、注册( registration)、租借(leasing)等功能。而 JavaSpaces则负责管理分散式物件的处理程序( processing)、分享(sharing)、以及流通(migration )等。因此 Jini 与 JavaSpaces 彼此存在著相互合作的关系 。以军队作比喻, Jini扮演的是军 官的角色,负责分派许多武器装备给军队。JavaSpaces则扮演军队的角色,负则使用那些被分派的武器以执行命令。简单的说, JavaSpaces就好像网路上的一个市场,它提供一个简单、快速、统一的介面,让网路上分散的资源可以被分享、协调与流通 。

  JavaSpaces是用 Java所发展的技术,并且以RMI实作其网路通讯的功能,一般应用在n-tiers 架构的中间层( middle tiers) 。JavaSpaces虽然能提供求者与供应者之间查询与沟通的机制,但它并不是资料库,而是以简单的messaging system为基础,进而提供更强大的功能。

  除了Jini之外, JavaSpaces技术也可被应用在其它系统与服务中,如: Workflow systems 、Customer management systems、Supply chain management 、Intelligent rich data distribution、 Trading services 、Auction systems 、Resource allocation and management systems、Agent Systems、以及 Publish and subscribe services等。

  四、应用 

  Jini技术有一个主要目的:让许多电子产品可以容易的被加入至网路上,也就是随插即用(plug-and-play) 。任何物件,如: DVD、CD 、VCR、桌上型电脑、可携式电脑、印表机、扫描器、磁碟机、播放器、电话、电视机、警报系统、医疗器材、空调系统、厨具、汽车引擎、汽车的丁器板等,只要利用Jini技术,就可以结合各类的电子产品成为网路上的资源服务 ,而使用者只 透过电话或无限通讯器材就能使用这些服务。

  想像一个剧情:一个使用者坐在公园里,想要透过掌上型电脑来使用网路上的印表机,但是他并没有任何印表机的驱动程式。首先,Jini会启动 Lookup服务(类似 JavaSpaces),到联盟(federation )中搜寻符合使用者条件的印表机。找到之後,Jini会跟那台印表机沟通,取得它的驱动程式,并且传至使用者的掌上型电脑。使用者於是可以轻易的使用网路上的印表机。

  我们也可以把家中的电器用品都结合到网路上,这样可以让我们在任何时间、任何地点来控制家里的电器,这将是多堋令人期待的一个理想。 

  目前已经有许多公司正在发展相关的技术,这些公司包括Axis、Canon、 Computer Associates、Datek 、Enocanto、Epson 、Ericsson、FedEx 、Mitsubishi、 Norwest Mortgage 、Novell、ODI、 Oki、Quantum、 Salomon Brother、 Seagate、以及 Toshiba等。

  五、结论 

  Jini让许多电器设备、网路服务结成联盟( federation)。 Jini的最上层以 Lookup机制为基础的目录服务( directory service ),让许多含有 Jini技术的资源,来注册以及被公布於网路上。下一层则利用JavaSpaces 技术来管理联盟的资源,以让使用者或其他应用程式使用资源。底层则是以RMI为基础的协定,用来规范物件之间在网路上的沟通。

  如同SUN公司所说:「网路就是电脑(The network is the computer)」。网路的出现提供了无限的计算资源,让我们可望达成一个超大型的计算系统。Java技术使得分散式计算变得容易可行,Jini 则实现网路就是一个超大型电脑的理想。

     Jini白皮书什么是Jini?
  JiniSun公司的研究与开发项目,它能极大扩展Java技术的能力。Jini技术可使范围广泛的多种硬件和软件---即可与网络相连的任何实体---能够自主联网。
  Jini可以使人们极其简单地使用网络设备和网络服务,就象今天我们使用电话一样---通过网络拨号即插即用。Jini的目标是最大限度地简化与网络的交互性。
  Jini利用了Java技术的优势。Jini包含了少量类库格式的Java代码和某些惯例,可在网络上创建一个Java虚拟机的"王国",就象我们人类创造一个社区一样。在这个王国里的人、设备、数据和应用程序等网络公民均被动态地连接起来,从而能够共享信息和执行任务。
  主要趋势---网络的普及这个世界正在网络化。例如,在今天,一个企业要想取得成功就必须建立网络。商业网络正在不断扩大,而且已经能够与供应商和客户实现直接交互。与无线网络的交互也几乎成为家常便饭。企业和消费者都要求能与网络进行更广泛的交流。出差在外的人无不希望在到达饭店后就能把自己的计算机插入网络接口,不但能与自己单位的工作环境进行交互工作,而且还能与饭店的本地服务,如打印机或传真机等进行交互工作。父母可能希望只需使用移动电话或笔记本电脑就能与家里的摄像机相连,通过它来察看家里的情况。人们无不希望随时随地能够连接和立即使用本地的定制服务。在不远的将来,我们将看到网络渗透到很多其它环境。例如,将会出现把电视机和立体声设备等音频/视频设备与家庭办公室的电脑和外设连接起来的网络,并控制安全监视器和温控恒温器等网络设备。电缆和ASDL等高带宽媒介将为家庭提供全新的服务。服务供应商不断为驾驶员提供越来越多的服务,网络也必将随之进入汽车领域。除导航系统外,游览景点和当地餐馆名单等本地服务也将出现在驾驶员的屏幕上。只要汽车与远程诊断设备相连,它就能自动完成对汽车的维护,并在汽车出现问题时通知驾驶员。

  商业机遇---网络服务Jini所能带来的商业机遇是新型的网络服务。
  例如,产品制造商将在基于网络的产品上提供新的服务。例如,磁盘可被看作与网络相连的存储服务,能向磁带和其它新型服务提供自动存储备份。联网的摄像机可能将提供诸如安全监视等新型成像服务。这些新的服务使制造商成为新型的网络服务供应商。
  Jini还能帮助传统的服务供应商提供新型服务。
  例如,某媒体服务供应商可能希望向某消费者的家庭打印机提供报纸服务。无线服务供应商可能希望通过蜂窝电话提供相似的服务。
  Jini还可简化对现有服务的管理。
  在隔天交货的情况里,Jini简化了分布在各处的工人与网络连通的方式。在个人银行里,基于Jini的计算机和外设可简化分行的系统管理。对于无线服务供应商,Jini可使蜂窝电话具备类似于电话的网络功能:屏幕大小、处理能力、使所提供的服务根据每一部电话的特点而专门设计。
  问题是……
  问题是,在今天的环境中,联网还是太复杂了。例如,无论是把PC连接到网络上,还是使用联网的打印机都非常复杂。只有经验丰富的系统管理员才有能力处理装载驱动程序、设置配置文件等复杂的工作。显然,我们不可能指望一般消费者也能管理今天这样复杂的网络。
  今天的网络还很脆弱和很不灵活。对网络稍加改动就可能造成不可挽救的大混乱。向网络中添加诸如磁盘存储等功能的过程也很复杂。例如,要想添加一个磁盘驱动器,我们就必须打开机箱,处理设置跳线器,并解决一系列复杂的设置问题。即使专家也会头疼。
  实际上,从消费者的角度看,他们所需要的只不过是把硬件和软件插入联网的环境,并立即就能使用可用的服务:就象我们今天插接电话一样。在今天,当消费者从商店购买一部电话后,他不必对电话进行配置。消费者只需给电话服务供应商打一个电话,服务就会送上门。最后,消费者只需把电话插好,就能使用电话服务了。自主的联网。
  Jini的价值Jini的作用就是能简化与网络的交互性。
  从消费者的角度看,消费者把可插接的设备和软件插入网络,就像今天插接一部电话一样简单。
  从传统服务供应商的角度看,Jini简化了Services Delivery (服务提供)的管理。设备不但能向网络推出增值服务,而且还能提供设备的属性和功能。现在,服务供应商可以针对每台设备设计服务。当然,Jini还将有可能打开一扇通向新的网络化服务的大门。
  从产品制造商的角度看,Jini打开了全新的市场。因为Jini简化了设备向网络提供增值服务的能力。所以,产品就不仅仅作为商品而投入竞争,而是作为增值服务的产品参与竞争。
  从Java程序员的角度看,Jini简化了编写分布式应用程序的工作,因而,任何Java程序员都能利用基于Jini的新设备编写应用程序和服务。因此,企业不再需要聘用有限的专家资源编写分布式应用程序,任何Java程序员都能为基于Jini的网络开发服务。
  Jini的起源Bill Joy1994年之前向Sun公司实验室提交了一份包括以下三个主要概念的建议书:
  可在所有平台上运行的语言运行该语言的虚拟机,和允许分布式虚拟机像单一系统那样工作的网络化系统到1995年,这种语言和虚拟机相继面市,即Java编程语言和Java虚拟机。但该系统的概念则仍保留在Sun公司的研究与开发实验室,作进一步的研究和开发。这个系统的概念就是Jini
  Jini战略部署与合作伙伴Sun公司部署了广泛的战略,力求将Jini推向市场。我们可以这样说,Jini与任何向网络化环境提*品和/或服务的企业都密切相关。这包括传统的设备制造商、服务供应商和软件开发商。

  Jini将如何进行授权?
  为推动Jini的进一步创新,使其尽快被市场所接受,Jini源代码将象Netscape公司的Mozilla模型一样向所有开发商公开。为确保兼容性和质量,正在考虑对商业产品进行标记。围绕授权方式的很多具体细节目前仍在最后确定过程之中。拟议中的授权草案将于今年8月公布。
  Jini技术概述
  Jini技术可划分为两个范畴:体系结构和分布式编程。此外,还将提供在Jini上运行的网络服务。
  基础结构
  Jini基础结构解决设备和软件如何与网络连接并进行注册等基本问题。
   
  基础结构的第一种要素称作Discovery and Join (发现与联合)Discovery and Join解决设备和应用程序在对网络一无所知的情况下如何向网络进行首次注册这样的难题。
  基础结构的第二个要素是Lookup (搜索)Lookup可被看作网络中所有服务的公告板。
  Network Services ---网络服务Other Services ---其它服务Leasing ---租用Transactions ---交易Distributed Event---分布式事件Other OS ---其它操作系统Other CPU ---其它CPU DISCOVERY AND JOIN 设备或应用程序插入网络后需要完成的第一个任务就是发现该网络,并使网络发现该设备或应用程序。我们之所以使用Discovery and Join这样的说法,是因为设备或应用程序事前不可能对网络有任何了解。
  Discovery的工作原理如下:
  当基于Jini的设备插入网络后,它就通过一个众所周知的端口向网络发送一个512字节的多路广播Discovery包。在其它信息中,该包包含对自己的引用。
  Jini Lookup在众所周知的端口上进行监听。当接收到Discovery包后,Lookup就利用该设备的接口将Lookup的接口传递回插接的设备或应用程序。
  现在,该设备或应用程序已经发现了该网络,并准备将其所有特性上载到Jini Lookup。上载特性是Discovery and JoinJoin这方面的特性。
  现在该设备或应用程序使用在Discovery阶段所接收到的Lookup接口与网络相连。上载到Lookup的特性包括该设备或应用程序所提供的所有增值服务(如驱动程序、帮助向导、属性等)
  LookupLookup是网络上所有服务的网络公告板。Lookup不但存储着指向网络上服务的指针,而且还存储着这些服务的代码和/或代码指针。
  例如,当打印机向Lookup注册时,打印机将打印机驱动程序或驱动程序接口上载到Lookup。当客户机需要使用打印机时,该驱动程序和驱动程序接口就会从Lookup下载到客户机。这样,就不必事先把驱动程序装载到客户机上。
  打印机还可能把其它增值服务装载入Lookup。例如,打印机可能存储关于自己的属性(如它是否支持postscript,或它是否为彩色打印机)。打印机还可能存储可在客户机上运行的帮助向导。
  如果网络上没有Lookup,则网络就会使用一个Peer Lookup (对等Lookup )程序。当需要服务的客户机在网络上找不到Lookup时,Peer Lookup就开始工作。在这种情况下,客户机可发送与Lookup所用的相同的Discovery and Join包,并要求任何服务供应商进行注册。随后,服务供应商就会在客户机上注册,尽管那不是Lookup

  分布式编程Jini分布式编程为Java增添了创建分布式系统所必需的其它功能。尤其是Jini分布式编程可提供租用、分布式交易和分布式事件。
  租用租用与租用一套公寓很类似。我们在租用一套公寓时,一般会商定使用该公寓的时间。类似地,在Jini中,对象彼此之间商定租期。例如,当某设备使用Discovery and Join协议发现网络时,它就注册一段租用时间。在租约到期之前,该设备必须重新商定租期。这样,如果租约到期或设备拔下后,该设备在Lookup中的记录就会被自动删除。这就是分布式垃圾收集的工作原理。
  分布式事件在单一的计算机中,事件肯定能被接收方接收到,序列也肯定能按照顺序进行。
  但在分布式环境中,分布的事件可能不是按照顺序被接收,或者,某个事件还可能丢失。
  为便于在Java环境中处理分布的事件,Jini为分布的事件提供了一个简单的Java API。例如,当一个分布的事件发生时,该事件都带有一个事件号和序列号。利用这种信息,接收方就能检查事件是否丢失(序列号丢失)或事件是否按照顺序接收(序列号顺序不对)到。
  分布式交易在分布式Java环境中,有时需要一种很简便的方法,来确保在整个交易完成之前,在该交易中发生的所有事件都被真正提交了(两阶段提交)。
  为便于进行此类分布式计算,Jini提供了一种简单的Java API。该API可使对象起动一个能管理交易的交易管理器。每个参与交易的对象都向交易管理器注册。
  当交易发生时,如果某个参与的对象说,交易中的某个事件没有发生,则此信息就被送回交易管理器。随后,交易管理器就告诉所有参与的对象回滚(rool back)到前一个已知状态。类似地,如果所有对象都完成了其交易的过程,则整个交易就向前进行。
  Jini上的网络服务在Jini基础结构和分布式编程之上,可提供便于分布式计算的网络服务。JavaSpace就是这样的一种网络服务。
  欲知有关JavaSpace的详细情况,请访问http://java.sun.com/products/javaspace我们期待着将来在Jini上建立更多其它的网络服务。
  欲知有关Jini技术的详细情况,请访问http://java.sun.com/products/

Jini技术基础结构

Jini技术的即插即用的基础结构主要由三组协议组成:查找(Lookup)、发现(Discovery)和加入(Join)。查找服务是分布式Jini系统的基本组成部分,提供了在分布式Jini系统中服务的*注册机制。在Jini系统中,程序找到服务的首选方法是通过查找服务,而且查找服务也是提供给管理员和用户各种访问接口的基础。 

  查找服务的服务模型 

  查找服务保存了一个服务的表,表中的每个元素代表了系统中可用的一项服务,其中保存了访问这项服务所需要的代码和一系列可扩充的描述服务的属性。打个比方,查找服务就像电话簿,Jini系统中的服务就像电话簿中的用户,查找服务中保存的信息就是用户的电话号码。也就是说,凡是需要访问Jini系统中的服务,就必须知道查找服务中保存的“电话号码”。但是查找服务有不少超过电话簿的优点,例如:查找服务保存的是一个动态的“电话簿”,而且,系统中的服务可以在“电话簿”中主动加入和去掉自己的“电话号码”,而查找服务也完全支持这种机制。而在以后的内容里,我们会发现更多的不同点。 

  当服务在查找服务中注册后,会产生一个通知事件。系统管理员可以利用查找服务中的事件回调机制来收到这个通知。这就有利于系统管理员管理和维护系统。而且服务也会提供设置自身的用户界面,这个用户界面可以作为服务的属性保存到查找服务中。管理员能轻松地设置服务,不用忙着到处找各种各样的驱动程序和管理软件。 

  在服务的有效期内,如果服务遇到问题需要引起管理员的注意,例如打印服务发现纸张短缺服务就增加一个属性来指明问题。更改后的结果会保存到查找服务中。这时,同上所述,管理员利用查找服务的事件回调机制来收到上述问题的通知。有了这个有力的机制,大大减轻了系统管理员的负担。 

  发现协议和加入协议 

  网络中的服务在启动后,怎样加入到分布式Jini系统中,成为Jini系统中的服务,有两个重要的必不可少的步骤。第一步肯定是找到系统中的查找服务,这个过程就是Discovery过程,用到的协议就是发现协议。第二步就是把自己注册到查找服务中,这个过程是Join过程,描述这个过程的协议就是Join协议。一项服务在完成了这两步后,就真正成为了Jini系统中的一位成员。为了准确地描述这两个协议,先介绍一下用到的术语。 

  主机。拥有一或多个Java虚拟机并且能加入网络的一个硬件设备被称为主机组。一组Jini服务所组成的集合。组的名字是任意的字符串,用来描述该组的性质。 

  Discovery实体。Discovery实体就是处于同一主机内,将要开始,或者正处在找到查找服务的过程中一个或多个相互协作的Java语言中的对象的集合。 

  Join实体。Join实体就是处于同一主机内,已经获得了查找服务,处于从查找服务中查询服务或者将自己注册到Jini系统内过程中的一个或多个相互协作的Java语言中的对象的集合。在以后的文章中,为了方便描述,将Discovery实体和Join实体统称为实体。 

  Jini系统中的服务包括的范围很广,包括各种纯软件的服务和硬件设备的服务。如果一台主机希望加入Jini系统,成为Jini系统中的一项服务,需要具备以下几个条件:首先需要一个能够运行Jini代码的Java虚拟机;其次需要一个正确配置的网络协议栈。这个网络协议栈随着网络协议的不同而改变。这里假定采用的网络层的协议是IP协议,此时以下几个条件是必不可少的:IP地址(IP地址或者是静态IP地址,或者是由主机利用DHCP协议来取得的动态IP地址);支持TCP协议和UDP多点传送协议(在Discovery过程中会用到这两种协议)。举个例子,一台联网的、安装了JDKJava开发工具包)的个人电脑就是一台主机。 

  每个查找服务都有相关联的组,这样可以使Jini系统中的服务结构更有层次感。例如:一个特定的查找服务可以属于打印设备组,任何打印服务都可以注册到该查找服务中。当然,组都是预定义的。在Discovery的过程中,Discovery实体确定自己感兴趣的组,也就是自己希望加入的组,如果找到的查找服务也属于这样的组,Discovery实体就加入到这个查找服务中。这就避免了查找服务的结构过于庞大,把组织系统中服务的责任分摊给系统中多个不同的查找服务。目前,组的命名还没有一个明确的规范,Sun公司只是希望组的名字最好符合网络域名的命名规范,但是目前并没有给出如何定义组的名字的详细规范。我们相信在未来的发展过程中,随着对Jini系统中服务的组织结构层次性要求的提高,这种命名规范会随之完善起来的。 

 1.发现 

  在Discovery实体和查找服务交互过程中用到的协议一共有三个,分别是:多点传送请求协议(multicast request protocol)、多点传送宣布协议(multicast announcement protocol)和单点传送发现协议(unicast Discovery protocol)。这里首先对这三个协议进行简单的介绍。 

  多点传送请求协议。Discovery实体使用该协议以发现Jini系统中存在的查找服务。这个协议可用于设计浏览Jini系统中的服务的浏览器。 

  多点传送宣布协议。查找服务在启动后或者在网络崩溃的恢复过程中,利用该协议在系统中发布自己存在的数据报。 

  单点传送发现协议。当Discovery实体和查找服务中有一个知道了另一个的网络地址和端口号时,就采用该协议来主动建立两者之间点到点的通讯。 

  在Discovery的过程中,Discovery实体和查找服务的联系是建立在socket层上的。两者既是客户方,也是服务方。在通讯的过程中,分为两个阶段。 

  第一个阶段:Discovery实体和查找服务各自都建立了一个单点传送服务的服务器,可以理解为普通的Internet服务器,例如FTP协议中的FTP服务器,目的就是让Discovery实体和查找服务能够建立与对方的点到点的连接。现在面临的问题是:如何让双方知道对方的服务器地址?在第二个阶段的描述中会找到这个问题的答案。 

  第二个阶段:此时Discovery实体和查找服务都不知道对方的网络地址,但是根据Jini系统的要求,双方在网络层加入了特定的多点传送的组(这个组不是Jini系统中的组的概念,而是指网络协议中的组),而且双方都知道对方加入的网络组的组地址。由于网络协议支持向网络组中所有机器同时发送UDP数据包,利用这个特性,双方都向对方所属的组发送数据包。Discovery实体发送数据包的过程称为多点传送请求,在查找服务中发送数据包的过程称为多点传送广播宣布。在两者发送的数据包中都保存了各自的地址和其它必要信息。同时,双方都建立了一个收听发向本组的UDP数据包的服务器。Discovery实体所建立的服务器的服务称为多点传送广播收听服务,在查找服务中建立的服务器的服务称为多点传送广播请求服务。服务器把收到的数据包进行解码,就可以知道客户方的地址。在这个阶段中用到的协议就是多点传送请求协议和多点传送宣布协议。这时,Discovery过程就进入了第三个阶段。 

  第三个阶段:此时Discovery实体和查找服务中有一个已经知道另一个的网络地址。这时双方就利用unicast 发现协议来进行通讯。协议的步骤如下: 

  第一步: 这一步有两个对等的过程。当查找服务的单点传送服务器收到Discovery实体的连接请求后,就建立了与Discovery实体的连接;或者是Discovery的单点传送服务器收到查找服务的连接请求,建立与查找服务的连接。两者之中那一个首先发起连接是等价的。双方都创建了一个线程来负责创建与对方服务器的连接。 

  第二步:当Discovery实体和查找服务建立连接后,由Discovery实体主动发送一个特定Discovery请求后,查找服务就把以后所需要用到的Java语言中的对象(帮助Discovery实体加入到查找服务中的对象)传给Discovery实体。 

  有时已经发现并加入系统的实体会再次使用发现协议。例如,一个实体需要确定特定的查找服务是否还在运行,或者关心是否有新的服务进入,以及其他诸如此类的问题。这时就会再次使用发现协议。 

  在Discovery实体的Discovery过程中,这三个发现协议互相协作。当实体启动的时候,使用多点传送请求协议来找到附近的查找服务;为了避免加重网络的负担,在经过一段时间后实体就会停止使用该协议,转变为利用多点传送宣布协议来收听查找服务的广播。在具体的实现中,这三个协议都是作为独立的线程来实现的,由Discovery实体来负责协调这三个线程的运行。 

  2.加入 

  Join协议向已经找到查找服务的服务提供了一系列应该遵循的标准步骤。当服务遵循这些步骤后就可以在查找服务中注册以加入Jini系统。值得注意的是,加入并不意味着简单的注册,而维持系统正确运行是加入的核心内容。 

  由于Jini系统是一个分布式系统,为了使系统在各种情况下正常运行,设计者对网络系统崩溃后系统的恢复和系统持久运行的能力特别重视。所以在实现时,Jini系统中的服务都保存了必须保存的永久状态信息。这些信息如下: 

  1)表示服务在Jini系统中的标识符。服务在不同的查找服务中注册的服务标识符是唯一的。 

  2)服务具备的属性。这些属性是Java语言中的对象。服务的属性描述了服务的状态。如果服务的状态改变了,那就必须修改属性以适应这个改变。为了保证Jini系统中状态的一致性,服务保存更改后的属性后,必须在每个已经注册的查找服务中做同样的更改。 

  3)一套服务想要加入的组的集合。 

  4)必须注册的特定的查找服务。对于这些查找服务,服务必须注册到该查找服务中,而不论查找服务所属的组是否服务希望加入的组。 

  每个服务都维持了一份它所注册过的查找服务的表和一份租约表。当服务在特定的查找服务中注册后,会得到一份租约,服务会分别把租约和这个查找服务加入到上述的表中。服务对租约定期续借来保证注册的有效性。如果服务需要退出特定的查找服务,服务就会取消和这个查找服务相关联的所有租约。由于租约机制的引入,使得不会出现系统资源不可回收的现象,增强了系统的鲁棒性。 

每一个Jini设备通过实现DicoveryJoin协议,就可以随时随地加入或退出Jini系统,从而达到即插即用的效果。 

拥抱Jini:从Starter Kit 2.0开始(第一部分)

肖文鹏
北京理工大学的硕士研究生
2003 年 8 月 25 日

Jini代表着分布式计算技术的深刻革命,其目的是通过对分布式资源的高效处理,将网络逐渐变成一个方便灵活且易于管理的工具,这样用户或任何其它可计算实体在Jini系统中都能够很方便地发现对其有用的资源,从而完成各种分布式计算。本文第一部分介绍了Jini的基本概念和实现原理,在本文的第二部分作者将介绍借助Jini Technology Starter Kit v2.0如何开发基于Jini的软件系统。

Jini代表着分布式计算技术的深刻革命,其目的是通过对分布式资源的高效处理,将网络逐渐变成一个方便灵活且易于管理的工具,这样用户或任何其它可计算实体在Jini系统中都能够很方便地发现对其有用的资源,从而完成各种分布式计算。本文第一部分介绍了Jini的基本概念和实现原理,在本文的第二部分作者将介绍借助Jini Technology Starter Kit v2.0如何开发基于Jini的软件系统。

为何求助Jini

从计算机诞生那天起,在如何更好地将计算机互连起来以便充分利用各种资源这一问题上,人们从来没有停止过辛勤探索的脚步。从大型机到PC机,从局域网到广域网再到后来的Internet,整个世界似乎经历了一次网络化的大洗礼。现在,随着嵌入式设备的大量使用,无所不在的网络和无所不在的计算(everything connecting, everywhere computing)又在逐渐将人类带入一个崭新的信息社会。

一切都非常令人兴奋,并且随之而来各种电子设备的互联也将成为一种必然的趋势。今后,与人们生活息息相关的各种家电设备都能够联成网络并接入Internet,人们可以在任何时间、任何地点统一控制各种家电,让它们协同工作,从而将极大地影响和改变目前的生活方式。比如,在将电视机接入Internet后,你就可以通过电视机来浏览网页,获取所需的信息;又比如,你可以在下班前一小时,通过Internet控制家里的电饭煲和微波炉开始工作,这样当你到家时晚饭已经做好了;再比如……

可问题是现在联网还是太复杂了,无论是要把一台PC机连接到网络上,或者是使用联网的打印机,都是一件非常困难的事情,至少对一般的消费者来讲是这样。而类似安装驱动程序、修改配置文件等"专业性"的工作,更加只有那些经过严格训练并且经验丰富的系统管理员才有可能胜任。另一方面,目前的网络还相当脆弱,并且很不灵活,仅仅只对某些关键部件稍加改动很可能就会造成网络的一片混乱。而像添加磁盘驱动器这类看似非常简单的事情,管理员也必须先打开机箱,设置跳线,并解决一系列复杂的软件设置问题。

解决这个问题的办法是提出一种全新的分布式计算概念,使得任何设备无需预先配置和安装,便可在任何时间任何地点加入网络,并且能和网络中已有的各种软硬件一起协调工作完成计算。正是在这一思想的指引下,产生了Jini这一新的分布式计算平台,Jini的设计理念就是要让用户在使用计算机周边产品或嵌入式电器时,能像使用电话一样方便。从消费者的角度看,如果你想安装电话,只要申请到一个电话号码,再去买个电话机,然后把插头往墙壁上的插座一插,拿起话筒听到嗡嗡声后就可以正常使用了,不需要对电话进行任何配置。Jini的目标正是要在可靠性、可配置性和可管理性等方面达到类似于电话系统那样的水平,使得任何硬件或者软件只要进入网络这一大环境,就能够立即使用所有可用的服务,而不需要那么多烦琐的配置过程。

Jini是什么?

Jini是以Java技术为核心的分布式系统,它通过使用一个简易的"即插即用"模型,能够随时改变硬件或者软件的配置,从而提供了一个支持快速配置的分布式计算环境。Jini的迷人之处在于它能够使各种数字设备无需配置、安装或者人工干预,就能够在一个临时的称为服务联盟(federations of services)的设备集合*同工作。联盟中的任何设备无论大小都可以自行管理,共同组成一个服务网络,联盟中的每一个成员都可以为其它成员提供资源或服务,同时又可以从其它成员那里获取自己所需的资源和服务,Jini提供一套完善的机制使得硬件设备或者软件组件能够随时加入或者退出联盟。

Jini是一个主动的、响应式的分布式基础结构,它提供了在分布式环境中进行服务的建立、查找、通讯和调用的一整套机制。Jini技术被设计成可以运用在任何有能力连入网络的器件上,而不论该器件运行什么软件或运行在哪种硬件设备之上。Jini技术是以网络器件中的一个构件的面貌出现的,它为器件如何连入网络、共享信息和与网络进行互操作建立了一套规则,而同时又保持了对用户的完全透明。Jini本身与平台无关,采用它的器件不再受到所用软件、处理器、设备驱动器,或传统网络协议的制约,其唯一要求只是一个能够运行Java字节码的虚拟机,如图1所示。

图1 Jini运行环境

提出Jini这一体系结构的目标是将成组的硬件设备和软件组件联合成一个单一的、动态的分布式系统,联合后的网络系统更加易于管理和使用,同时在保持单机的灵活性、统一响应和控制的情况下,还能够支持由系统提供的共享能力。Jini这一体系结构中有几个非常重要概念:

· 服务(Service 
服务是一个独立的功能实体,它可以被人、程序或者其它服务使用。服务这一概念在Jini中包括的内涵非常丰富,它可以是一次计算过程或者存储操作,也可以是和另一个用户交流的通道,甚至可以是一个硬件设备或者另一个用户。Jini系统中成员间的联盟是为了对服务进行共享访问,一个Jini联盟不应被简单地看成是客户机和服务器的集合,而应当看作是组合到一起完成某个特定任务的服务集合。Jini提供了相应的机制,能够在分布式系统中实现对服务的构造、查找、通信和调用,同时还提供了一套服务协议来负责服务间的通信。 

· 客户(Client 
Jini中的客户是需要利用服务的硬件设备或软件组件,Jini的目标是支持尽可能多的异构客户,包括各种硬件设备和软件平台。 

· 查找服务(Lookup Service 
Jini中的一种服务协议,它允许软硬件发现网络并变成联盟中的成员,同时将所提供的服务广播给联盟中的其它成员。 

Jini如何工作?

一个完整的Jini系统由基础设施(Infrastructure)、编程模型(Programming Model)、服务(Services)三个部分组成,其体系结构如图2所示。

图2 Jini系统架构

3.1 基础设施

基础设施用来定义基于Jini的硬件设备和软件组件如何连接并注册到网络,它包括以下四个组成部分:

· Java RMI扩展实现  这是Jini系统中的构件在通信时所采用的底层通信机制。 

· 分布式安全系统  用来将Java平台的安全模型扩展到分布式Jini系统,并定义联盟成员的使用权限。 

· 发现/加入(Discovery/Join)协议  是一种服务协议,允许软硬件发现网络并成为联盟的成员,同时将所提供的服务广播给联盟中的其它成员。 

· 查找(Lookup)服务  是网络中所有服务的公告牌(bulletin board),用来展示联盟中的所有成员,并且帮助使用者在联盟中寻找所需的资源和服务。 

Jini基础设施负责实现添加、删除、定位和访问服务的相关机制,它通常驻留在网络中的三个地方:在查找服务中;在服务提供者中;或者在客户中。Jini基础设施的核心是Lookup、Discovery和Join三条协议,它们使得基于Jini的任何服务都可以随时加入或者退出联盟,并且在加入联盟时无需进行安装和配置,从而达到了即插即用的效果。

查找服务(Lookup Service) 是Jini体系结构中的基本组成部分,它负责在分布式系统中提供对服务的*注册机制。一旦进入Jini的世界,如果想找到所需的服务就必须通过查找服务,此外,查找服务还是为管理员和用户提供各种访问接口的基础。在一定程度上你可以将查找服务看成是网络中所有服务的公告牌,它维护着各个服务所提供的功能接口与实现该服务的对象集间的映射关系。Jini中的客户通过使用查找服务在分布式网络中查找和调用所需的服务,而查找服务中的对象本身可以包含其它查找服务,从而构成层次式的查找服务。

当硬件设备或者应用程序进入网络时,它所提供的服务如何被Jini发现并接纳,并进一步成为整个Jini分布式系统中的某项服务,需要经过两个必不可少的重要步骤。第一步是找到系统中的查找服务,这个过程称为发现(Discovery),所用到的协议是发现协议。第二步是将自己注册到查找服务中,这个过程称为加入(Join),描述这个过程的协议是Join协议。一个Jini服务只有在成功完成了这两个步骤之后,才能正式成为联盟中的一员,并开始向外界提供相应的服务。

在Jini这一分布式计算环境中,服务提供者所提供的服务既可能是硬件也可能是软件。当某一服务提供者需要加入到Jini系统中时,它首先必须找到网络中的查找服务,于是它在局域网中进行广播,请求加入到查找服务中。附近的查找服务在收到相应的请求后负责识别并接纳该服务,整个过程称之为发现,如图3所示。需要注意的是,服务提供者必须包含用于通讯的服务对象(service object)和描述该服务特点的服务属性(service attributes)。

图3 发现过程

当查找服务找到之后,服务提供者将与查找服务直接进行通讯,把自己的服务对象和服务属性注册到查找服务中,换句话说就是把服务对象和服务属性发送到查找服务中去。这个过程称为加入,如图4所示。

图4 加入过程

一旦服务被成功地加入到查找服务中后,如果Jini系统中的客户需要使用该服务,它可以根据服务的类型或者属性向查找服务查询合适的服务,查找服务负责把查询后的结果返回给客户,当客户决定使用该服务时,查找服务还会将该服务对象的拷贝发送给客户,如图5所示。

图5 查找过程

Jini客户从查找服务那里获得的服务对象是一个Java接口(Interface),其中包括用来调用服务的方法名称和参数,以及其它一些描述信息。Jini客户通过获得的服务对象与服务提供者进行直接联系,获得相应的服务。服务对象负责处理客户与服务提供者之间的通信,从而向用户隐藏了服务的具体实现细节,如图6所示。

图6 服务过程

3.2 编程模型

Jini是一个分布式的计算环境,其编程模型自然也是分布式的,编程模型在Jini的体系结构中占有非常重要的地位,其基础设施正是借助这一编程模型有机地结合在了一起。Jini的编程模型主要包括下面几个方面:

· 租用(Leasing 
在分布式系统中有一个非常严重的问题,那就是不能保证服务不突然崩溃。例如,当一台数字相机通过查找服务加入到Jini网络中时,将对外发布信息表明自己可用且一切正常,但如果此时用户在不正常关闭设备的情况下随意将相机拔掉,相应的问题就产生了。因为对联盟中的其他成员来说,此时它们无法判断是相机所连接的远程主机已经关掉,还是响应速度比较慢,或是相机本身产生了故障。为了解决这个问题,Jini使用了一种称为租用的技术。租用的基本思想是:不再保证可以在任意长的时间内访问资源,而是只能在一段固定时间内将资源"借给"某使用者。租用机制使得客户对服务的访问是基于租约的,租约保证了一段时间内的授权访问,租约必须在服务的使用者和服务提供者之间进行协商。租约在到期之前如果不续约的话,相应的资源将被释放。租约可以是唯一的,也可以不是唯一的,非唯一租约允许多用户共享同一资源。 

· 分布式事件(Distributed events 
Java类似,Jini也使用事件的概念来处理异步通知,事件可以被理解成是一个包含外部状态变化信息的对象。例如,当鼠标状态在AWT中发生变化时,不论是移动、点击还是释放,都将产生一个MouseEvent事件,事件产生后将被直接发送到希望得到该信息的相关实体(Listener)。Jini的事件模型和Java的非常类似,但它同时还能够支持分布式事件。Jini的编程模型允许一个对象注册对其他对象感兴趣的事件,并且在该事件发生时能立即得到相应的通知,这就使得基于事件的分布式程序能以有多种可靠性和扩展性保证的方式编写。 

· 事务(Transaction) 
分布式计算中另一个非常棘手的问题是部分失败,所谓部分失败指的是整个计算过程中的某一步产生了错误,或者计算所需的某个组成部分出现了故障。假如,银行想在两个帐户间进行转帐,即从一个帐户中减去一定数量的金额然后加到另一个帐户上,是不是只要编写一段代码实现从A帐户中减去一定的金额,然后再用另外一段代码实现向B帐户中加入同样的金额就可以了呢?看起来似乎没有什么问题,但实际上却存在非常严重的错误,如果资金从帐户A转出之后机器就崩溃了,很明显B将永远无法得到,而产生这一问题的根本原因就是没有考虑到程序可能会部分失败。 Jini通过引入事务的概念解决了部分失败这一问题,事务是将一系列相关操作进行分组,以保证所有操作要么全部成功,要么全部失败的一种方法。采用事务的好处是无论在执行过程中出现什么情况,系统都将进入一个确定的状态,这样处理起来就相对容易多了:事务成功则继续进行,事务失败则稍后再试。事务最早出现在数据库理论中,目前已经出现了许多实用的事务模型,Jini中采用的是两阶段提交(two-phase commit)这一事务模型。 

3.3 服务

Jini的基础设施和编程模式使得服务能够在分布式环境中被注册和发现,并能够向用户宣布自己的存在。服务是Jini体系结构中一个非常重要的概念,它可以用来表示组织在一起形成Jini联盟的各个实体,这里所指的实体可以是硬件、软件或者软硬件的结合。

Jini中的每个服务都有一个接口描述,该接口定义了客户可以向这个服务请求的所有操作,并且反映了服务的类型。Jini中的服务是可以聚合的,即允许一个服务由多个子服务组合而成。整个Jini体系结构中最重要的一个服务是查找服务,它是Jini基础设施的一个子组件,其它作为Jini体系结构组成部分并实现为Jini服务的对象包括:

· JavaSpace  为Jini中的对象提供了一个可选的分布式持续性保存机制,并能够被用来进行简单的通信。 

· 事务管理器  为Jini中的对象提供分布式事务服务,允许对象参与到由编程模式所定义的两阶段提交协议。 

怎样启动Jini

Jini目前还处于研发的早期阶段,因此迄今为止还没有哪个Jini实现系统声称它可以真正投入实际使用,自然也就没有完全遵循Jini规范的服务或者设备出现。尽管如此,Jini试图去解决的问题对许多软硬件厂商来讲已经非常急切了,因此Sun公司给出了一个Jini的参考实现系统:Jini Technology Starter Kit,它可以从 http://wwws.sun.com/software/jini/下载到,目前的最新版本是2.0。 

从Sun公司的网站下载到Jini Technology Starter Kit Version 2.0的源码包jini-2_0-src.zip后,将其解压缩到d:\ jini2_0\目录下。由于Jini建立在一系列其他服务的基础之上,因此在正式启动Jini之前还必须先对这些服务进行配置,Jini Technology Starter Kit开发包中集成了一些支持Jini运行所必需的基本服务:

· HTTP服务器 
在通过RMI下载代码时,需要利用HTTP协议完成传输,因此在运行Jini时需要一个HTTP服务器。Jini Technology Starter Kit带有一个非常简单的HTTP服务器,但它对于供在应用程序间传送代码已经完全足够了。通常情况下,需要在每个供其他应用程序下载代码的机器上运行一个HTTP服务器。 

· RMI激活守护进程 
这是Jini Technology Starter Kit基础结构中非常实用的一个部分,它使得那些很少被调用的对象基本保持在"睡眠"状态,在需要时又能够被自动"唤醒"RMI激活守护进程负责管理对象在活跃和非活跃状态间的切换,并被其他Jini运行时核心服务所调用,它至少应该在查找服务所处的主机上运行。 

· 查找服务 
查找服务才是Jini的核心,它负责记录网络中当前激活的所有服务。尽管JDK中的RMI注册服务也可以作为查找服务使用,但不推荐使用,Jini Technology Starter Kit中提供的查找服务具有更加丰富和完善的功能。当出现故障或重新启动之后,查找服务需要依靠RMI激活守护进程来恢复其状态,因此在运行查找服务的机器上必须同时运行RMI激活守护进程。 

Jini Technology Starter Kit v2.0在它的tools.jar包中自带了一个HTTP服务器,你可以在d:\jini2_0\script\目录下创建一个内容如下的批处理文件来启动它:

清单1start-httpd.bat

@rem 启动HTTP服务器的批处理文件

java -jar lib\tools.jar -port 8080 -dir lib -verbose

缺省情况下,HTTP服务器将运行在8080端口,但如果此时系统中已经有一个Web服务器运行在8080端口了,那么可以用"-port"参数把Jini的HTTP服务器指定到另外的端口。参数"-dir"可以用来设置HTTP服务器的根目录,在上面的例子中将其设置为Jini的lib目录,这样做的好处是Jini的核心代码可以被直接下载。最后那个参数"-verbose"是用于调试的,它要求HTTP服务器显示所有来自客户端的请求信息以及这些请求的来源。

RMI激活守护进程rmid是由JDK所提供的,它必须在可激活对象所在的每一台主机上运行,其中包括Jini查找服务、事务管理器和JavaSpace。如果你已经成功地配置好了JDK,那么可以在d:\jini2_0\script\目录下创建一个内容如下的批处理文件来启动它:

清单2start-rmid.bat

@rem 启动RMI激活守护进程的批处理文件

rmid -J-Dsun.rmi.activation.execPolicy=none

Jini Technology Starter Kit v2.0中查找服务的实现是Reggie,它位于reggie.jar包中,启动这个服务比启动其他服务要稍微复杂一些。首先在d:\jini2_0\config\目录下为Reggie创建一个内容如下的安全策略文件:

清单3all.policy

/* 安全策略文件 */

grant codeBase "file:lib${/}*" {

    permission java.security.AllPermission;

};

接着在d:\jini2_0\config\目录下为Reggie创建一个内容如下的启动配置文件:

清单4start-reggie.config

/* 启动Reggie查找服务的配置文件 */

import com.sun.jini.config.ConfigUtil;

import com.sun.jini.start.NonActivatableServiceDescriptor;

import com.sun.jini.start.ServiceDescriptor;

com.sun.jini.start {

    private static codebase =

        ConfigUtil.concat(

            new Object[] {

                "http://",

                ConfigUtil.getHostName(),

                ":8080/reggie-dl.jar" });

    private static policy = "config${/}all.policy";

    private static classpath = "lib${/}reggie.jar";

    private static config = "config${/}reggie.config";

    static serviceDescriptors =

        new ServiceDescriptor[] {

             new NonActivatableServiceDescriptor(

                codebase,

                policy,

                classpath,

                "com.sun.jini.reggie.TransientRegistrarImpl",

                new String[] { config })

    };

}

最后再在d:\jini2_0\config\目录下为Reggie创建一个内容如下的配置文件:

清单5reggie.config

/* Reggie查找服务的配置文件 */

import net.jini.jrmp.JrmpExporter;

com.sun.jini.reggie {

    

    serverExporter = new JrmpExporter();

    initialMemberGroups = new String[] { "example.jini.sun.com" };

}

为了简化Reggie查找服务的启动,可以在d:\jini2_0\script\目录下创建一个内容如下的批处理文件:

清单6start-reggie.bat

@rem 启动Reggie查找服务的批处理文件

java -Djava.security.policy=config\all.policy -jar lib\start.jar config\start-reggie.config

这样在需要启动HTTP服务器、RMI激活守护进程或者Reggie查找服务时,只用在命令行方式下依次执行下面的命令就可以了:

D:\jini2_0> start script\start-httpd

D:\jini2_0> start script\start-rmid

D:\jini2_0> start script\start-reggie

在Jini的世界中,所有可用的资源都被看成是服务,而对服务的查询和检索则是最频繁的操作之一,为此Jini Technology Starter Kit v2.0专用提供了一个实用工具Browser,利用它可以查询当前Jini网络中的所有服务。为了简化Browser的启动,可以在d:\jini2_0\script\目录下创建一个内容如下的批处理文件:

清单7start-browser.bat

@rem 启动Browser的批处理文件

java -Djava.security.policy=config\all.policy -Djava.rmi.server.codebase=

http://%computername%:8080/browser-dl.jar -jar lib\browser.jar

现在只要在命令行方式下依次执行下面的命令就可以启动Browser了:

D:\jini2_0> start script\start-browser

正如前面介绍过的,查找服务是Jini中的一项特殊服务,因而此时如果Reggie查找服务已经正常启动了,那么可以在Browser中查询到它,如图7所示。为了监视Jini查找服务的运行状态,你可以让Browser一直运行下去。

图7 查询Jini服务

小结

Jini在很大程度上改变了人们对网络的看法,它以Java技术为依托,把网络上的各种硬件设备和软件组件联合成单一的、动态的分布式系统,从而使网络更易于操纵和管理,并具有更高的可配置性。Jini的目标是将所有可以联网的软硬件资源组织成一个完全自发的网络,使网络中不再需要手工的设备配制、驱动安装等专业性较强的工作。

参考资料 

1. Jini Technology Starter Kit是Sun公司的一个Jini参考实现,它可以从 http://wwws.sun.com/software/jini/下载到。 

2. 从 http://www.jini.org网站开始可以找到许多与Jini相关的资源。 

3. California Software Labs网站上的Jini by Example( http://www.cswl.com/whiteppr/tutorials/jini.html#intro)是一篇不错的Jini入门读物。 

4. Jan Newmarch's个人网站上的Guide to JINI Technologies( http://jan.netcomp.monash.edu.au/java/jini/tutorial/Jini.xml)是一篇非常优秀的Jini教程。 

5. 有关Jini的FAQ可以在 http://www.artima.com/jini/faq.html找到。 

6. San Diego州立大学网站上的Java Distributed Computing( http://www.eli.sdsu.edu/courses/spring99/cs696/notes/)详细讨论了Java分布式计算所涉及到的各个方面。 

7. 有关RMI的各种信息可以在 http://java.sun.com/products/jdk/rmi/index.html上找到。 

Jini与蓝牙技术的结合应用

文章作者:戴 果 熊 伟
文章类型:设计应用 文章加入时间:2005年3月8日

文章出处:电子技术应用

摘要:分析了Jini和蓝牙技术的基本结构及工作原理,对这两种技术进行了比较,并提出将两者结合应用的实际方案,最后给出了一个应用实例。

关键词:Jini 蓝牙技术 普适计算

  随着嵌入式系统在各种电子设备中的广泛应用,计算机技术的发展将进入一个普适计算(Pervasive Computing)阶段。随之而来的各种电子设备联网成为必然趋势。与人类生活息息相关的各种家电设备能够联成网络并接入互联网,人们可以在任何时间、任何地点统一控制各种家电协同工作,将极大地改变和影响人们的生活。本文探讨了这种普适计算机制的实现。

1 Jini技术

  Jini技术是基于Java语言的新型分布式对等计算结构,是一种动态的自动化机制,它可以使各种数字设备无需配置、安装或人工干预,在一个临时的设备集合(联邦,federation)*同工作。联邦中的任何设备无法大小都可以自行管理,组成一个服务网络,联邦中的每一成员都可以共享资源和服务。Jini结构提供一套机制使得电子设备和应用程序能够随时加入或退出联邦。

  Jini由三部分组成:基础结构(Infrastructure)、编程模型和服务。这三部分虽有区别但又密不可分,基础结构支持并利用编程模型;服务内嵌入基础结构之中,服务对象包含并利用编程模型的接口进行服务之间的通信。基础结构解决设备和软件如何与网络连接并进行注册等基本问题。它由构成分布式联邦的组件组成,其最小内核为分布式安全系统、发现与加入协议(discovery and join)、服务协议和查找服务(lookup service)。分布式安全模型及其实现定义了软件实体的认证方式及操作权限;发现与加入协议定义了服务加入Jini系统的方法;查找服务则是供服务注册登记的场所,这里提供了可以使用的服务对象集合。编程模型也是分布式的,包括租借(leasing)、分布式的事务处理和事件处理三种重要接口。租借接口定义了基于时间的资源分配和释放方法;事务接口引入了一种面向对象的协议,使用表决和提交两个阶段来统一对象之间的相关行为,使得一个事件序列或全部完成或全都不发生。事件和通知接口将JavaBean组建所使用的事件模型扩展为分布式事件模型,支持Jini服务基于事件的通信。,服务是Jini体系的核心,基础结构和编程模型共同支持服务的提交注册及服务的发展,服务使用基础结构完成服务之间的相互调用、相互发现并向其他服务发布本服务的出现。服务在Jini环境中以对象的形式出现,它通过接口来定义其提供的可供其他服务使用的操作和特性。

  Jini使用发现协议(discovery)搜索查找服务(lookup service),获得相应查找服务的代理接口,然后使用加入协议(join)将自己注册到查找服务中,这时该服务可以为其他服务所使用。想要使用其它服务的设备或应用程序,首先与其相邻的查找服务进行连接。这时可以看到本联邦内所有可用的服务,使用查找协议(lookup)将所感兴趣的服务代理接口下载到本地之后就可以与服务提供者进行直接交互通信。同样当一个查找服务启动时,它也使用发现协议向服务广播自己出现,以便服务进行注册登记。

  图1对以上过程进行了形象描述:用发现协议搜索到查找服务,若已预置某个查找服务的URL则可直接进行通信;将服务代理对象注册到查找服务;服务客户将服务对象从查找服务处下载到本地;利用服务对象与服务提供直接通信,使用该项服务。

蓝牙协议

  蓝牙是一种低成本的技术,可以在依赖电池操作的目标机上实现低功耗、短距离的固定通信。这些目标机包括:PDA、无线电话、便携电脑和无线耳机等。

  在蓝牙的拓扑中,一个设备可以带多个从设备并且维持7条链接。一般来说,在任何时刻,主设备会与一个从设备维持点对点通信。可以建立两种通信:一种以异步方式传输数据,另一种以同步方式传输声音。通信类型由主设备决定。并负责建立特殊应用所需的链接,直至应用将其终止。请注意:主从关系不能互换,互换技术用于GSM的蜂窝式手机中,蓝牙不支持这种技术。同时,蓝牙只能支持短距离通信,最远10m。现在加强性标准可以将距离提高到100m,要求便携式设备的电池寿命更长。蓝牙技术不会替换IEEE 802.11中所提出的无线LAN的功能。相比较而言,蓝牙只能在744Mbps的数据率上操作。当然,IEEE 802.11 LAN也更加昂贵。

  蓝牙可以支持无线主机控制器(负责空中链路管理、调制解调器、声音编码/解码)与另外一台带有协议栈和应用软件的主机之间的通信。如果应用软件想要控制无线主机控制器,那么就需要链路管理代理(link management proxy)模块,它可以提供应用程序接口。这一模块在蓝牙标准中没有说明,但是如果希望通过主机控制接口进行通信,协议栈中应包括这一模块。栈接口提供的主要功能就是初始化发现进程和连接进程。发现进程将管理信息发送到10m范围内的所有蓝牙设备,以便获取可用的蓝牙设备列表;连接进程可以与一个或多个可用的蓝牙设备建立连接。所有的应用程序都必须使用这个进程,它们是GAP(General Access Protocol)的一部分,在任何应用使用链路前,必须将GAP与蓝牙设备相连。

  链路安全将利用鉴别进程,在实现子网时,用来确认某设备是否可以与另一设备互连。鉴别操作由无线主机控制器完成,鉴别命令由安全管理模块发出。该模块会访问以前完成的操作进程,可以与蓝牙设备进行数据库信息的连接,这些记录存在设备数据库中,由安全数据库来维护主蓝牙设备所提供的与三种完全级别有关的服务记录。建立两个设备之间的连接时,完全管理模块会做出反应,查询两个设备的数据库,请求无线控制器开始鉴别进程或忽略鉴别进程。数据链路层加密也是同样的道路。栈控制器是另外一个包含在栈软件中的模块,可以提供接口调用软件,从而继续处理由主机或其他蓝牙设备通过无线主机控制器发来的排序或缓冲数据。更为重要的是,栈管理模块管理所有的内部栈时钟,因而使用该栈十分轻松,而且非常容易移植以其他的操作系统上。其八模块按照应用要求分类,运行蓝牙协议时,这也是实际蓝牙连接的情况。

3 Jini与蓝牙技术的结合应用方案

3.1 Jini与蓝牙技术的比较

  Jini与蓝牙技术是两种互补性很强的技术。蓝牙技术主要实现邻近的电子设备无线连接,是硬件设备的无线互连协议;Jini则是实现分布式软件服务(包括无线设备)的软件技术。蓝牙技术是对固定的一组协议间互操作的静态说明;而Jini的“移动代码”代理服务对象可以动态地互操作。两者在ISO/OSI的体系结构中的位置如图2的慰。Jini主要位于表示层和会话层,而蓝牙的协议栈贯空了整个体系结构。Jini的发现协议和分布式安全模型加强了蓝牙技术的发展进程和完全管理模块。

3.2 应用方案

  Jini的注册和注销服务与蓝牙设备在网络中的加入和退出非常类似。Jini控制网络服务的租借,始终使查找服务保持最新状态。在下一节中将详细描述应用实例,本节进行方案设计。

  通常有三种形式来实现其Jini网络功能:基于完整虚机的设备实现,基于嵌入式虚机的设备实现和基于共享虚机的设备实现。

  基于完整虚机设备实现中的设备指一般的通用设备,具有网络连接、较强的计算存储功能,能够运行完整的Java虚机环境。在这种设备上能够实现Jini系统的所有功能,如各种协议功能、RMI、租借更新功能、动态代码移动功能、分布式安全机制等。Jini是位于操作系统和虚拟机之上的功能层,多个设备随机联网形成一分布式资源共享系统,网络传输协议一般由操作系统分别采用TCP/IP协议有线方式和基于蓝牙协议的无线连接方式两种。本设计方案就是基于协议的无线连接方式实现。图3描述了一种应用方案。服务客户、设备和网络代理通过蓝牙网络进行连接,同时也支持TCP/IP协议。网络中包含可以访问的设备数据库、查找服务。蓝牙网络通过SDP协议负责设备加入网络,使设备能够查询、发现最邻近的设备,并对这些设备进行访问,从而实现远程控制。远程控制实现蓝牙网络与Jini的查找服务对话、询问网络可用设备的功能。查找服务保持网络中运行的所有设备的动态列表,如:PDA、电话和CD播放机等。当服务客户(远程控制)请求时,所有这些设备将相关的驱动程序发送到服务客户。当设备不再用时,通过租借终止对网络发出警告,这是Jini的功能,主要用Java的RMI来实现。这种通信和保持服务更新的方式使Jini与蓝牙网络进行了很好的结合。

应用实例

  基于Jini与蓝牙开发了一个无线网络点歌器JBMP3。它具有以下功能:播放客户选取歌典、客户端图形界面、个性化定制客户播放列表。系统结构如图4所示。它由一个能播放音乐文件(mp3文件)的服务端程序、若干能控制服务程序的客户端程序(远程控制)和一个能支持Jini服务的查找服务组成。运行的网络是TCP/IP网络。

  对应用结合附图作如下详细说明:

  (1)点歌器发布一个服务自己拥有的代理对象。例如,能够按先进先出顺序播放音乐文件。

  (2)客户端程序——通用远程控制,询问查找服务网络能提供什么服务。

  (3)查找服务通过与请求相匹配的代理对象副本答复客户端的询问。

  (4)客户端所有的请求都被送到同样的服务器(点歌服务器)。请求通过Jini网络5到达点歌服务器,服务器通过各自的链接(4)更新与之相连的代理对象。同时点歌器的更新以一致的形式显示出来。

  设计主要分为三部分:远程控制接口设计、客户端设计、服务器设计。

4.1 远程控制接口产生的代码

  import net.jini.core .lease.*;

  public interface RemoteControl {

  public String getName ();

  public java.awt .Component.getDisplay();

  public Lease lease (long time)

  throws

  java.rmi.RemoteException,

  LeaseDeniedException,

  UnknownLeaseException;

  }

  getName():通用远程控制需要知道服务的名称以便能在图形界面上显示服务的正确名称。

  getDisplay():通用远程控制需要一个图形界面来控制已经发现的不同服务。

  lease(long time):通用远程控制需要知道在多长的时间内被允许使用某一服务(租借时间)。

4.2 客户机设计

  客户机该仅需作有限的操作,而让服务器作大部分的工作。因为使用很少资源的客户机在慢速处理器和小存储器的设备上运行只适合象PDA一类手持设备或蜂窝电话,因此在这里客户机必需支持一些操作。它们是:

  (1)发现已经在网络上注册的服务的能力。例如,询问查找服务器可用的服务。

  (2)当一个服务在网络上可行时被告知的能力。例如,发出需求后从查找服务接收代理对象。

  (3)租借任意一段时间(非无限长)服务器资源的能力。这由客户机的租借管理器完成。

  (4)接收代理对象,而后经接口向客户机显示的能力。本文是在通用远程控制中的Java面板上实现的。

  客户机接口应该能显示网络提供的不同服务。当前播放列表中的歌曲队列应在显示器上自动更新。

4.3 服务器设计

  因为客户机功能不强,一些附加的功能就必需在服务器上添加。因此服务器至少必需支持以下操作:

  (1)提供一个服务。如代理对象。

  (2)发现查找服务和在网络上公布代理对象。

  (3)写服务身份(对每一个代理独一无二)对象到文件。

  (4)更新租借。

  (5)断开租借已经到期的客户机联接。

  上机几点是应用的核心。这几点组成了用于构建Jini应用的基本通信特征。服务器应该加载目录和发现所有的mp3文件。服务器是物理点歌器,它应具有某种硬件用来播放mp3音频文件。

  Jini和蓝牙技术的结合应用在通信环境中有以下优点:首先,不需要网络连接线;其次,不需要安装设备驱动程序,再次,一个设备远程控制另一个设备。这些特点使得网络更容易连接和管理。虽然蓝牙技术开和生产的代价较高,Jini是SUN公司的免费产品,很容易掌握应用编程接口,并可进行分布式计算。随着蓝牙技术和Jini技术规范的布、不断推广与相互结合,生活中各种电路的互连将变得愈来愈方便,Jini的即插即用功能和蓝牙的无线连网使得设备的增减变得非常简单,使网络的建设可以分阶段逐步完善而不必一次到位,满足了一般用户的需求。Jini技术和蓝牙的结合,必将进一步推动信息无线网络的快速发展,成为信息网络又一重要应用领域,将极大地改变人们的生活方式,促进普适计算时代的到来。

 

Jini技术基础结构- -

                                       

Jini技术的即插即用的基础结构主要由三组协议组成:查找(Lookup)、发现(Discovery)和加入(Join)。查找服务是分布式Jini系统的基本组成部分,提供了在分布式Jini系统中服务的*注册机制。在Jini系统中,程序找到服务的首选方法是通过查找服务,而且查找服务也是提供给管理员和用户各种访问接口的基础。 

  查找服务的服务模型 

  查找服务保存了一个服务的表,表中的每个元素代表了系统中可用的一项服务,其中保存了访问这项服务所需要的代码和一系列可扩充的描述服务的属性。打个比方,查找服务就像电话簿,Jini系统中的服务就像电话簿中的用户,查找服务中保存的信息就是用户的电话号码。也就是说,凡是需要访问Jini系统中的服务,就必须知道查找服务中保存的“电话号码”。但是查找服务有不少超过电话簿的优点,例如:查找服务保存的是一个动态的“电话簿”,而且,系统中的服务可以在“电话簿”中主动加入和去掉自己的“电话号码”,而查找服务也完全支持这种机制。而在以后的内容里,我们会发现更多的不同点。 

  当服务在查找服务中注册后,会产生一个通知事件。系统管理员可以利用查找服务中的事件回调机制来收到这个通知。这就有利于系统管理员管理和维护系统。而且服务也会提供设置自身的用户界面,这个用户界面可以作为服务的属性保存到查找服务中。管理员能轻松地设置服务,不用忙着到处找各种各样的驱动程序和管理软件。 

  在服务的有效期内,如果服务遇到问题需要引起管理员的注意,例如打印服务发现纸张短缺服务就增加一个属性来指明问题。更改后的结果会保存到查找服务中。这时,同上所述,管理员利用查找服务的事件回调机制来收到上述问题的通知。有了这个有力的机制,大大减轻了系统管理员的负担。 

  发现协议和加入协议 

  网络中的服务在启动后,怎样加入到分布式Jini系统中,成为Jini系统中的服务,有两个重要的必不可少的步骤。第一步肯定是找到系统中的查找服务,这个过程就是Discovery过程,用到的协议就是发现协议。第二步就是把自己注册到查找服务中,这个过程是Join过程,描述这个过程的协议就是Join协议。一项服务在完成了这两步后,就真正成为了Jini系统中的一位成员。为了准确地描述这两个协议,先介绍一下用到的术语。 

  主机。拥有一或多个Java虚拟机并且能加入网络的一个硬件设备被称为主机组。一组Jini服务所组成的集合。组的名字是任意的字符串,用来描述该组的性质。 

  Discovery实体。Discovery实体就是处于同一主机内,将要开始,或者正处在找到查找服务的过程中一个或多个相互协作的Java语言中的对象的集合。 

  Join实体。Join实体就是处于同一主机内,已经获得了查找服务,处于从查找服务中查询服务或者将自己注册到Jini系统内过程中的一个或多个相互协作的Java语言中的对象的集合。在以后的文章中,为了方便描述,将Discovery实体和Join实体统称为实体。 

  Jini系统中的服务包括的范围很广,包括各种纯软件的服务和硬件设备的服务。如果一台主机希望加入Jini系统,成为Jini系统中的一项服务,需要具备以下几个条件:首先需要一个能够运行Jini代码的Java虚拟机;其次需要一个正确配置的网络协议栈。这个网络协议栈随着网络协议的不同而改变。这里假定采用的网络层的协议是IP协议,此时以下几个条件是必不可少的:IP地址(IP地址或者是静态IP地址,或者是由主机利用DHCP协议来取得的动态IP地址);支持TCP协议和UDP多点传送协议(在Discovery过程中会用到这两种协议)。举个例子,一台联网的、安装了JDKJava开发工具包)的个人电脑就是一台主机。 

  每个查找服务都有相关联的组,这样可以使Jini系统中的服务结构更有层次感。例如:一个特定的查找服务可以属于打印设备组,任何打印服务都可以注册到该查找服务中。当然,组都是预定义的。在Discovery的过程中,Discovery实体确定自己感兴趣的组,也就是自己希望加入的组,如果找到的查找服务也属于这样的组,Discovery实体就加入到这个查找服务中。这就避免了查找服务的结构过于庞大,把组织系统中服务的责任分摊给系统中多个不同的查找服务。目前,组的命名还没有一个明确的规范,Sun公司只是希望组的名字最好符合网络域名的命名规范,但是目前并没有给出如何定义组的名字的详细规范。我们相信在未来的发展过程中,随着对Jini系统中服务的组织结构层次性要求的提高,这种命名规范会随之完善起来的。 

1.发现 

  在Discovery实体和查找服务交互过程中用到的协议一共有三个,分别是:多点传送请求协议(multicast request protocol)、多点传送宣布协议(multicast announcement protocol)和单点传送发现协议(unicast Discovery protocol)。这里首先对这三个协议进行简单的介绍。 

  多点传送请求协议。Discovery实体使用该协议以发现Jini系统中存在的查找服务。这个协议可用于设计浏览Jini系统中的服务的浏览器。 

  多点传送宣布协议。查找服务在启动后或者在网络崩溃的恢复过程中,利用该协议在系统中发布自己存在的数据报。 

  单点传送发现协议。当Discovery实体和查找服务中有一个知道了另一个的网络地址和端口号时,就采用该协议来主动建立两者之间点到点的通讯。 

  在Discovery的过程中,Discovery实体和查找服务的联系是建立在socket层上的。两者既是客户方,也是服务方。在通讯的过程中,分为两个阶段。 

  第一个阶段:Discovery实体和查找服务各自都建立了一个单点传送服务的服务器,可以理解为普通的Internet服务器,例如FTP协议中的FTP服务器,目的就是让Discovery实体和查找服务能够建立与对方的点到点的连接。现在面临的问题是:如何让双方知道对方的服务器地址?在第二个阶段的描述中会找到这个问题的答案。 

  第二个阶段:此时Discovery实体和查找服务都不知道对方的网络地址,但是根据Jini系统的要求,双方在网络层加入了特定的多点传送的组(这个组不是Jini系统中的组的概念,而是指网络协议中的组),而且双方都知道对方加入的网络组的组地址。由于网络协议支持向网络组中所有机器同时发送UDP数据包,利用这个特性,双方都向对方所属的组发送数据包。Discovery实体发送数据包的过程称为多点传送请求,在查找服务中发送数据包的过程称为多点传送广播宣布。在两者发送的数据包中都保存了各自的地址和其它必要信息。同时,双方都建立了一个收听发向本组的UDP数据包的服务器。Discovery实体所建立的服务器的服务称为多点传送广播收听服务,在查找服务中建立的服务器的服务称为多点传送广播请求服务。服务器把收到的数据包进行解码,就可以知道客户方的地址。在这个阶段中用到的协议就是多点传送请求协议和多点传送宣布协议。这时,Discovery过程就进入了第三个阶段。 

  第三个阶段:此时Discovery实体和查找服务中有一个已经知道另一个的网络地址。这时双方就利用unicast 发现协议来进行通讯。协议的步骤如下: 

  第一步: 这一步有两个对等的过程。当查找服务的单点传送服务器收到Discovery实体的连接请求后,就建立了与Discovery实体的连接;或者是Discovery的单点传送服务器收到查找服务的连接请求,建立与查找服务的连接。两者之中那一个首先发起连接是等价的。双方都创建了一个线程来负责创建与对方服务器的连接。 

  第二步:当Discovery实体和查找服务建立连接后,由Discovery实体主动发送一个特定Discovery请求后,查找服务就把以后所需要用到的Java语言中的对象(帮助Discovery实体加入到查找服务中的对象)传给Discovery实体。 

  有时已经发现并加入系统的实体会再次使用发现协议。例如,一个实体需要确定特定的查找服务是否还在运行,或者关心是否有新的服务进入,以及其他诸如此类的问题。这时就会再次使用发现协议。 

  在Discovery实体的Discovery过程中,这三个发现协议互相协作。当实体启动的时候,使用多点传送请求协议来找到附近的查找服务;为了避免加重网络的负担,在经过一段时间后实体就会停止使用该协议,转变为利用多点传送宣布协议来收听查找服务的广播。在具体的实现中,这三个协议都是作为独立的线程来实现的,由Discovery实体来负责协调这三个线程的运行。 

  2.加入 

  Join协议向已经找到查找服务的服务提供了一系列应该遵循的标准步骤。当服务遵循这些步骤后就可以在查找服务中注册以加入Jini系统。值得注意的是,加入并不意味着简单的注册,而维持系统正确运行是加入的核心内容。 

  由于Jini系统是一个分布式系统,为了使系统在各种情况下正常运行,设计者对网络系统崩溃后系统的恢复和系统持久运行的能力特别重视。所以在实现时,Jini系统中的服务都保存了必须保存的永久状态信息。这些信息如下: 

  1)表示服务在Jini系统中的标识符。服务在不同的查找服务中注册的服务标识符是唯一的。 

  2)服务具备的属性。这些属性是Java语言中的对象。服务的属性描述了服务的状态。如果服务的状态改变了,那就必须修改属性以适应这个改变。为了保证Jini系统中状态的一致性,服务保存更改后的属性后,必须在每个已经注册的查找服务中做同样的更改。 

  3)一套服务想要加入的组的集合。 

  4)必须注册的特定的查找服务。对于这些查找服务,服务必须注册到该查找服务中,而不论查找服务所属的组是否服务希望加入的组。 

  每个服务都维持了一份它所注册过的查找服务的表和一份租约表。当服务在特定的查找服务中注册后,会得到一份租约,服务会分别把租约和这个查找服务加入到上述的表中。服务对租约定期续借来保证注册的有效性。如果服务需要退出特定的查找服务,服务就会取消和这个查找服务相关联的所有租约。由于租约机制的引入,使得不会出现系统资源不可回收的现象,增强了系统的鲁棒性。 

  每一个Jini设备通过实现DicoveryJoin协议,就可以随时随地加入或退出Jini系统,从而达到即插即用的效果。 

我的Visual C++入门之路——N次失败与1次成功

程序员之家 作者:不祥 日期:2004-4-1 9:59:00

 “N次失败,1次成功,还学的不怎么样……你也太笨了吧!如果您有这样的评价,那么祝贺您,您已经了解了我这人的99.9%N这个数字具体是多少连我自己也记不清楚,保守地讲(N≥6==TRUE)这个表达式是能够成立的。回想我的Visual C++入门过程,一路过来,绝对不是像黄飞鸿的功夫那样潇洒精彩,而更像是一颗石头顺流而下,在河床底摸爬滚打、磕磕碰碰。今天是周末,我就把以前N次失败留给我的经验教训胡写上几笔,如果有朋友看到这篇拙文,又刚好打算尝试一下Visual C++,也就算是我给您留下的莽原一径吧。 


.C++语言的基础
  说起入门慢,第一个原因莫过于语言基础了.高中时期学校组织的微机兴趣小组学习的是PASCAL语言(我也不知道为什么要讲这个语言,如果说是为了应付比赛,当时也有C语言组呀),所以在大学转向Windows编程的时候,我首先选择了Delphi.大三的时候学校要求考国家二级,二级没有Delphi,于是又转向了VB,原因是VB做起来与Delphi很像。后来发现VB的IDE做的比Delphi好用,而且BASIC语言写起来简单,于是便弃Delphi而去(明眼人恐怕又要骂我了,若不是太懒,怎么会喜欢VB的IDE呢?的确是这样,后文会提到,懒不仅仅是学习VC的大敌,而且懒人是什么都学不好的)。长年与VB打交道,让我对C/C++语言很不习惯——我不喜欢C++写一个句语要打一个分号,我不喜欢大小写字母要严格区分,我不喜欢比较的时候要写两个等号,我不喜欢……总之,对C++很没好感,没好感也就没兴趣学了(后面提到兴趣是相当重要的)。当然如果你现在再问我应该学习什么语言,我会毫不犹豫地向你推荐C++,因为就常用语言而言,C++语言中包含的知识是相当全面的——从面向过程,到基于对象/面向对象,再到模板和范型,可以说是应有尽有,不夸张地说,别的语言在某种程度上而言是C++语言的子集或者说是在模仿C++、向C++靠拢。
  在数次失败中,给我很明显的感觉就是,不学好C++语言就学习Visual C++纯粹是一种自虐。这次入门之前,我花了3个多月的时间系统地学习了C++语言,够意思吧。然后我信心实足地敲响Visual C++的家门,呵呵,这次她终于肯给面子了。举个例子吧,在看Dll的调用时,用到“函数指针”,顺理成章就看下去了,想一想如果没有C++语言的基础,基本是不可能的。所以说,没学会中文之前,别看《红楼梦》,那不是《看图识字》。奉劝想从VB转向VC学习的朋友,如果你指望能像学习VB一样边学习VC边学习C++语言,那你可就错了:)
  顺便提醒C++语言入门的朋友一点,应该关注ANSI/ISO C++,也就是标准C++了,市面上C++的书良莠不齐,很多书是“旧书换新皮”,讲的仍然是非标准C++,一定要选好。计算机书很贵,大家不妨找电子版的来看,网上有很多,甚至《C++ Primer》或者《C++沉思录》这样的好书也有热心朋友放到了网上。不过,我最喜欢的是《C++编程金典》这本书,不愧是教育大师写的书,用来学习很合适。至于编译器的选择,如果条件允许就安装VS.NET2003吧,据说Visual C++7.1的编译器是目前对标准C++支持的最好的编译器了。

.VC学习资料的选择
  VC入门难有很多原因,其中不容忽视的一个就是优秀的VC学习资相对较少。C++语言较深,Visual C++用起来复杂,再加上资料少——难上加难。资料少,并不意味着没有,怎样选择或者说挖掘就是关键。暂把资料分为光盘、书籍(包括电子书)和文档(包括网上的)三类。
  在选择资料方面,大家一定要摈弃中国人思想中的两大劣根性:<1>不劳而获<2>一夜暴富。
  “不劳而获”的思想会导致趋向于选择“讲课”类的资料,比如多媒体光盘。结果是光盘容量往往很少但又要求内容面面俱到(不然怎么卖出去呀),这就造成了知识的连贯性差而且讲的又飞快,任你一遍一遍地听,不见成效又打击信心,最后只能放弃。期待早日有内容丰富,讲解精彩的光盘面市。
  “一夜暴富”的思想会让你趋向于选择“速成”类教材。那样的教材大多是骗人的——能写个弹出窗口Hello一下World,这就能算是会Visual C++了?我们还是不要自欺欺人的好。至少也要能连数据库、能使用Socket吧……而这些知识怎么可能“速成”呢?
  我有很多Visual C++的学习资料,但没有一本我是抱着一啃到底的,因为没有哪本书十全十美,我是交替着使用些资料,这样做的好处在于:
<1>知识的连贯性好,跳跃性小,进阶坡度较小,读起来舒服。都说Visual C++的学习坡度比较陡,那个陡坡是出现在由单纯的C++语言学习转向Windows编程的时候,C++语言本身的学习并没有那么困难。
<2>有积累效应,这本书讲的不精不透,另一本书会帮你补上,这本书你没留心,下本书总该长个心眼吧。还有就是一些小例子程序,把MFC的类或者函数拆开来给你看,目的非常明确,效果也不错。每天学一点,不图快,图扎实。呵呵,跟VC搞“面向对象”,当然要一天一点恋爱了。
<3>举一返三,动手实践。如果多本书中都把它列为重点,那就一定要熟记在心而且上机操作,书上的例子一定要分析透彻,不能有“差不多”的思想——差多少算多呢?程序这东东,错一个字母都不行呀。光看会了还差远着呢,自己要能写,而且能对例子进行扩展才行。
<4>内容详实丰富,这一点上,首推MSDN啦,还有就是在网上能找到的微软出的Visual C++的丛书,希望译的电子版,是wdl格式的。虽然MSDN是英文版,但其中的英文并不难——您尽可以相信我,因为在下的英文水平是奇烂无比的。MSDN有两种用法,一种是当字典用,因为内容全;一种是当消遣,没事了看一个类,敲几行代码,看到那个MFC的继承图了吗,挺好玩儿的,感觉像逛街——而且东西不要钱,help yourself。
  互联网上的资源是非常非常丰富的,千万不要错过!好网站和下载站BB皆是。还有论坛、新闻组、在线QQ群……你问我有哪些?呵呵,远在天边近在眼前呀:)

三.内因与外因:三心二意高手朋友你有吗?
  啊哦,我不是在开玩笑。“三心”是指决心,信心和耐心。决心来源于动机,说来好笑,我最初动机很简单,大学时有个朋友,计算机系的,我总认为我比他聪明(我的天~~~~),他会VC我不会,我就想超过他,现在都毕业两年了,最初的动机早已经不在了,而学习却VC已经成了我的心愿——最关键的一点是我的愿望是写自己的输入法,而写输入法只能用Visual C++去实现,所以我会有决心学好Visual C++。至于信心,有两次失败完全是信心不足造成的,促成这次成功的信心说起来还挺传奇:我去北京玩儿,回家的火车上一姓赵位老师看见我别着一个MCP的领章就过来跟我聊天,得知他是一位有着十多年VC开发经验的程序员,敬意油然而生。聊天的过程中,赵老师给了我极大的鼓励和支持——我问他像我这种Wood Head能不能在半年内入门VC,他告诉我,一定能,于是我就坚定了自己的信心,现在刚好是4个月,如果赵老师有机会看到这篇文章——我在这里谢谢您啦!(花絮:下车,两个小时后我与女友分手了,是被甩呀同志们!随后的一段日子里,一直与VC相伴……) 还要说说耐心:如果您已经看到这里了,说明您很有耐心(竟然能看到这里还没有拂袖而去),耐心与个人的风格有关,没耐心的人多半是懒人,懒人什么都做不成,学习VC就是不能懒,书懒得看,问题懒得问,英语懒得译……或者是有点挫折就放弃,学好VC是没指望了。我不知道别人怎样,反正我是没少受挫,其实有两次离入门就那么一点点了,我放弃了……学VC要越挫越勇,学VC要肯定执着,Gogogo!
  “二意”是指第一你要感觉学习VC有“意思”,二是你要感觉学习VC有“意义”。有意思,就是说你喜欢写程序,“三心”的源动力来源于你对程序设计的热爱,不喜欢编程的人可能能学好VB但绝学不好VC。有意义,就是说你要给自己一个理由:自己都不能给自己一个交待的事情是做不长久的。前面说过,我是为了写自己的输入法,解放中国人的双手,这个理由够纯洁够崇高,还有一个理由就是通过学习VC来砺练自己,成为一个真正的程序员。你可以有自己的理由,比如提高薪水或者取得认证云云,一定要有!这就像是给自己的“报酬”,没有报酬只凭激情做事是任何事都做不长久的。
  我小小的成功,有严重的原因是因为我有位“高手朋友”——杨W,他是个VC高手,大家会好奇地问:他教你写什么呢?是MFC还是ATL或者是COM?呵呵,都不是,他从来没教我写过一行代码,但他对我的每一次帮助都弥足珍贵,当我不知道从哪里查找类库资源的时候,他告诉我:MSDN;当我不知道从哪里找到类的成员函数时,他告诉我:在页面的左下角有一个class member链接,当我问他能不能完成XXXX时,他说:别白费力气了……在他的帮助下,我少走了很多弯路,这也正是高手朋友的可贵之处。在此,我要衷心地说一声:谢谢!
  并不是每位学习VC的朋友都有我这么好的运气,如果你身边没有这样的朋友也不用着急吗,我这位好朋友可是经常出没于CSDN的坛坛里,明白了?不过,提醒与我一样的初学者:一定要做一个会问问题的人哦!怎么做一个会问题的人呢?概括一下就是:目的明确,言简意赅,核心代码,客气谦虚。

.VC入门随笔
  本人写东西向来思绪凌乱、颠三倒四。剩下好多东西不知道写到哪里,没办法了,只好叫“随笔”咯。
  ……学习VC编程,首先要竖立一个“系统/全局观”。无论是VB、C#、Delphi,写程序的时候只需要考虑程序本身就行了,换句话说就是你不用考虑消息是如何映射和传递的。而VC写程序就要多多少少考虑到这些东西。打个比方:以前用VB写程序,就好像是在一座山上建一个亭子,山是山,亭子是亭子,我只管造亭子就是了;而用VC写程序,还是这个亭子,那么你应该意识到,亭子是山的亭子,是山的一部分而不是一个孤立的建筑。“亭子”就是程序,“山”就是Windows系统,亭子的地基是山留给建筑的“接口”,也就是API了……
  ……VC相对VB入门难,一上来不是像VB那样给个窗体从头做起,而且AppWizard要分好几步,每一步里还有一大堆不知所云的选项,不等生成一个程序就已经晕头转向了。怎么办呢?一句话,从对话框程序入手,因为它最简单,生成的类最少,而且相对是与VB编程最“像”的。在对话框程序里,你可以充分练习添加类和成员变量或者成员函数。……不过我有一点始终搞不明白,由易到难是对话框程序、单文档程序、多文档程序,在AppWizard里微软为什么不按这个顺序排列,非要倒着来呢?成心跟我们这些初学的做对!(国骂省去)……
  ……又是没大写……又是少分号……又是少一个等号……提醒VB转过来的程序员,别总像我这么没记性哦!
  ……还是提醒那些学习了VB或者是VB.NET/C#的DDMM,MFC的类虽然是面向对象的,但它没有“属性”这个概念地!不要指望有Me.TextBox1.Text="Hello World!"这样的语法,C/C++是函数型的语言,类已经把“属性”封装成了成员变量,那些私有的成员变量你看不到,只能通过函数来更改——this->myTextBox.SetWindowText("Hello World!");……
  ……晕,原来Win32程序和MFC程序不是一回事呀(看看,这就是一本烂书带给我的,让我一直以为Win32程序就是MFC程序,直到拜读《深入浅出MFC》时才恍然大悟)……
  ……VC好还是VB好?(拜托,别再问这种无聊的问题了)……
  ……VC的确能做底层,但不是最底层;VC的确功能强大,但不是万能的——拿手术刀切西瓜或者用菜刀动手术都不对……
  ……VC高手都是用记事本写程序的:笑不笑由你……
  ……VC程序员比VB程序员强:呵呵,*说过,武器不是战争胜利的决定因素……
  ……在快速开发工具(RAD)中,控件与后台代码是捆绑在一起的,而MFC的“控件类”不一样,它的“资源”(或者说是皮)与“类”(或者说是瓤)是分开的,要通过ClassWizard把它们“粘”起来……
  ……如果说C++是一种程序设计语言,那么Visual C++中的C++语言不如叫“Windows语言”更合适——Visual C++就是在编程Windows,用到的宏或者Windows数据类型和Windows结构数不胜数,做好心理准备哦!……
  ……我的天,那么长的函数或者结构都要一个字母一个字母写呀!呵呵,按一下Ctrl+J看看发生了什么?我就奇怪了,几乎没看到有书上提醒我们的初学者要这样去做。这可是着实吓跑了不少初学者呢!(至少我就被吓跑过)。器利工善,我们要把IDE用熟哦,微软送的好礼物可不能浪费……
  ……很多书在添加完对新话框类之后都写着要在主对话框类里手动添加对这个新类头文件的引用,何必呢?用添加成员变量的方法添加这个新对话框类的实例,头文件自动引用,一举两得。一句话:尽量多用Class Wizard,能不手写的地方就不手写……

Jini和RMI开发中的codebase问题

codebase问题其实是一个怎样从网络上下载类的问题,我想不只是在JiniRMI程序开发中要用到。只要需要从网络上下载类,就要涉及到codebase问题。例如applet等。但是因为我对applet程序不是很熟悉,所以我就只谈JiniRMI,但我想codebase问题应该是通用的。

毫无疑问,对于大多数JiniRMI开发新手来说,如何使用codebase是比较容易令人迷惑的一件事。(我的一位师妹就很痛苦过,而且怀疑这个是不是sun的一个骗局:P)下面我就讲讲codebase要注意的几个方面,也就是容 易出问题的地方。

一、为什么需要codebase

当我们用一个对象作为远程方法调用的参数时,对象是以序列化流来传输到远端,然后在远端重新生成对象。这样就可能在两个Java虚拟机中交换对象了。但是序列化是这种传递对象的一部分。当你序列化对象时,你仅仅是把对象的成员数据转化成字节流,而实际实现该对象的代码却没有。也就是说,传递的只是数据部分,而做为控制逻辑的程序代码部分却没有被传递。

这就是RMI初学者容易误解的地方,我已经序列化对象了,而且对象也传过去了,怎么还说找不到呢。其实,对象数据的确过去了,不过找不到是类定义,这个并不是序列化传过去的,RMI协议是不传递代码的。但是,对于本地没有的类文件的对象,RMI提供了一些机制允许接收对象的一方去取回该对象的类代码。而到什么地方去取,这就需要 发送方设置codebase了。

二、什么是codebase

简单说,codebase就是远程装载类的路径。当对象发送者序列化对象时,会在序列化流中附加上codebase的信息。这个信息告诉接收方到什么地方寻找该对象的执行代码。

你要弄清楚哪个设置codebase,而哪个使用codebase。任何程序如果发送一个对方可能没有的新类对象时就要设置codebase(例如jdk的类对象,就不用设置codebase)。codebase实际上是一个url表,在该url下有接受方需要下载的类文件。如果你不设置codebase,那么你就不能把 一个对象传递给本地没有该对象类文件的程序。

三、怎样设置codebase

在大多数情况下,你可以在命令行上通过属性java.rmi.server.codebase来设置codebase。例如,如果你在机器url上运行web服务器,端口是8080,你所提供下载的类文件在webserver的根目录下。那么运行应用程序的java 命令行:
-Djava.rmi.server.codebase=http://url:8080/
这就是告诉任何接受对象的程序,如果本地没有类文件,可以从这个url下载。

四、类文件应该在什么地方

如上所示,当接收程序试图从urlwebserver上下载代码时,它会把对象的包名转化成目录,到相对于codebase的该目录下寻找(这点和classpath是一样的)。例如,如果你传递的是类文件yourgroup.project.bean的实例,那么接受方就会到下面的url去下载类文件:

-Djava.rmi.server.codebase=http://url:8080/yourgroup/project/bean.class

一定要保证你把类文件放到webserver根目录下的正确位置,这样这些类文件才能被找到。另一方面,如果你把所有的类文件包装成jar文件,那么设置codebase时就要明确的指出这个jar文件。(这又和classpath一致了,其实codebase就是网络范围的类路径。)例如你的jar文件是myclasses.jar,那么codebase 如下:
-Djava.rmi.server.codebase=http://url:8080/myclasses.jar

你注意这两种形式的不同。用jar文件后面不用跟‘/’,而用路径的一定用跟‘/’。

Codebase和安全问题

我们需要注意的是下载代码如何与Java的安全机制进行协调。本质上讲,codebase属性是应用程序在运行时动态地扩展自己classpath的一种方法。很明显,这会引起安全问题,你可能会下载一些不安全的类代码。所以一个Java程序如果要下载远程的类,必须安装安全管理器。如果没有安全管理器,一个Java程序只能在装载局部代码,并且忽略所接受到的codebase信息。大部分RMI程序需要从远端下载stub文件,而所有的Jini程序都需要下载服务代理。所以如果你不安装安全管理器,你就不能开发RMIJini程序。当你遇到安全例外的错误时,你最好检查以下自己的程序,是否安装了安全管理器。

开发时的问题

使用codebase经常出现的问题可能与我们的开发观念有关。我们许多人在安装我们的开发环境时都是尽可能的方便。也就是说,当开发分布式应用程序时,我们把客户端和服务端的程序放在同一目录下运行。这会产生许多问题,首先因为客户程序和服务程序都在本地,即使你没有正确的设置codebase属性,类文件也可以在本地的classpath装载进JVM。其次,你可能会忘记安装安全管理器,因为所有的类都可以在本地找到。

也就是说,我们这样开发,最大的弊端就是,我们不知道那些类是应该从远端下载的,因为所有的类在本地都找得到。这样你也许会发现你的程序在开发调试时运行的很正常,而一旦到了真正的运行环境,也就说分发到了一个分布式环境中时,就出现了许多问题。也就是我们所说的codebase,以及从网络上下载类的各种问题。我将在另一篇文章中讲如何安装你的开发环境来仿真多机环境。

一些常见的codebase错误

上面我们所讲的时codebase是怎么一回事,它是如何工作的。现在,我想讲几个JiniRMI开发者应该注意的几个问题。

1、在codebase中指定多个url:在一个单独的codebase中分隔多个url正确的方法是用空格。例如
-Djava.rmi.server.codebase="http://url:8080
http://url:8080/myclasses.jar"

2、不要使用带fileurl:如果你有一个可用的webserver,或者你不想以后运行时出现麻烦,建议你不要使用fileURL的形式作为一个codebase。我曾经看过一个讲codebase的例子,还使用file:形式,真的是有些误导读者。用file这种形式不是个好主意。因为如果服务器给客户传递一个file codebase,那么客户只会试图从本地文件系统装载类代码。如果你在同一台机器上开发和调试服务和客户程序,那么这是可以工作的。但是如果你在不同的机器上运行程序,就会出现问题。

codebase URL中不要使用localhostlocalhost是用来指定当前机器的。如果服务器设置的url中包含localhost,那么客户分析这个url,就会试图从自己的系统装载类文件。这和file一样是个不好的习惯。

开发RMI程序是不是需要一个webserver

有时我也怀疑为了开发RMI程序就安装一个webserver,是不是有点太夸张了。开发RMI程序是不是真的需要一个单独的webserver。其实codebase的设置是很灵活的。我们可以使用一个单独的webserver,来作为一个组成员的类文件下载的服务器。对于开发大型的RMI应用程序来说,这是不会有问题的。如果是个人开发的,现在在Jini开发时,sun公司提供了一个简单的webserverhttpd。这个是完全可以完成类文件下载的。