虚拟专网(×××)配置实例

  上篇文章介绍了网络地址转换NAT的配置方法,在远程接入方面还有一项技术比较常见,也比较流行,这就是虚拟专用网×××技术,在2004年该技术得到了飞速的发展。
  
  ×××是指利用internet或其他公共网络为用户建立一条临时的,安全的隧道,并提供与专用网络相同的安全和功能保障。×××是对企业内部网的扩展,他可以帮助远程用户,公司分支机构与公司内部网建立可信的安全连接,并保证数据的安全传输。
  
  当然×××技术的加密方式有很多种,目前最为安全的是IPSec加密技术,他可以实现数据通信的保密性,完整性和不可否认性。今天就由我为大家介绍通过IPSec加密技术构建×××。
  
  配置实例:
  公司在北京而分公司在上海,如果租用光纤业务费用会比较高,另外安全性也没有保证,特别是对内网的访问方面。我们要在总公司和分公司之间建立有效的 ×××连接。具体网络拓扑如图1所示。北京路由器名为RT-BJ,通过10.0.0.1/24接口和上海路由器连接,另一个接口连接北京公司内部的计算机 172.16.1.0/24;上海路由器名为RT-SH,通过10.0.0.2/24接口和总公司路由器连接,另一个接口连接分公司内部的计算机 172.16.2.0/24。
  
  配置命令:
  
  总公司路由器:
  
  crypto isakmp policy 1  创建ISAKMP策略,优先级为1
  
  encryption des  指定ISAKMP策略使用DES进行加密
  
  hash sha  指定ISAKMP策略使用MD5进行HASH运算
  
  authentication pro-share  指定ISAKMP策略使用预共享密钥的方式对上海分公司路由器进行身份验证。
  
  group 1  指定ISAKMP策略使用10位密钥算法
  
  lifetime 28800  指定ISAKMP策略创建的ISAKMP SA的有效期为28800秒,默认为86400秒。
  
  crypto isakmp identity address  指定ISAKMP与分部路由器进行身份认证时使用IP地址作为标志。
  
  crypto isakmp key cisco123 address 10.0.0.2  指定ISAKMP与分部路由器进行身份认证时使用预共享密钥。
  
  crypto ipsec transform-set bjset esp-des esp-md5-hmac  配置IPSec交换集
  
  crypto map bjmap 1 ipsec-isakmp  创建加密图
  
  set peer 10.0.0.2  指定加密图用于分支路由器建立×××连接
  
  set transform-set bjset  指定加密图使用的IPSec交换集。
  
  match address 101  指定使用此加密图进行加密的通信,用访问控制列表来定义
  
  int fa0/0
  ip address 172.16.1.1 255.255.255.0
  
  设置内网接口
  
  int s0/0
  ip address 10.0.0.1 255.255.255.0
  no ip mroute-cache
  no fair-queue
  clockrate 64000
  crypto map bjmap
  
  设置外网接口并指定在该接口上应用配置好的加密图
  
  access-list 101 permit ip 172.16.1.0 0.0.0.255 172.16.2.0 0.0.0.255
  access-list 101 permit ip 172.16.2.0 0.0.0.255 172.16.1.0 0.0.0.255
  
  配置访问控制列表指定需要加密的通信
  
  上海分公司路由器:
  
  在总部上设置完后还需要在上海分公司进行设置,只有双方在加密等协议方面统一了标准才能正常通讯。
  
  crypto isakmp policy 1  创建ISAKMP策略,优先级为1
  
  encryption des
  
  指定ISAKMP策略使用DES进行加密
  
  hash sha  指定ISAKMP策略使用MD5进行HASH运算
  
  authentication pre-share  指定ISAKMP策略使用预共享密钥的方式对北京总公司路由器进行身份验证
  
  group 1  指定ISAKMP策略使用10位密钥的算法
  
  lifetime 28800  指定ISAKMP策略创建的ISAKMP SA的有效期为28800秒。默认为86400秒。
  
  crypto isakmp identity address  指定ISAKMP与总部路由器进行身份验证时使用IP地址作为标识。
  
  crypto isakmp key cisco123 address 10.0.0.1  指定ISAKMP与总部路由器进行身份认证时使用预共享密钥。
  
  crypto ipsec transform-set shset esp-des esp-md5-hmac  配置IPSec交换集。
  
  crypto map shmap 1 ipsec-isakmp  创建一个加密图,序号为1,使用ISAKMP协商创建SA
  set peer 10.0.0.1
  
  指定加密图用于上海分公司路由器建立×××连接
  
  set transform-set shset  指定加密图使用IPSEC交换集
  
  match address 101  指定使用此加密图进行加密的通信,通过访问控制列表来定义
  
  int fa0/0
  ip address 172.16.2.1 255.255.255.0
  
  设置内网接口信息
  
  int s0/0
  ip address 10.0.0.2 255.255.255.0
  no ip mroute-cache
  no fair-queue
  clockrate 64000
  
  设置外网接口信息
  
  crypto map shmap  指定在外网接口应用加密图
  
  access-list 101 permit ip 172.16.1.0 0.0.0.255 172.16.2.0 0.0.0.255
  access-list 101 permit ip 172.16.2.0 0.0.0.255 172.16.1.0 0.0.0.255
  
  设置访问控制列表101指定需要加密的通信
  
  总结:在总公司和分公司的路由器按照上面介绍的命令设置完毕后,两个公司之间就建立了×××连接,在上海分公司访问总公司内部计算机就好象访问自己内部网络中的计算机一样简单方便,通过网络传输的数据使用了IPSec技术进行加密,任何***使用诸如sniffer监听到的信息都是加密的,从而安全性得到了保证。
posted @ 2006-04-15 23:08 ahuo 阅读(6) | 评论 (0) | 编辑 收藏
 
手把手指南:教你如何架设×××

  简介
  
  让远程用户连接Exchange Server的传统解决方案是使用Outlook Web Access.然而,为何不使用虚拟专用网(Virtual Private Network,×××)让你的远程用户与你的Exchange连接在一起呢?
  
  如果你不熟悉×××,我将向你介绍,×××是穿越不安全的网络,譬如Internet的一个逻辑的、安全的网络连接。远程用户能够通过他们的已经存在的 Internet连接,安全地连接进入你的网络,就像他们亲自在办公室中一样。另外一个优势是,×××是交换独立的,这意味着你能够使用×××连接访问 Exchange Server,而不用考虑版本问题,并且你还可以使用×××连接访问其它网络资源。
  
  ×××技术对机构和很多远程用户来说,是极端有用的,但在设定上,它可能有些复杂。下面的指南将手把手的教你如何建立×××,它包含各个步骤详细的操作流程。
  
  第一步:系统需求
  
  ×××分为两种,一种是硬件解决方案,一种是软件解决方案,在这个手把手的指南中,我将介绍一种软件解决方案,即使用Microsoft产品建立×××.
  
  为了架设×××,你将需要三个独立的Windows 2003服务器和至少一个远程用户,远程用户的机器上需要运行Windows XP操作系统。
  
  你的×××需要的第一台Windows 2003服务器是一台基本的基础设施服务器,它必须作为一台域控制器(domain controller),DHCP服务器(DHCP server),DNS服务器(DNS Server)和认证中心(certificate authority)。如果你的网络中已经有一台Windows 2003服务器,你就不需要去购买一台服务器担当此角色。
  
  任何 Windows 2003域都至少有一台域控制器和一台作为DNS的服务器,多数Windows 2003网络同时运行DHCP服务。如果你所有的这些服务已经到位,你所关心的唯一的事情就是设置一个认证中心(我将在第三步为你说明如何做这件事情)。下载,你只需知道作为认证中心的那台服务器必需运行Windows Server 2003 Enterprise Edition操作系统。
  
  你需要的第二台服务器将是×××服务器(××× server),Windows Server 2003 Standard Edition和Enterprise Edition都提供了×××服务器的必要软件,因此,你不需要在这台服务器上安装任何特别的软件。唯一特别的是硬件上,这台服务器需要双网卡,一块网卡连接Internet,另一块网卡则连接你的专用企业网络。
  
  你需要的最后一台服务器将是认证服务器(authentication server)。当远程用户通过×××尝试进入你的企业网络时,他们必需通过认证。远程用户认证的机制可以选择RADIUS服务器(RADIUS server),RADIUS 是Remote Authentication Dial In User Service(远程身份验证拨入用户服务)的首字母缩写。在Windows Server 2003 Standard Edition和Enterprise Edition中,包含有微软自有版本的RADIUS.微软的RADIUS叫做Internet验证服务(Internet Authentication Service,IAS),对这台服务器来说,没有特殊的硬件和软件要求。
  
  在这一部分,最后我想说的是服务器的安置问题。任何一台我谈论到的服务器都将通过Hub或交换机接入你的专用网络,唯一与外界连接的服务器是你的×××服务器,但将×××服务器直接与Internet连接将会带来安全风险,因此,在×××服务器的前面放置一台防火墙是很好的解决办法,你可以用它过滤掉除了×××通讯外所有其它的信息。
  
  在第二步,我们将开始配置域的过程,所以在进入下一步之前,你的网络中必需包含必需的Windows 2003域控制器和DNS服务器。
  
  第二步:实施DHCP服务
  
  1.打开服务器的控制面板,选择“添加或删除程序”。
  
  2.当“添加或删除程序”对话框出现时,点击“添加/删除Windows组件”按钮。
  
  3.在弹出的窗口中,选择“网络服务”,按下“详细信息”。
  
  4.现在从网络服务列表中选择“动态主机配置协议(DHCP)”,然后单击“确定”,进行下一步操作。
  
  Windows现在将安装DHCP服务,安装结束后,你将要创建一个地址范围,并且启动DHCP服务器,在你的网络上运行。
  
  5.为了做到这些,请在控制面板――管理工具中选择动态主机配置协议(DHCP)配置,打开DHCP管理器。
  
  6.在DHCP管理器中你的服务器上单击右键,选择启动(Authorize)。
  
  7.启动DHCP服务器后,在DHCP管理器的服务器列表窗口中单击右键,选择“新建作用域(New Scope)”,这将启动新建作用域向导。
  
  8.点击下一步略过向导的欢迎界面。
  
  9.输入你正在创建的作用域的名称,并且点击下一步。(你可以输入任何你想到的名称,但在这个教程中,我将命名此作用域为“Corporate Network”。)
  
  10.现在你将需要填入IP地址范围。在这里只需输入你已经使用的起始IP地址和结束IP地址,但注意不要与已经存在的IP地址冲突。长度和子网掩码部分则会自动输入,不需要你的干涉,当然,你也可以手动调节这两者的值。
  
  11.接下来的三个画面包括一些你不必关心的设置,连续三次点击下一步,直到你进入“路由(默认网关)(Router (Default Gateway))”界面。
  
  12.输入你网络网关的IP地址,点击添加,然后下一步。
  
  13.输入你的域的名称和你的DHCP服务器的IP地址(IP address of your DHCP server),然后点击下一步。
  
  14.单击下一步略过WINS配置窗口。
  
  15.最后,根据提示选“是,我想激活作用域(Yes, I Want To Activate The Scope Now)”再点击“完成”即可结束最后设置。
  
  第三步:创建一个企业认证中心
  
  在我向你讲述如何创建一个企业认证中心之前,我将告诉你几个必需注意的事项。安装认证中心并不是一个轻松的过程,如果一个未经授权的用户进入了你的认证中心,他将几乎控制你的所有网络。同样,如果认证中心服务器当机,它可能对给你的网络带来毁灭性的破坏。
  
  所以,一定要像保护×××一样保护你的认证中心,确保认证中心尽可能的安全,并频繁的做好全系统的备份,你还需要保护这些备份,以防止它们偶然地出现问题。下面是创建企业认证中心的具体过程。
  
  1. 打开服务器的控制面板,选择“添加或删除程序”,点击其中的“添加/删除Windows组件”按钮。
  
  2.选择Windows组件中的“证书服务”。
  
  3.你将会看到一个警告窗口,上面的信息为:“安装证书服务后,计算机名和域成员身份都不能更改,因为计算机名到CA信息的绑定存储在Active Directory中。更改计算机名或域成员身份将使此CA颁发的证书无效。在安装证书服务前请确认配置了正确的计算机名和域成员身份。您想继续吗?”点击“是”,接受这一警告信息,并点击“下一步”,开始安装证书服务。
  
  4.选择“独立根CA”作为你想安装的CA类型,并点击下一步。
  
  在这里,为自己的CA服务器取个名字,设置证书的有效期限。默认的证书有效期限为5年,不过你可以通过企业安全策略来增加或减少此有效期限。
  
  5.填写好这两个文本框,点击下一步,Windows将开始生成加密密钥。
  
  6.最后指定证书数据库和证书数据库日志的位置,按照默认即可,除非你自己想更换路径,然后点击下一步。
  
  7.现在将出现一则消息,提示Windows必需重新启动IIS服务,才能够让证书服务正常运行。点击“是”,Windows将安装必要的组件。
  
  第四步:安装Internet验证服务
  
  Internet验证服务是Windows Server 2003实施RADIUS的一种服务,Internet验证服务将认证那些通过×××连接进入你的企业网络的用户,因此,你的Internet验证服务器必需是你的域服务器中的一员,并且运行Windows Server 2003操作系统。为了正确安装IAS,请遵循以下的步骤:
  
  1.定位到开始 | 设置 | 控制面板(Start| Settings | Control Panel)。
  
  2.双击添加或删除程序(Add/Remove Programs)。
  
  3.选择添加/删除Windows组件(Add/Remove Windows Components)。
  
  4.在组件列表中,选择网络服务(Networking Services),并点击详细内容。
  
  5.选择Internet验证服务(Internet Authentication Service)的确认框,然后点击OK,并点击下一步。
  
  完成安装之后,系统中将具有用于因特网认证服务的管理工具的一个新的连接。接着,你必须为每一台机器设置一个客户端,并指定一个远距离访问规范以控制访问。
  
  第五步:配置Internet验证服务
  
  1.进入管理工具(Administrative Tools)-> Internet验证服务(Internet Authentication Service)。
  
  2.在这里,你需要做的第一件事情是在活动目录(Active Directory)中注册你的Internet验证服务器。为了做到这些,请在Internet验证服务器(本地)(Internet Authentication Service (Local))容器上单击右键,选择在活动目录中注册服务器(Register Server in Active Directory)。
  
  3.点击确定完成注册过程。
  
  4.现在,在RADIUS客户(RADIUS Clients)容器上单击右键,选择新RADIUS客户(RADIUS Clients)。如果你正好直到你某台客户端机器的IP地址或DNS名称,继续下去,输入一个友好的名字。否则,暂时将它留空,在随后的设置客户端连接时再进行填写。
  
  5.点击下一步。
  
  6.此时,会提示你输入一个共享的密钥。共享密钥是RADIUS服务器和客户端同时使用的密钥,确定客户端供应商选项设置为RADIUS标准,输入一个共享密钥值,点击完成。
  
  第六步:创建远程访问策略
  
  1. 在Internet验证服务控制台,右击远程访问策略(Remote Access Policies)容器,选择新建远程访问策略(New Remote Access Policy)选项,这将启动新建远程访问策略向导。
  
  2. 在欢迎使用新建远程访问策略向导页,点击下一步。
  
  3.在策略配置方式页,选择使用向导为通用环境建立典型的策略(Typical Policy for a Common Scenario)选项,在策略名字文本框中输入一个名字,在此我们命名为“××× Access”,点击下一步。
  
  4.在访问方式页,选择××× 选项,然后点击Next.
  
  5.在访问的组或者用户页,选择组或用户,然后点击添加。如果你还没有做这一步,我建议你花一些事件创建一个建立在能够通过×××访问网络的用户纸上的活动目录组,然后将这个组添加进入策略。
  
  6.点击下一步,进入认证方法窗口。
  
  7.确认选择了“Microsoft Encrypted Authentication version 2 (MS CHAPV2) ”,然后点击下一步。
  
  8.在策略加密级别页,确认只选择了“Strong encryption”选项,随后点击下一步,根据向导,在完成新建远程访问策略向导页点击完成。
  
  第七步:配置×××服务器
  
  1.开始,请打开服务器的网络连接(Network Connections)目录,并将连接重命名为有意义的名字,例如,你可以将连接命名为企业和Internet,或者其它你喜欢的名字。
  
  2.进入管理工具(Administrative Tools)->路由和远程访问(Routing and Remote Access),打开路由和远程访问管理器。
  
  3.在管理器目录数中,右键单击你的×××服务器,选择配置和启用路由和远程访问(Configure and Enable Routing and Remote Access),这将载入路由和远程访问服务器设置向导(Routing and Remote Access Server Setup Wizard)。
  
  4.点击下一步,略过向导的欢迎页面,然后你将看到向导的配置窗口。
  
  5.选择远程访问(拨号或×××)Remote Access (Dial-Up or ×××),然后点击下一步。
  
  6.选中×××前面的复选框,点击下一步。
  
  7.现在,你将看到一个窗口,此窗口中显示有你的机器的网络连接。选择连接Internet的那个连接,确认启用安全(Enable Security)复选框被选择,然后单击下一步。
  
  8.确认选中了自动(Automatically),并点击下一步。
  
  9.现在,在选项中选择和设置跟RADIUS服务器一起工作的服务器,并单击下一步。
  
  10.输入你的RADIUS服务器的IP地址,和你为RADIUS服务器分配的共享密钥信息。
  
  11.点击下一步,点击完成。
  
  第八步:使×××服务器和DHCP服务器关联起来
  
  1.在路由和远程访问控制台目录数中指向你的服务器->IP路由(IP Routing)->DCHP中继代理(DHCP Relay Agent)。
  
  2.在DHCP中继代理上单击右键,选择属性(Properties)。
  
  3.输入你的DHCP服务器的IP地址,点击添加,然后再单击确定。
  
  现在你的×××服务器已经配置好了。万事俱备,剩下的唯一要做的就是配置你的客户端,使它们与你刚刚创建的×××服务协同工作。
  
  第九步:配置远程客户端
  
  你应该可以记起,我们必需为那些能够通过×××访问企业内部网络的用户创建一个特别的安全组。所以,我假设你的远程用户已经被加入必要的组,并且客户端的计算机已经接入了Internet.
  
  允许一台运行Windows XP操作系统的客户端计算机访问你的专用网络,就必需告诉它们如何使用×××连接。
  
  1.为了做到这些,请打开控制面板(Control Panel),选择网络和Internet连接(Network and Internet Connections)选项。
  
  2.创建一个新连接,在向导中选择连接到我的工作场所的网络(Connection to the Network At Your Workplace)选项。
  
  3.Windows现在将询问你,想创建一个拨号连接(dial-up connection),还是一个虚拟专用网络连接(××× connection)。选择虚拟专用网络连接,点击下一步。
  
  4.在这一步,你将看到公司名的项目,你能够在这里输入你公司的名字,你连接的服务器的名字,或者其它你用来描述连接的东西。
  
  5.点击下一步,你将被要求输入你正连接的计算机的主机名或IP地址,请填入你的×××服务器的外网IP地址(即连接进入Internet的IP地址)。
  
  6.再次单击下一步 ,根据向导最后完成你的×××连接创建。
  
  第十步:测试客户端连接
  
  1.双击可用连接列表中的×××连接。
  
  2.你将被要求输入用户名和密码。为了更好的使用×××连接,我们还需要进行一些设置,因此请点击此界面中的属性(Properties)按钮。
  
  3.在属性窗口中,选择网络(Networking)标签。
  
  4.选择×××类型为PPTP ×××,按下确定按钮。
  
  5.现在你将回到×××连接登陆窗口,以domain/username格式输入你的用户名 .
  
  6.然后输入你的密码,点击连接(Connect)。
  
  7.这里可能会提供一个机会,让你选择想连接那个网络。如果有提示,选择局域网连接(LAN Connection)选项。
  
  8.一旦连接建立,请在开始->运行中输入\\servername\ROOT命令。
  
  你应该可以看到你的服务器的C盘的内容(假设你有相应的权限)。当然,这种直接访问服务器C盘的方式非常罕见,多数情况下,你只能访问服务器上的特定共享资源,而要做到这些,你应该在开始->运行中输入\\servername\sharename.
posted @ 2006-04-15 23:07 ahuo 阅读(5) | 评论 (0) | 编辑 收藏
 
2006年4月6日
route命令范例
范例
  要显示 IP 路由表的完整内容,请键入:

  route print

  要显示 IP 路由表中以 10. 开始的路由,请键入:

  route print 10.*

  要添加默认网关地址为 192.168.12.1 的默认路由,请键入:

  route add 0.0.0.0 mask 0.0.0.0 192.168.12.1

  要添加目标为 10.41.0.0,子网掩码为 255.255.0.0,下一个跃点地址为 10.27.0.1 的路由,请键入:

  route add 10.41.0.0 mask 255.255.0.0 10.27.0.1

  要添加目标为 10.41.0.0,子网掩码为 255.255.0.0,下一个跃点地址为 10.27.0.1 的永久路由,请键入:

  route -p add 10.41.0.0 mask 255.255.0.0 10.27.0.1

  要添加目标为 10.41.0.0,子网掩码为 255.255.0.0,下一个跃点地址为 10.27.0.1,跃点数为 7 的路由,请键入:

  route add 10.41.0.0 mask 255.255.0.0 10.27.0.1 metric 7

  要添加目标为 10.41.0.0,子网掩码为 255.255.0.0,下一个跃点地址为 10.27.0.1,接口索引为 0x3 的路由,请键入:

  route add 10.41.0.0 mask 255.255.0.0 10.27.0.1 if 0x3

  要删除目标为 10.41.0.0,子网掩码为 255.255.0.0 的路由,请键入:

  route delete 10.41.0.0 mask 255.255.0.0

  要删除 IP 路由表中以 10. 开始的所有路由,请键入:

  route delete 10.*

  要将目标为 10.41.0.0,子网掩码为 255.255.0.0 的路由的下一个跃点地址由 10.27.0.1 更改为 10.27.0.25,请键入:

  route change 10.41.0.0 mask 255.255.0.0 10.27.0.25
posted @ 2006-04-06 23:13 ahuo 阅读(4) | 评论 (0) | 编辑 收藏
 
nbtstat命令详解

NBTSTAT命令可以用来查询涉及到NetBIOS信息的网络机器。另外,它还可以用来消除NetBIOS高速缓存器和预加载LMHOSTS文件。这个命令在进行安全检查时非常有用。
用法:nbtstat [-a RemoteName] [-A IP_address] [-c] [-n] [-R] [-r] [-S]
[-s]
[interval]
参数-a列出为其主机名提供的远程计算机名字表。
-A列出为其IP地址提供的远程计算机名字表。
-c列出包括了IP地址的远程名字高速缓存器。
-n列出本地NetBIOS名字。
-r列出通过广播和WINS解析的名字。
-R消除和重新加载远程高速缓存器名字表。
-S列出有目的地IP地址的会话表。
-s列出会话表对话。
NBTSTAT生成的列标题具有以下含义:
Input
接收到的字节数。
Output
发出的字节数。
In/Out
无论是从计算机(出站)还是从另一个系统连接到本地计算机(入站)。
Life
在计算机消除名字表高速缓存表目前“度过”的时间。
Local Name
为连接提供的本地NetBIOS名字。
Remote Host
远程主机的名字或IP地址。
Type
一个名字可以具备两个类型之一:unique or group
在16个字符的NetBIOS名中,最后一个字节往往有具体含义,因为同一个名可以在同一台计算机上出现多次。这表明该名字的最后一个字节被转换成了16进制。
State
NetBIOS连接将在下列“状态”(任何一个)中显示:
状态含义:
Accepting: 进入连接正在进行中。
Associated: 连接的端点已经建立,计算机已经与IP地址联系起来。
Connected: 这是一个好的状态!它表明您被连接到远程资源上。
Connecting: 您的会话试着解析目的地资源的名字-IP地址映射。
Disconnected: 您的计算机请求断开,并等待远程计算机作出这样的反应。
Disconnecting: 您的连接正在结束。
Idle: 远程计算机在当前会话中已经打开,但现在没有接受连接。
Inbound: 入站会话试着连接。
Listening: 远程计算机可用。
Outbound: 您的会话正在建立TCP连接。
Reconnecting: 如果第一次连接失败,就会显示这个状态,表示试着重新连接.

下面是一台机器的NBTSTAT反应样本:
C:\>nbtstat CA x.x.x.x
NetBIOS Remote Machine Name Table
Name Type Status

DATARAT <00> UNIQUE Registered
R9LABS <00> GROUP Registered
DATARAT <20> UNIQUE Registered
DATARAT <03> UNIQUE Registered
GHOST <03> UNIFQUE Registered
DATARAT <01> UNIQUE Registered
MAC Address = 00-00-00-00-00-00

您通过下表能掌握有关该机器的哪些知识呢?
名称编号类型的使用:
00 U 工作站服务
01 U 邮件服务
\\_M好好学习ROWSE_ 01 G 主浏览器
03 U 邮件服务
06 U RAS服务器服务
1F U NetDDE服务
20 U 文件服务器服务
21 U RAS客户机服务
22 U Exchange Interchange
23 U Exchange Store
24 U Exchange Directory
30 U 调制解调器共享服务器服务
31 U 调制解调器共享客户机服务
43 U SMS客户机远程控制
44 U SMS管理远程控制工具
45 U SMS客户机远程聊天
46 U SMS客户机远程传输
4C U DEC Pathworks TCP/IP服务
52 U DEC Pathworks TCP/IP服务
87 U Exchange MTA
6A U Exchange IMC
BE U网络监控代理
BF U网络监控应用
03 U邮件服务
00 G域名
1B U域主浏览器
1C G域控制器
1D U主浏览器
1E G浏览器服务选择
1C G Internet信息服务器
00 U Internet信息服务器
[2B] U Lotus Notes服务器
IRISMULTICAST [2F] G Lotus Notes
IRISNAMESERVER [33] G Lotus Notes
Forte_$ND800ZA [20] U DCA Irmalan网关服务
Unique (U): 该名字可能只有一个分配给它的IP地址。在网络设备上,一个要注册的名字
可以出现多次,但其后缀是唯一的,从而使整个名字是唯一的。
Group (G): 一个正常的群;一个名字可以有很多个IP地址。
Multihomed (M): 该名字是唯一的,但由于在同一台计算机上有多个网络接口,
这个配置可允许注册。这些地址的最大编号是25。
Internet Group (I): 这是用来管理WinNT域名的组名字的特殊配置。
Domain Name (D): NT 4.0提供的新内容。
网络***者可以通过上表和从nbtstat获得的输出信息开始收集有关您的机器的信息
posted @ 2006-04-06 23:01 ahuo 阅读(6) | 评论 (0) | 编辑 收藏
 
Java 高层网络编程

Java高层网络编程

Qusay H. Mahmoud 著 2002-11-14
边城狂人 译 2002-12-10

 
基于 HTTP 的应用程序

  java.net 包中的类和接口提供了可用于低层和高层网络编程的 API。低层 API 可以让你直接访问网络协议,但是为此你不得不使用低层的 TCP 套接字和 UDP 数据包。高层的 API (如 URL, URLConnection 和 httpURLConnection 等类) 可以使你更快的开发网络应用,却不需要写很多代码。

  另一篇文章, java.sun.com/features/2002/08/j2se-network.html">《Network Programming with J2SE 1.4》会告诉你如何使用低层的套接字进行网络编程。这篇文章的重点则放在如何使用 java.net 包中的高层 API 开发基于 HTTP 的应用程序。

  这篇文章将有如下内容:
概览 HTTP 概览 java.net 包的高层 API 示例说明如何使用高层 API 制作一个可以下载股票行情的应用程序演示如何提交数据到网页服务器 概览 HTTP 的验证并展示如何保护你的网络资源 提供代码实例演示如何执行 HTTP 的验证

 
概览 HTTP

  超文本传输协议 (Hypertext Transfer Protocol, HTTP) 是一个“请求-回应”的应用协议。这个协议支持一套固定的方法如 GET、POST、PUT、DELETE 等。一般用 GET 方法向服务器请求资源。这里有两个 GET 请求的例子:
GET / HTTP/1.1
GET /names.html HTTP/1.1

  另外,你可以使用 GET 和 POST 方法向服务器发送数据,它们向服务器发送数据的方式是不同的:
GET 方法:输入的数据将作为 URL 的一部分发送 POST 方法:输入数据作为一个独立的实体发送

  考虑一下下面的 HTML 表单:

Student#:


  这个表单会提交到 http://www.javacourses.com/servlet/getMarks 由 Servlet 处理。该表单使用了 GET 方法来传输信息。如果用户输入一个学号——比如 556677——并点击 GetMarks 按钮,表单数据就会作为 URL 的一部分传送到 Servlet 中。经过编码之后的 URL 就是:http://www.javacourses.com/servlets/getMarks?number=556677。

  在使用 POST 方法的情况下,传输数据时不会将数据作为 URL 的一部分;它们会作为一个独立的实体来传输。因此,POST 方法更安全,你也可以用这个方法传输更多的数据。而且用 POST 传输的数据不一定要是文本,用 GET 方法传输的却一定要是文本。
消息息格式

  请求消息指定了方法名称 (GET 或者 POST)、URL、协议版本号、头部消息和可选消息。头部消息也许会包含请求信息和客户端信息,如接受的内容类型、浏览器名称以及验证数据。返回消息指定了协议版本、响应代码和原因。不管执行是否成功,响应代码和原因都会报告。一些响应代码如下:
200 OK: Request succeeded. The requested resource can be found later in this message.
301 Moved Permanently: Requested resource has moved. New location is specified later in this message.
400 Bad Request: Request message is not understood by the server.
404 Not Found: Requested document is not found on this server.

  关于 HTTP 和所有返回代码的信息可以在 HTTP 1.1 规范 RFC2616 中找到。

  下面是一个请求消息由浏览器到服务器的例子。这里请求的 URL 是 http://java.sun.com:
GET / HTTP/1.1
Accept: p_w_picpath/gif, p_w_picpath/x-xbitmap, p_w_picpath/jpeg, p_w_picpath/pjpeg,
application/vnd.ms-powerpoint, application/vnd.ms-excel,
application/msword, */*
Accept-Language: en-ca
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows 98; YComp 5.0.0.0)
Host: java.sun.com
Connection: Keep-Alive
Cookie: SUN_ID=24.80.19.177:28346100732290;
SunONEUserId=24.80.19.177:86521021960770

  然后这里是服务器对这个请求的回复消息:
HTTP/1.1 200 OK
Server: Netscape-Enterprise/6.0
Date: Mon, 14 Oct 2002 15:18:04 GMT
Content-type: text/html
Connection: close

 
概览 java.net 包的高层 API

  java.net 包中含有高层 API。它们实现了一些最常用的基于 TCP 的协议,如 HTTP 和 FTP 等。其中两个主要的类是 URL 和 URLConnection。另一个有用的类是 HttpURLConnection,它是 URLConnection 的子类,支持 HTTP 的特性。

  URL (Uniform Resource Locator,统一资源定位器) 是一个描述 Internet 中文档 (或者其它常见的资源) 位置的地址。URL 的样子就像这样:
protocol://machineName:port/resource

  注意 URL 类不是基于 HTTP 的,这一点非常重要。它支持 FTP、HTTPS 和 FILE 协议。所以,对于 URL 类来说,下面所有 URL 都是有效的。
http://java.sun.com
http://localhost:8080/myApplication
http://www.yahoo.com/index.html
http://www.yahoo.com
ftp://ftp.borland.com
ftp://ftp.sun.com
https://www.scotiaonline.scotiabank.com
https://central.sun.net
file:///C:/j2sdk1.4/docs/api/index.html

  你在浏览器里输入一个 URL 的时候,浏览器产生一个 HTTP GET (或者 POST) 命令寻找 (或者查询) URL 请求的资源。如果没有指定要查询的的资源,被查询的就会是默认文档 (通常是 index.html)。
读取 URL 的内容

  让我们以一个简单的应用程序开始,它将会直接从 URL 读取内容。不妨先尝试一下使用低层的套接字来读取,请看示例代码 1。在这个例子中,用户在命令行输入资源的 URL,然后在 80 端口 (默认的 HTTP 服务器端口号) 打开一个套接字并建立相应的输入输出流。输出流用来向 HTTP 服务器发送 HTTP 命令 (比如 GET),输入流则用来读取 HTTP 服务器的返馈。注意,在这个例子中,服务器回应的头信息也会被读入 (这是 URL 内容之外的东西)。

  示例代码 1: ReadURL1.java
import java.net.*;import java.io.*;public class ReadURL1 { public static void main(String argv[]) throws Exception { final int HTTP_PORT = 80; if(argv.length != 1) { System.out.println("Usage: java ReadURL1 "); System.exit(0); } Socket socket = new Socket(argv[0], HTTP_PORT); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out.write("GET /index.html HTTP/1.0\n\n"); out.flush(); String line; StringBuffer sb = new StringBuffer(); while((line = in.readLine()) != null) { sb.append(line); } out.close(); in.close(); System.out.println(sb.toString()); }}// end code

  你运行这个例子的时候请注意,URL 必须是一个域名如 java.sun.com 或者 IP 地址。不能加上 http:// 作为 URL 的一部分。如果你要解决这个问题,你就得解析输入的内容并找出它使用什么协议,端口号和要请求什么资源。你也可以使用 URL 类,它提供了一些非常有用的方法,如 getProtocal、getPort、getHost 和 getFile 等。
使用 URL 类

  要从 URL 读取内容,可以用 URL 类非常容易的实现,就像示例代码 2 所展示的那样。这使得直接从 URL 读取内容变得简单。用这种方法读取的内容不包含服务器回应的头信息,所以不需要你去解析它们了。运行这个例子时要输入有效的 URL ,就像 protocol://domainName:port/resource 这样。URL 类会解析输入的 URL 并处理低层的麻烦的工作。

  示例代码 2:ReadURL2.java
import java.net.*;import java.io.*;public class ReadURL2 { public static void main(String argv[]) throws Exception { if(argv.length != 1) { System.out.println("Usage: java ReadURL2 "); System.exit(0); } URL url = new URL(argv[0]); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); String line; StringBuffer sb = new StringBuffer(); while ((line = in.readLine()) != null) { sb.append(line); } in.close(); System.out.println(sb.toString()); }}

  在你运行 ReadURL2 的时候,你会看到你输入的 URL 所请求的文档内容命令窗口中显示出来。

  如果你想做除了读取之外的其它事情,请使用 openConnection 来建立到 URL 的连接。这个方法返回一个 URLConnection 对象,你可以用这个对象来与 URL 通信,如读、写、查询等。一但 openConnetion 方法创建了连接,你就可以使用 getContentType、getContentLength、getContentEncoding 等非常有用的方法了。
使用 URLConnection 类

  我们现在要创建一个从 http://quote.yahoo.com 获取股票信息的应用程序来演示如何使用 URLConnection。为了获取特别的股票信息,用户输入股票标号 (比如 SUNW、IBM 或者 MOT),由应用程序从 Yahoo Quote 服务器获取相应的股票信息。应用程序会显示出该股票的名称、价格和日期。

  有两种方法 (可以用在这个应用程序中的) 用来从 Yahoo Quote 服务器获取股票信息。第一种方法的格式如下:
http://quote.yahoo.com/d/quotes.csv?s=SUNW&f=slc1wop

  如果你在浏览器的地址栏输入这个 URL,你将会看到像图 1 所示的那些内容。

图 1:获取股票行情

 

  另一种方法的格式是:
http://finance.yahoo.com/q?s=SUNW
图 2: 获取股票行情的另一种方法

 

  你可以看到第一种方法的结果是一行文本,解析时会比第二种容易许多,也快许多,因为第二种方法的结果含有大量的文字,包括许多广告和格式化信息。所以我用第一种方法实现这个关于股票的应用程序,它由两个类组成:Stock.java 和 StockReader.java。
Stock.java 类

  这个类将从 Yahoo Quote 服务器获得的字符串解析成字段 (例如股票名称、价格和日期)。示例代码 3 中展示了一个实现的例子。示例代码 4 中的 StockReader 类会用到这个工具类。

  示例代码 3:Stock.java
public class Stock { private static String name, time, price; // Given a quote from the server, // retrieve the name, price, and date of the stock public static void parse(String data) { int index = data.indexOf('"'); name = data.substring(++index,(index = data.indexOf('"', index))); index +=3; time = data.substring(index, (index = data.indexOf('-', index))-1); index +=5; price = data.substring(index, (index = data.indexOf('>', index))); } // Get the name of the stock from public static String getName(String record) { parse(record); return(name); } // Get the price of the stock from public static String getPrice(String record) { parse(record); return(price); } // Get the date of the stock public static String getDate(String record) { parse(record);; return time; }}StockReader.java 类

  这个类的任务是连接到 Yahoo Quote 服务器,并从服务器上获取股票行情。它使用 Stock 类解析从服务器返回的字符串。示例代码 4 是它的一个实现。

  示例代码 4:StockReader.java
import java.io.*;import java.net.*;public class StockReader { public static void main(String argv[]) throws Exception { String quoteFormat = "&f=slc1wop"; if (argv.length != 1) { System.err.println("Usage: java StockReader "); System.exit(1); } URL url = new URL("http://quote.yahoo.com/d/quotes.csv?"); URLConnection connection = url.openConnection(); connection.setDoOutput(true); PrintWriter out = new PrintWriter(connection.getOutputStream()); out.println("s=" + argv[0] + quoteFormat); out.close(); BufferedReader in = new BufferedReader( new InputStreamReader(connection.getInputStream())); String line = in.readLine(); /* DEBUG while ((line = in.readLine()) != null) { System.out.println("Got: "+ line); } */ in.close(); System.out.println("Name: "+ Stock.getName(line)); System.out.println("Price: "+ Stock.getPrice(line)); System.out.println("Date: "+ Stock.getDate(line)); }}将数据提交到网页服务器

  在上面的例子中,数据是作为 URL 的一部分被送到服务器的,使用的 GET 方法。现在来看一个使用 POST 方法发送数据的例子。这个例子中,http://www.javacourses.com/cgi-bin 中的 CGI 脚本 (名为 .cgi) 需要 name 和 email 值。如果用户提交 Sally McDonald 作为 name 值,[email protected] 作为 email 值,CGI 脚本会获取输入并对消息进行解析、解码,再将提交的内容返回给客户端。这个 CGI 脚本做事情并不多,但我们要用它来演示如何向服务器提交数据。

  还有一点非常重要——请注意使用 POST 方法时,消息内容的类型是 application/x-www-form-urlencoded,这种类型会:
指定常规数据编码 将空格转换为加号 (+) 将非文本内容转换成十六进制数后接百分号 (%) 的形式 在每个 name=value 对之间放置 & 符号

根据这个编码规则,消息 (name=Sally McDonald and [email protected]) 在发送给 CGI 脚本之前必须被编码成:
[email protected]

  CGI 脚本收到这个已编码的消息后会对它进行解码。不过非常幸运,你不必为手工进行编码操作。你可以使用 java.net.URLEncoder 类来对消息进行编码,就像下面的例子中那样。相应地你可以使用 java.net.URLDecoder 来对消息进行解码。

  示例代码 5 中是这个例子的实现 (使用 HttpURLConnection 类),它展示了如何使用 POST 方法向服务器发送数据。你会看到:
为 CGI 脚本打开连接和 I/O 流 设置请求方法为 POST 使用 URLEncoder.encode 方法对消息进行编码 (URLDecoder.decode 方法可以用于解码) 向 CGI 脚本发送已经编码的消息 接收服务器返回的消息并在控制台打印出来

  示例代码 5:PostExample.java
import java.io.*;import java.net.*;public class PostExample { public static void main(String[] argv) throws Exception { URL url = new URL("http://www.javacourses.com/cgi-bin/names.cgi"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setDoOutput(true); PrintWriter out = new PrintWriter(connection.getOutputStream()); // encode the message String name = "name="+URLEncoder.encode("Qusay Mahmoud", "UTF-8"); String email = "email="+URLEncoder.encode("[email protected]", "UTF-8"); // send the encoded message out.println(name+"&"+email); out.close(); BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; while ((line = in.readLine()) != null) { System.out.println(line); } in.close(); }}代理服务器和防火墙

  如果你使用了防火墙,你就得把代理服务器以及端口号的详细信息告诉 Java,这样才能访问到防火墙外的主机。你可以通过定义一些 HTTP 或者 FTP 属性来做到:
http.proxyHost (default: )
http.proxyPort (default: 80 if http.proxyHost specified)
http.nonProxyHosts (default: )

  http.proxyHost 和 http.proxyPort 用来指定 HTTP 协议处理器需要使用的代理服务器和端口号。http.nonProxyHosts 用来指定哪些主机是直接连接的 (即不通过代理服务器来连接)。http.nonProxyHosts 属性的值是一个由 | 分隔开的主机列表,它可以使用正则表达式来表示所匹配的主机,如:*.sfbay.sun.com 将匹配 sfbay 域中的任何主机。
ftp.proxyHost (default: )
ftp.proxyPort (default: 80 if ftp.proxyHost specified)
ftp.nonProxyHosts (default: )

ftp.proxyHost 和 ftp.proxyPort 用来指定 FTP 协议处理器需要使用的代理服务器和端口号。ftp.nonProxyHosts 用来指定哪些主机是直接联系的,指定的方法与 http.nonProxyHosts 类似。

  你可以在应用程序启动的时候设置这些属性:
Prompt> java -Dhttp.proxyHost=HostName -Dhttp.proxyPort=PortNumber yourApp

 
HTTP 验证

  HTTP 协议提供验证机制来保护资源。当一个请求要求取得受保护的资源时,网页服务器回应一个 401 Unauthorized error 错误码。这个回应包含一个指定了验证方法和领域的 WWW-Authenticate 头信息。把这个领域想像成一个存储着用户名和密码的数据库,它将被用来标识受保护资源的有效的用户。比如,你试着去访问某个网站上标识为 “Personal Files”的资源,服务器响应可能是:WWW-Authenticate: Basic realm="Personal Files" (假设验证方法是 Basic)。
验证方法

  现在有几种用于网络应用的验证方法,其中最广泛使用的是基本验证 (Basic Authentication) 和摘要验证 (Digest Authentication)。

  当用户想要访问有限的资源时,使用基本验证方法的网页服务器会要求浏览器询显示一个对话框,并要求用户输入用户名和密码。如果用户输入的用户名和密码正确,服务器就允许他访问这些资源;否则,在接连三次尝试失败之后,会显示一个错误消息页面。这个方法的缺点是用户名和密码都是用 Base64 编码 (全是可读文本) 之后传输过去的。也就是说,这个验证方法的安全程度只是和 Telnet 一样,并不是非常安全。

  数据验证方法不会在网络中传输密码,而是生成一些数字 (根据密码和其它一些需要的数据产生的) 来代替密码,而这些数字是经过 MD5 (Message Digest Algorithm) 加密的。生成的值在网络有随着服务器需要用来校难密码的其它信息一起传输。这个方法明显更为安全。

  基于表单的验证方法和基本验证方法类似,只是服务器使用你自定义的登录页面来代替了标准的登录对话框。

  最后,客户证书验证使用 SLL (Secure Socket Layer,安全套接层) 和客户证明。
在 Tomcat 下保护资源

  你可以在 tomcat-users.xml 文件中写一个用户及其角色的列表。这个文件在 TOMCAT_HOME (你安装 Tomcat 的目录) 下的 conf 目录中。这个文件默认包含了三个用户 (tomcat、role1、both) 的定义。下面一段 XML 代码是我添加了两个新用户 (qusay 和 reader) 之后的 tomcat-users.xml:

  新添加的两个用户 (qusay 和 reader) 的 roles 分别设置为 author 和 reader。角色属性非常重要,因为当你创建安全规则的时候,每个受限制的资源都是与可访问它的角色相关联 (稍后你会看到)。

  下面做个实验 (假设你已经安装并配置好了 Tomcat)。为你期望的页应用程序建立一个目录。可以按下列步骤做好准备:
在你安装了 Tomcat 的目录下,有一个目录是 webapps。在这个目录下建立一个目录 (如:learn)。在第一步建立的目录下建立一个子目录,命名为 chapter。 在 chapter 目录中,建立一个 HTML 文件,内容自定,文件名为 index.html。 在第一步建立的目录下建立一个名为 WEB-INF 的子目录。 在 WEB-INF 目录中创建一个名为 web.xml 的文件,该文件内容如下: java.sun.com/dtd/web-app_2_3.dtd"> Learning Web Programming Restricted Area /chapter/* tomcat author reader BASIC Authenticate yourself web.xml 配置描述

  web.xml 是描述配置的文件,这里集中说明一下安全相关的配置元素。
:这个元素限制对一个或者多个资源的访问,可以在配置信息中出现多次。上面的配置信息中,它限制了 chapter 目录 (http://localhost:8080/learn/chapter) 下所有资源的访问。 包含了下列元素::这个元素用于标识你想限制访问的资源。你可以定义 URL 模式 和 HTTP 方法 (用 元素定义 HTTP 方法)。如果没有定义 HTTP 方法,那么限制将应用于所有方法。在上面的应用中,我想限制访问的资源是 http://localhost:8080/learn/chapter/*,也就是 chapter 目录下的所有文档。:这个元素可以访问上面定义的受限资源的用户角色。在上面的应用中,tomcat、author 和 erader 这三个角色可以访问这些资源。:这个元素用于指定验证方法。它包含下列元素: :指定验证方法。它的值可能是下列值集中的一个:BASIC (基本验证)、DIGEST (摘要验证)、FORM (基于表单的验证) 或者 CLIENT-CERT (客户证书验证)。 :如果选用 BASIC 方法进行验证的时候,标准登录对话框中的一个描述名称。 示例

  上述配置中使用了 BASIC 验证方法。下面我们做个实验:启动你的 Tomcat 服务器并向它发送到 http://localhost:8080/learn/chapter 的请求。这时候,就会有像图 3 所示那样的对话框提示你输入用户和密码:

图 3:HTTP 基本验证 (Basic Authentication)

 

  输入一个用户及其密码 (你可以看看 tomcat-users.xml 文件),这个用户的角色应该在配置 (web.xml) 中存在。如果你输入的用户名和密码正确,你就能访问到那些资源;否则,你还可以再试两次。

  使用摘要验证来实验:
关闭你的 Tomcat 服务器。 修改你的配置文件 (web.xml),把 BASIC 换成 DIGEST。 重新启动你的 Tomcat 服务器。 打开一个新的浏览器窗口。 在地址栏中输入 http://localhost:8080/learn/chapter 并回车。

  你会看到类似的对话框。从图 4 你可以看到,这个登录对话框是安全的,因为使用了摘要验证。

图 4:HTTP 摘要验证 (Digest Authentication)

 
服务器在幕后的回复

  当使用基本验证方法保护资源的时候,服务器发回类似于图 5 所示的响应信息:

图 5:服务器回复 (基本验证)

 

  如果是使用的摘要验证方法来保护的资源,服务器发回的响应信息就像图 6 所示的那样:

图 6:服务器回复 (摘要验证)

 
Java 支持 HTTP 验证

  J2SE (1.2 或者更高版本) 通过 Authenticator 类为验证提供了本地支持。你所要做的只是继承这个类并实现它的 getPasswordAuthentication 方法。这个方法取得用户名和密码并用它们生成一个 PasswordAuthentication 对象返回。完成之后,你还得使用 Authenticator.setDefault 方法注册你的 Authenticator 实例。现在,只要你想访问受保护的资源,就会调用 getPasswordAuthentication。Authenticator 类管理着所有低层的详细资料。它不受 HTTP 的限制,可以应用于所有网络连接,这不能不说是一个好消息。

示例代码 6 中是实现 Authenticator 的一个示例。正如你所看到的,在请求验证的时候,getPasswordAuthentication 方法会弹出一个登录对话框。

  示例代码 6:AuthImpl.java
import java.net.*;import java.awt.*;import javax.swing.*;public class AuthImpl extends Authenticator { protected PasswordAuthentication getPasswordAuthentication() { JTextField username = new JTextField(); JTextField password = new JPasswordField(); JPanel panel = new JPanel(new GridLayout(2,2)); panel.add(new JLabel("User Name")); panel.add(username); panel.add(new JLabel("Password") ); panel.add(password); int option = JOptionPane.showConfirmDialog(null, new Object[] { "Site: "+getRequestingHost(), "Realm: "+getRequestingPrompt(), panel}, "Enter Network Password", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); if ( option == JOptionPane.OK_OPTION ) { String user = username.getText(); char pass[] = password.getText().toCharArray(); return new PasswordAuthentication(user, pass); } else { return null; } }}

  示例代码 7 用来做测试的代码。我做的第一件事情就是用 Authenticator.setDefault 让我的 Authenticator 实例开始运行。我不必去解析任何服务器返回的信息以检查是否需要验证,因为 Authenticator 类非常聪明,它知道是否需要验证。

  示例代码 7:BasicReader.java
import java.io.*;import java.net.*;public class BasicReader { public static void main(String argv[]) throws Exception { Authenticator.setDefault(new AuthImpl()); if (argv.length != 1) { System.err.println("Usage: java BasicReader "); System.exit(1); } URL url = new URL(argv[0]); URLConnection connection = url.openConnection(); BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; StringBuffer sb = new StringBuffer(); while ((line = in.readLine()) != null) { sb.append(line); } in.close(); System.out.println(sb.toString()); System.exit(0); }}

  运行下面的命令,用 Tomcat 来进行测试:
prompt> java BasicReader http://localhost:8080/learn/chapter

  如果你进入的站点需要验证 (它也这样做了),那会像图 7 那样的对话框就会显示出来。

图 7:Java 处理 HTTP 验证

 

  一旦你输入了正确的用户名和密码,服务器就会允许你访问。BasicReader 会读取被请求页面的 HTML 内容并显示在你的控制台窗口。
特别注意:在 Tomcat 4.0 中使用摘要验证时你可能会遇到问题,这是由 J2SE 1.4.0 和 J2SE 1.4.1 的一个 BUG 引起的。不过这个问题已经在 J2SE 1.4.2 中解决了。详情情看java.sun.com/developer/bugParade/bugs/4759514.html">这里。 总结

  这篇文章是一篇教程,它介绍了 java.net 包的高层 API。这些 API 使你可以快速简捷地建立有用的网络应用程序,如 StockReader。这里也讨论了 HTTP 验证,并用实例演示了如何使用你自己的验证方案。URL 和 URLConnection 还有一些优势没有在文中提到,它们包括:自动重定向、自动管理保持的连接等。不过现在你已经从文中获得基础知识,可以自己解决这些问题了。
posted @ 2006-04-06 11:05 ahuo 阅读(16) | 评论 (0) | 编辑 收藏
 
J2ME开发及JBuilder工具的应用
 
【摘要】本文对J2ME体系结构及MIDP应用程序开发过程进行深入研究,总结出了MIDP应用程序开发的基本流程和方法,开发工具的选择及其比较。 JBuilder作为典型的Java IDE工具,结合JBuilder MobileSet 2.0提供强大的MIDP开发功能,在本文MIDP开发方法研究基础之上,继续对如何使用JBuilder结合MobileSet进行MIDP开发进行研究,总结了使用JBuilder工具的特征和关键。
【关键词】J2ME、CLDC、MIDP、JBuilder、MobileSet
在无线通信领域有两项重大的技术应用,一个是宽带CDMA技术,一个是IP技术。前者使无线通信获得更多带宽,3G的目标是静态速率达到2Mbps,而现在的 2.5G技术(如国内正在建设的GPRS和CDMA2000 1X)都可达到115kbps的速率;后者使无线通信和因特网融合起来,实际上当前WAP2.0技术就采用已经很成熟的TCP、TLS和HTTP协议,而移动IP和IPv6技术将促使更多设备接入互联网,如各种设备、家电等。
就是在这样的环境下J2ME技术得以快速发展,J2ME用来为接入和即将接入互联网的设备提供应用开发平台和执行环境,本文则主要论述如何利用JBuilder进行快速的J2ME应用开发。
1. J2ME分层结构及MIDP简表
J2ME 是SUN的JAVA2平台微型版(JAVA2平台3个版本之一,另两个是标准版J2SE和企业版J2EE),采用3层结构设计。最低层为配置层(Configuration),包括虚拟机(VM)和类库两部分,这一层与设备层(硬件及操作系统)关系紧密,由SUN提供参考规范和源代码,设备厂商根据设备特征进行相应的移植。当前J2ME提供有两个配置:连接设备配置(CDC)和有限连接设备配置(CLDC)。前者主要面向有较大内存和处理能力而只需有限功能的设备,如电视置顶盒、冰箱、汽车导航设备等,这些设备都有连接网络和相互交互的需求,其内存在2M以上;后者主要面向对内存和处理能力有较大限制的手持设备,如现在使用的手机、PDA等,现在及将来大多数这些设备都已经能够接入互联网,其内存范围160Kb(其中128Kb用于虚拟机及类库,至少32Kb用于CLDC规范所要求的应用程序堆栈空间)到2M。二者主要区别在于能提供给VM及应用程序的存储空间,CDC所用VM及类库实际是参考J2SE标准,去除了不需要的功能如AWT。CLDC所用VM(称作KVM)则有较大区别,包括类验证机制。对于下一代移动终端设备如智能电话、高端 PDA,则是CDC所应用对象,因为它们将有超过2M的内存。
设备层之上是简表层(Profile),再之上则是应用层(Application)。简表层扩展了配置层功能为上层应用提供API,如果说配置层面向设备,简表层则面向应用。可以根据需要在CDC或CLDC基础之上提供多种简表,一个配置层之上也可以有多个简表。当前CDC之上有基础简表(Foundation Profile)和基于FP的Personal Profile和RMI Profile。CLDC之上则主要提供有移动信息设备简表(MIDP),即用于手机、PDA等移动终端的设备简表,提供API以支持无线应用的开发。
CLDC 类库一部分来自J2SE,这部分类库是经过裁减的,去除了不必要的功能,主要包括java.lang包中的系统类、数据类型类、异常处理类, java.util包的集合类、时间类和附加工具类,java.io包的I/O处理类。CLDC专有类则主要是"通用连接框架(GCF)",为CLDC提供网络连接功能,这些网络接口都是Connection类的子类,由类Connector所提供的方法调用,这些接口或类位于包 javax.microedition.io。
CDC类库则是CLDC的超集,因此为CLDC开发的应用程序可以移植到CDC平台,由于CDC采用标准的J2SE VM,因此其开发与标准的J2SE开发一致,只是在用javac工具编译源代码时需要使用CDC的类库,即使用-bootclasspath参数指向 CDC类库。
MIDP扩展了CLDC的功能,它继承了GCF并在此基础上增加了类HttpConnection,用以提供HTTP连接功能(尽管从理论上CLDC/MIDP可以提供socket、数据报、文件、NFS等多种连接类型,但现在标准的CLDC/MIDP仅支持HTTP协议,一些设备实现则提供了socket和HTTPS协议的支持),MIDP类库总结如下:
¨ java.io、java.lang、java.util,属于MIDP的核心包,分别用来提供系统I/O、语言支持和工具支持。包中的类来自CLDC并稍有增加,但都来自J2SE。
¨ javax.microedition.midlet,定义了MIDP应用程序,以及应用程序和它所运行于环境之间的交互。
¨ javax.microedition.lcdui,为MIDP应用程序提供用户界面API。
¨ javax.microedition.rms,用来为MIDlet提供持久存储的机制,应用程序可以存储数据,在以后需要的时候获取这些数据。
¨ javax.microedition.io,提供了基于CLDC通用连接框架的网络支持。
2. MIDP应用程序开发
这里讨论的J2ME无线应用开发主要是基于CLDC/MIDP的开发,其应用程序可运行于移植有KVM的手机、PDA等,这类设备由MIDP定义,即移动信息设备(MID),可看作一垂直应用市场。
可在PC(Windows、UNIX或Linux平台)上开发MIDP应用程序,编译成类文件形式,下载到目标设备上,经过类文件的验证(验证是否有不符合KVM规范的方法调用等)后即可解释执行。从源代码到最后应用程序的执行,整个过程如下:

图1 MIDP应用程序开发过程
这是开发一个MIDP应用程序的完成步骤,其中8和9可以在模拟器上进行,也可以把应用程序通过IrDA、RS232或OTA等方式之一下载到目标设备上运行。1、2步骤是在前期设计基础上编写源代码,其中资源文件可以是PNG图象或自定义结构数据,外部类库应该是符合CLDC/MIDP规范(即没有超出 CLDC/MIDP的类或方法调用)的ZIP或JAR文件。生成的.java文件至少有一个是扩展了 javax.microedition.midlet.MIDlet类的子类,并且实现几个规定的接口,比如下面的一个MIDlet程序 :
import javax.microedition.midlet.*; //应用程序生命周期,和J2SE一样,包java.lang.*是默认加载的
import javax.microedition.lcdui.*; //MIDP用户界面
public class FirstMIDlet extends MIDlet implements CommandListener {
private Display display; // 引用MIDlet的Display 对象
private TextBox textBox; // Textbox 显示一条消息
private Command cmdExit; // 设定按钮用于退出MIDlet
public FirstMIDlet() { // MIDlet构造程序
display = Display.getDisplay(this);
cmdExit = new Command("Exit", Command.SCREEN, 1);
textBox = new TextBox("My First MIDlet", "Hello, J2ME!", 50, 0);
textBox.addCommand(cmdExit);
textBox.setCommandListener(this);
}
public void startApp() { // 必须要实现的接口,被应用管理软件调用来启动MIDlet
display.setCurrent(textBox);
}
public void pauseApp() { } // 必须要实现的接口
public void destroyApp(boolean unconditional) { } //必须要实现的接口
public void commandAction(Command c, Displayable d) { //检查一下是否选择了退出命令
if (c == cmdExit) {
destroyApp(false);
notifyDestroyed();
}
}
}
这是最简单且功能完整的MIDlet应用程序,其中接口startApp、pauseApp、destroyApp是必须要实现的,应用程序管理器(JAM)通过这些接口调用和控制应用程序,与Applet类似。除这个主类外还可以有其它辅助类,其要求和J2SE一致。
然后使用javac工具编译,javac工具来自J2SE,至少JDK 1.3版,编译时应该使用参数-bootclasspath并指向MIDP类库。之后使用preverify工具预验证,以保证生成的.class文件符合CLDC要求,这一步为每个类文件添加堆栈映射(stackmap,此属性为CLDC新定义)属性,增加类文件大小约5%。
此时可以用midp工具(来自MIDP实现的可执行文件)模拟运行,之后即可打包,需要编写一清单文件(清单文件参考CLDC/MIDP规范),用jar工具(来自J2SE)把预验证后的类文件、资源文件、清单文件打包。
要发布应用程序还需要编写一描述文件(JAD),JAD的要求同清单文件一致,可以自定义参数供应用程序调用。其中一个参数MIDlet-Jar-URL以 URL方式指向JAR文件,移动终端设备通过JAM连接网络获取JAD,下载MIDlet-Jar-URL指向的JAR到设备中,通常JAM要先判断 JAD与清单文件是否一致,应用程序是否有效,然后才决定下载。
运行时执行环境、JAR包、JAD文件和应用程序生命周期,这些要素构成MIDlet套件,由JAM管理,每个MIDlet套件可包含一个或多个MIDlet。
上面是一个MIDP应用程序开发的关键点,具体的开发方法及开发工具大致分为如下几种:
Ⅰ. 基本开发工具
最基本的开发方式是下载SUN提供的CLDC/MIDP参考实现及源代码,可根据需求编译生成一个CLDC/MIDP实现,并移植到设备上。配置好开发环境(CLDC/MIDP实现、JDK1.3)后即可采用上述方法和工具进行开发,多采用命令行方式,这是最原始的方法。
Ⅱ. J2MEWTK开发工具
这是SUN提供的便捷开发工具,用于Windows环境,同样需要先安装JDK1.3。源程序仍需要使用常规的文本编辑器,把编辑好的源文件及资源文件按一定要求放在规定目录下,J2MEWTK所提供的是菜单或按钮方式的命令。J2MEWTK中有相应的编译(和预验证一个步骤)、打包、模拟运行的菜单(或按钮),以及其它辅助工具。
Ⅲ. IDE工具
可以使用Forte For Java、JBuilder等IDE工具和J2MEWTK集成使用,它们除了有J2MEWTK的功能外,就是提供有可视化的开发工具。
3. 使用JBuilder MobileSet
JBuilder 是Java程序员常用工具之一,在于它强大的可视化编程工具,集成的编译、运行和调试环境。要为JBuilder提供J2ME无线应用开发支持,需要在 JBuilder基础之上安装MobileSet,建议安装2.0版,当前支持CLDC/MIDP的1.0.3版本,而JBuilder的版本应该是6。 JBuilder MobileSet 2可从下面网址免费下载:
http://www.borland.com/jbuilder/mobileset/
同时还要下载相应的MobileSet序列号和许可密钥(免费),根据提示安装MobileSet并注册后,运行JBuilder会找到 "Help|MobileSet Guilde"菜单项。使用菜单"File->New..."打开"Object Gallery"对话框,会出现一个新的页面标签"Micro",此时图标"MIDlet"和"MIDP Displayable"是灰色的,只有生成一个MIDP项目后才能使用这两个图标。
3.1 JBuilder MobileSet的特征
JBuilder MobileSet是一个开放工具,能够与其它供应商提供的J2ME开发工具包集成在一起,当前提供了对下列厂商工具包的支持:
¨ Sun提供的J2ME无线开发工具包1.0.3版(J2MEWTK)
¨ 诺基亚的J2ME开发套件(http://forum.nokia.com)
¨ 西门子的SMTK开发工具包(http://www.siemens-mobile.de)
其中J2MEWTK已经包含在MobileSet 2的安装文件中,如果要使用J2MEWTK提供的开发类库,并且还没有安装J2MEWTK,可以在安装MobileSet 2时选择完全安装。MobileSet 2提供了下列辅助开发的工具:
¨ 用于CLDC/MIDP类的CodeInsight工具
¨ 类/包浏览器
¨ JDK转换工具
¨ 动态适配到任何J2ME简表,包括MIDP
和开发其它Java应用程序一样,JBuilder通过MobileSet提供了快速开发模板,包括MIDP项目模板,MIDP Displayable模板,MIDlet模板。它提供了RAD(快速应用开发)的可视设计器,支持MIDP UI元素。通过MobileSet还支持MIDP应用程序打包和OTA配置(Over the Air,上载和下载文件和MIDlet套件,用来配置应用程序到设备上)。
MobileSet能够用在JBuilder的个人版、专家版和企业版,但是一些功能不能用在个人版如JDK设置切换,打包器等。
3.2 配置JDK
前面已提到编译MIDP应用程序时需要设置特定的CLDC/MIDP类库,以避免使用默认的J2SE类库,在JBuilder中同样要进行类似设置。这是通过JDK配置选项实现的,JBuilder的设计独立于JDK,尽管每个JBuilder版本发布时会默认安装一个当时较新的JDK(类库),但还可以通过它的配置机制设置其它JDK,包括旧版本、更新版本或者OEM版的JDK,从而实现了JBulder的扩展性。
专家版和企业版的 JBuilder可同时配置多个JDK,根据需要设置其中一个为默认即可,而个人版的却要在需要时重新配置每个JDK。安装MobileSet后可选择安装J2MEWTK、诺基亚和西门子的JDK,然后为设置的每个JDK自定义一个名称,并把其主目录指向这个JDK中\bin的父目录,需要注意的是JDK 目录中不能有空格如c:\Program Files\ J2mewtk。
3.3 MIDP项目
JBuilder开发都以项目概念为中心,项目文件包含一个(属于这个项目的)文件列表以及项目属性,其中项目属性包括项目模板、缺省路径、类库和连接配置等,JBuilder使用这些信息加载、保存、编译和运行项目。使用Jbuilder开发环境添加、移除文件,或者设置、更改项目属性都会更改项目文件。可以在项目面板中看到项目文件作为主节点显示。
生成项目的便捷方式是使用项目模板工具,可用来设置项目名称、类型和模板,以及JDK、工作目录、备份路径和编译输出路径等。其中项目类型可选择.jpx或者.jpr,二者内容一样,区别是前者使用XML格式文件,因此适合于共享的项目。
而JDK 则是前面所设置中的一个,并且只有选择CLDC/MIDP的JDK才能使用Object Gallery中的Micro选项。每个项目至少一个MIDlet主类,所以首先应使用MIDlet模板生成一个MIDlet主类。通过模板可以设置这个主类的类名、标题、屏幕类型和命令处理方式,其中屏幕类型有4个选择:(javax.microedition.lcdui.)Canvas、Form、 List、TextBox,只有Form的扩展类才能添加其它的组件(Item的子类)。命令处理方式也有4个选择:
Ⅰ. —— 通过其它的类设置commandListener,比如MIDlet类。
Ⅱ. Interface implementation —— 生成一个类并在类中实现commandListener接口,这种方式生成的类的大小会比适配器方式生成的小。
Ⅲ. Standard adapter —— 这种方式生成的代码采用标准适配器的形式:
class Foo {
private void jbInit() {
addListener(new Adapter(this));
}
}
class Adapter {
...
}
Ⅳ. Anonymous adapter —— 这种方式生成的代码采用匿名适配器的形式:
class Foo {
private void jbInit() {
addListener(new Listener() {
...
});
}
}
后两种适配器形式可以通过项目属性"Code Style"设置。如果要在这个MIDP应用程序中添加更多的屏幕,可以使用Displayable模板添加,或者通过MIDlet模板添加更多的MIDP应用程序到项目中。
生成应用程序框架后,就可根据本文第2部分要求添加所需代码,并使用JBuilder提供的便捷方式进行编译(预验证)、打包、模拟运行和发布,JBuilder提供有内置web服务器和ftp服务器,以方便开发者测试应用程序的发布。
如果使用MIDlet或Displayable模板生成一个Form类型的Displayable对象,则可以使用JBuilder的"MIDP设计器"定制用户界面,即从组件板上以拖拉方式生成UI元素,可用鼠标调整这些元素的位置或者进行复制、删除等操作,这就是JBuilder强大功能之所在。
如果是使用模板生成Displayable类,会自动生成jbInit()方法,当在Form中添加UI元素时,设计器会把代码添加进jbInit()方法。如果希望打开一个现有Displayable类到设计器,它已经有UI元素,但是没有jbInit()方法,首先需要生成一个jbInit()方法,然后把所有的UI元素转移进去。
posted @ 2006-04-06 10:55 ahuo 阅读(11) | 评论 (0) | 编辑 收藏
 
J2ME结构与相关规范介绍
J2ME的适用范围很广,而且针对J2ME的规范也在增加,很多人因为对各种规范的作用不了解造成对J2ME体系的误解。本文主要讲述一下 J2ME 的结构和构成,同时对一些容易混淆的概念进行解释。

 

J2ME结构与相关规范介绍
 

J2ME的适用范围很广,而且针对J2ME的规范也在增加,很多人因为对各种规范的作用不了解造成对J2ME体系的误解。本文主要讲述一下 J2ME 的结构和构成,同时对一些容易混淆的概念进行解释。
J2ME是什么?
很多人把J2ME等同于手机程序开发,其实这是一个非常错误的说法。也有人认为J2ME是一个标准,一个规范,这同样是不正确的。
Sun  公司将 J2ME (Java 2 Micro Edition,Java 2微型版)定义为"一种以广泛的消费性产品为目标的、高度优化的 Java  运行时环境"。自从 1999 年 6 月在 JavaOne Developer Conference 上声明之后,J2ME 进入了小型设备开发的行列。通过 Java 的特性,遵循 J2ME 规范开发的 Java 程序可以运行在各种不同的小型设备上。
J2ME是Sun公司为嵌入式开发所定义的一个框架,一系列标准的规范所组成。所以J2ME是一个协议簇,而不是单一的规范。
J2ME是一个非常大的概念,下面的一幅图可以看看J2ME的适用范围。
 
图1
图中的CDC 和CLDC 是支持J2ME的两类设备的配置的简称,分别是:
CDC (Connected Device Configuration,连接设备配置),运行在这一配置上的程序称为J2ME Application,在CVM上进行解释。l    l
CLDC(Connected Limited Device Configuration,连接限制设备配置),运行在这一配置上的程序称为MIDlet ,在KVM上进行解释。l    l
可以把CDC 和CLDC 理解为对硬件的定义,就如同PC机和小型机一样,这些设备提供Java程序运行的硬件环境。
在 J2ME  中有两类虚拟机:CVM (C Virtual Machine,C虚拟机)与 KVM (K Virtual Machine,K虚拟机)。KVM 和  CVM均可被看作是一种 Java 虚拟机,是 JVM 的子集,在功能上都是 JVM 的缩减版。这两类虚拟机的适用范围并不相同,简单地说, CVM 的功能比KVM 功能更为强大。
这里再补充一点,J2ME还包括对了Java Card 的定义,用于各类IC卡。JavaCard 和CDC/CLDC在J2ME中是相同的地位。
JavaCard 的网页见:http://java.sun.com/products/javacard/index.jsp ;。
所以在这里要理解J2ME的含义,就可以从CLDC 和CDC这两方面进行了解。
CLDC 与CDC的对比
在前面的图1中已经显示出CLDC 和CDC在适用设备上的区别。
CDC主要针对32位的处理器主频通常在75MHz以上,内存可能在1~4MB 。CDC 针对的设备主要是数字电视、机顶盒、网络电话、车载计算设备等。这些设备的特点是:
    有线连接l
    电源稳定l
    设备外设资源比较受限l
CLDC 设备的最低配置为:CPU为16位、32位主频在 16MHz以上的处理器,设备的内存比较少,可能只有512KB,甚至更少。现在硬件的发展非常快,以前所定义的CLDC的设备目前的设备甚至远远超过原来的定义。不过请注意一下,J2ME 对CLDC设备配置的定义只是一个最低要求的定义。其实目前很多 CLDC设备的配置都远远超过上面的配置,不过要分辨CLDC设备主要要从设备特点上进行区别。这些设备的特点是:
    无线连接l
    没有稳定的电源供应(通常使用电池)l
    设备外设资源极少l
具体一点说如智能手机,例如:Nokia 7650,Nokia 3650等,还有例如PDA设备也都应该归于CLDC的范围。
简表
J2ME  使用配置(CDC或CLDC)和简表(Profile)定制JRE(Java Runtime Environment, Java 运行时环境)。一个完整的 JRE由配置和简表组成,配置决定了所使用的 JVM(可能是CVM 或 KVM),而简表通过定义特定的类来为应用程序提供功能上的支持,一个简表定义了设备所提供的 API 集合。
如果把CDC 、CLDC 理解称为硬件配置的话,Profile可以理解为硬件上的操作系统,这个操作系统提供了程序可以调用的所有功能集合,也就是说Profile定义了各种功能的 API 函数集。当然这个比喻并不完全恰当,因为CVM 和 KVM  才充当了解释Java程序执行的角色。又或者可以把Profile理解称为虚拟机上提供的开发包,不同的开发包提供不同的核心功能调用。不管怎么理解都好,只要便于自己理解。
这里再补充说明一点:CDC规范和CLDC规范中也都定义了基本的API集合,这些API提供Java 的基本功能,例如:java.io、java.lang、java.util 、javax.microedition.io 这些包就是定义与CDC 和CLDC中的。不过这些包都是Java最基本的功能,更多的面向设备的功能性 API 必须还是通过简表来提供。
下面介绍一下几种常见的简表:
    MIDP (Mobile Information Devices Profile,移动信息设备简表):定义了移动信息设备的类型和提供相关的API集合, MIDP 所定义的功能更加面向用户,而且比 CLDC 更高级。l
    IMP (Mobile Information Device Profile,信息模块简表):定义了提供网络连接,但是显示方式比较单一的设备简表,例如告警器。l
    Foundation Profile(基础简表):提供除了用户界面以外 J2SE 所能够提供的标准类库。l
    Personal Profile(个人简表):针对那些资源相对有限,但是对网络访问要求很高,基于AWT图形界面的设备,例如Web-TV、汽车导航系统等。l
除这里提到的三个简表外还有其他类型的简表,但是上面的四个简表是Sun公司所推荐的,而且是开放的简表。例如以前的KJava就是和MIDP 类似的简表。
J2ME内定义的各种规范介绍
到目前为止,本文一共提到了几个规范:
    CLDC 规范:目前分为 v1.0 JSR 30,v1.1 JSR 139l
    CDC 规范:目前分为 v1.0 JSR 36,v1.1 JSR 218l
    MIDP 规范:分为 v1.0 JSR 37,v2.0 JSR 118l
    IMP 规范:JSR 195l
    FP 规范:JSR 46l
    PP 规范:JSR 62l
这些规范都是J2ME中的基础规范,例如说CLDC 设备必须要支持 CLDC规范,同时要选择支持一个简表规范,可能是MIDP 或者其他简表。对于CDC 设备来说也必须支持 CDC 规范,同时选择支持一个简表规范,可能是FP,也可能是PP。
对于其他规范,设备可以选择支持。接下来我引用一下Sun公司J2ME主页对各种规范的介绍:
适用于CLDC设备的规范:
Connected Limited Device Configuration (CLDC); JSR 30, JSR 139 CLDC 规范,前面已经介绍过

Mobile Information Device Profile (MIDP); JSR 37, JSR 118 MIDP 规范,前面已经介绍过

Information Module Profile (IMP), JSR 195 IMP 规范,前面已经介绍过

Java Technology for the Wireless Industry (JTWI), JSR 185 无线Java行业规范

Wireless Messaging API (WMA); JSR 120, JSR 205 无线信息规范,提供短信和彩信功能

Mobile Media API (MMAPI); JSR 135 移动媒体规范,提供音频视频播放

Location API for J2ME (JSR-179) 定位规范,提供定位功能

SIP API for J2ME (JSR-180) 提供对会话发起协议的支持

Security and Trust Services API for J2ME (JSR-177) 提供网络安全与信任的支持

Mobile 3D Graphics (JSR-184) 提供对3D绘图的支持

J2ME Web Services APIs (WSA), JSR 172 提供对Web Services的支持

Bluetooth API (JSR-82, Motorola, Java Partner Site) 提供对兰牙的支持

PDA Optional Packages for the J2ME Platform (JSR 75)  提供对PDA中文件、通信录等存取的支持

适用于CDC设备的规范:
Connected Device Configuration (CDC); JSR 36, JSR 218 CDC规范,前面已经介绍过

Foundation Profile (FP) (JSR-46) FP 规范,前面已经介绍过

Personal Profile (PP) (JSR-62) PP 规范,前面已经介绍过

Personal Basis Profile (PBP) (JSR-129) 类似于PP的规范,但在图形界面方面无需支持AWT

J2ME RMI Optional Package, (RMI OP); JSR 66 提供对远程调用的支持

JDBC Optional Package for CDC/Foundation Profile A