Java应用程序的网络运行环境编程

网络技术的发展在时时刻刻在推动着Internet普及与应用,目前Internet已经成为当今首选网络应用的开发平台之一。由于Internet是一个异构的平台,遵循和实现网络的兼容性和跨平台性,是任何应用开发商与程序开发人员必须遵守的应用开发基本准则之一。

Java语言以纯面向对象、多线程、与平台无关,一次编写,随处运行(Write Once,Run Anywhere)等诸多非常适合Internet平台网络应用开发的特性,迅速在计算机领域崛起。然而,一个好的Java网络应用除了遵循Java与平台无关的开发规则之外,还要有相应的环境变量配置,而这些环境变量的配置对保证系统的正常运行尤为重要。

比如:一个网络应用程序建立与 http://www.edu.cn的网络连接,并实现对该URL文件的获取;可以使用如下Java代码非常容易地完成。


//建立网络连接,并构造数据流

try {
   URL url = new URL("http://www.edu.cn:80");
   BufferedReader in = new BufferedReader(
     new InputStreamReader(url.openStream()));
  //从数据流中读取数据并处理   
   String str;
   while ((str = in.readLine()) != null) {
   //处理读入的一行文本 
 process(str);
   }
   in.close();
 } catch (Exception e) { System.out.println(e);} 

众所周知,Java提供了 try{…}catch{…} ,等错误捕获机制,可以在Java应用程序中,对有可能引起程序错误(如:网络连接超时等)进行相关处理,从而在保证了该应用程序的兼容性与健壮性。

图1 网络应用程序通讯的方式
图1 网络应用程序通讯的方式

然而,上述程序似乎缺少对网络环境(如:代理服务器)的考虑。我们知道,Internet的应用普及虽然已经取得很大的成功,但是随着Internet应用范围的扩大,Internet的初期建设思想也暴露出明显的不足:目前Internet普遍采用的TCp/Ip协议是Ip4,随着Internet应用的普及,大量主机接入Internet互联网,Ip地址的匮乏的问题日益突出,该问题已经成为当前Internet网络管理和比较突出的问题。目前针对Ip 地址匮乏的问题,一种比较行之有效的处理办法之一是采用代理服务器(见图1)。

如果将上述代码应用于使用代理服务器的主机,上述程序只能抛出错误。主要原因是:应用程序开发人员没有考虑编写设置该程序没有关的网络代理服务器环境变量造成的;正是由于网络代理服务器出现造成的网络环境的变化,使得上述原先非常"健壮"的应用程序,却不能在使用代理服务器的网络环境下的主机上运行。由此看来,面向Internet网络环境下的应用系统,必须编写针对网络代理服务环境变量的相关代码,以提高网络应用程序的兼容性与健壮性。

Java网络代理服务器环境变量
Java 是一种面向对象的网络语言,Java 的JVM已经提供了可以设置与网络代理服务相关的环境变量,这些环境变量是按照键值名(Key)和值(Value)实现配置的。而这些环境变量与应用程序息息相关。比如:大家比较熟悉的classpath环境变量等。从表面上看,JVM的环境变量有点类似Windows的*.ini,该环境变量是按照纯文本的格式存储的。

1. Http代理服务环境变量

Http 代理服务是目前Internet环境下,应有最为广泛的代理服务。一般的网络浏览器,如:微软的Internet Explorer和网景公司的Netscape都提供对Http代理服务的配置选项。在Java应用程序中,对Http代理服务的使用是通过配置Java 虚拟机的JVM的环境变量来实现的。针对http代理服务,Java 虚拟机提供了如下环境变量:

http.proxySet 该环境变量用以设置应用程序是否使用http协议代理,值为True/False。
注意:在设置环境变量时候,变量值True/False是按照字符串的形式进行设置的。
http.proxyHost 该环境变量用以设置应用程序所使用的http协议代理服务器的主机,比如:我们使用 http://202.194.210.9 作为http的代理服务器主机。
http.proxyport 该环境变量用以设置应用程序所使用的http协议代理服务器的主机的端口号。比如:我们使用 http://202.194.210.9 的3128端口作为http的代理服务器。

如:将Java应用程序的Http代理服务器设为202.194.210.9,端口为3128,可以使用如下代码:


String host="202.194.210.9";
String port="3128";
System.setproperty("http.proxySet", "true");
System.setproperty("http.proxyHost", host);
System.setproperty("http.proxyport", port);

一旦设置好了Java应用程序的http代理环境变量,Java应用程序就可以通过http代理服务透明地访问与http相关的网络资源。

2. Ftp代理服务环境变量
Ftp 协议主要是用来实现不同主机上传输文件的协议。该协议也是我们在Internet环境下,下载、传输文件最常用的协议。目前的一些Internent环境下的下载软件如:著名的国产软件NetAnts、FlashGet均提供了对Ftp代理服务设置。针对 Ftp代理服务,Java虚拟机JVM提供了如下环境变量。

FtpproxySet 该环境变量用以设置应用程序是否使用Ftp协议代理。值为True/False
不过在设置环境变量时候,变量值True/False是按照字符串的形式进行设置的。
FtpproxyHost 该环境变量用以设置应用程序所使用的Ftp协议代理服务器的主机
Ftppoxyport 该环境变量用以设置应用程序所使用的Ftp协议代理服务器的主机的端口号。
如:将Java应用程序的Ftp代理服务器设为202.194.210.9,端口为3128,可以使用如下代码:


String host="202.194.210.9";
String port="3128";
System.setproperty("FtpproxySet", "true");
System.setproperty("FtpproxyHost", host);
System.setproperty("Ftpproxyport", port);

通过上述设置Java应用程序的Ftp代理环境变量后,Java应用程序就可以通过Ftp代理服务透明地访问与http相关的网络资源。

3. Https代理服务环境与系统设置
Internet 的普及与应用带来无限商机,也给人们带来的很多便利,如网上银行等等。但是Internet的安全也是人们比较关心的问题之一,早期的Internet协议,如:Http协议,并没有提供特别的安全措施。随着电子商务、网上银行、网上股票交易的出现,安全的网络传输Https协议应运而生。Https协议可以保证,数据在传输过程中,即使被截获也无法解密。针对Https代理服务,Java虚拟机JVM提供了环境变量

https.proxySet 用以设置应用程序是否使用https协议代理
https.proxyHost 用以设置应用程序所使用的https协议代理服务器的主机
https.proxyport 用以设置应用程序所使用的https协议代理服务器的主机的端口号

如:将Java应用程序的Https代理服务器设为202.194.210.9,端口为3128,可以使用如下代码:


String host="202.194.210.9";
String port="3128";
System.setproperty("https.proxySet", "true");
System.setproperty("https.proxyHost", host);
System.setproperty("https.proxyport ", port);

一旦设置好了Java应用程序的https代理环境变量,Java应用程序就可以通过https代理服务透明地访问与https相关的网络资源。在默认缺省条件下,Java的JVM并不设置任何网络代理环境变量。为了保证网络应用程序的兼容性,在开发程序时候,必须提供相应的网络代理服务环境变量配置。

网络应用程序的使用的代理服务器配置
一个好的网络应用程序,不但要能使用代理服务器,而且要能动态地设置代理服务器。以下我们通过使用java.util.properties对象所提供的Java应用程序配置功能,来实现环境变量文件的读写。

1. 环境变量文件结构

环境配置文件的结构通常是按照:环境变量名=环境值,每个值一行,按照纯文本格式存储的(其中:#开头的文字行为配置文件注释)。如:


#Network connection proxy setting:
#Fri Apr 12 15:41:54 CST 2002
https.proxyport=3128
FtpproxySet=true
http.proxyHost=202.194.210.9
FtpproxyHost=202.194.210.9
https.proxySet=true
http.proxyport=3128
https.proxyHost=202.194.210.9
Ftpproxyport=3128
http.proxySet=true

从该文本文件,我们可以直观地看出,该应用程序的http代理服务器为202.194.210.9,端口号为3128。该环境变量文件可以通过程序产生,也可以人工使用任何文本编辑器编写(如:notepad.exe, ultraedit等)。

2. 通过应用程序产生环境变量文件

通过Java应用程序自动产生和保存Java环境变量,是每一个精益求精的Java应用开发人员追求的目标。

java.util.properties对象提供了应用程序的环境变量保存文件的生成。通过使用该对象: properties properties = new properties(); 来构造软件系统的环境,使用如下代码:


try {
//建立文件输出流      
FileOutputStream fo = new FileOutputStream(filename);
//将properties对象与文件输出流建立连接
      properties.store(fo, "Network connection proxy setting:");
     properties.put("FtpproxySet", "true");
      properties.put("FtpproxyHost", host);
      properties.put("Ftpproxyport", port);
…
      fo.close();
    }
    catch (IOException ex) {
      System.out.println(ex);
    }

上述简单的几行代码,可以将应用程序产生的环境变量加入到Java虚拟机环境中,同时将这些变量保存到一个纯文本文件。

3. 应用程序产生环境变量文件的读取与设置

一个好的Java应用程序在保证Java应用程序的正确性、兼容性的条件,通常还要针对该应用程序自动配置相关变量。

Java的java.util.properties对象提供了应用程序的环境变量文件的读入。通过使用该对象,可以读入并配置环境变量: properties properties = new properties(); 来构造软件系统的环境,使用:


try {
//首先打开环境配置文件,
      FileInputStream fi = new FileInputStream(filename);
//通过properties对象载入文件数据流
      properties.load(fi);
//枚举环境变量文件的键值
      Enumeration emu = properties.keys();
      while (emu.hasMoreElements()) {
//获取环境变量键值
       String theKey = (String) emu.nextElement();
       String theValue = properties.getproperty(theKey);
       System.out.println(theKey + "=" + theValue);
       sp.append(theKey + "=" + theValue+"/n");
//设置环境变量值
       System.setproperty(theKey,theValue);

可以完成环境变量文件的读入与环境变量的设置。

综合环境变量读写与配置实验

为了高效地完成Java网络环境的代理服务实验配置,笔者开发了config.NetCfg 的JavaBean.该JavaBean提供了,对Java应用程序网络代理服务器的配置,以及对JVM系统环境变量的获取功能,其UML类图结构见图2。

图2 config.NetCfg UML类图
图2 config.NetCfg UML类图

该程序的说明和代码如下:


//系统的包名称
package configure;
import java.util.*; //使用properities必须引用此包
import java.io.*;//由于涉及到了环境变量文件的读写,必须引入此包

public class Netcfg {
 //这里构造一个properties对象
  properties properties = new properties();

  public Netcfg() {
  }
**********************************************************
// this method is used to get system settings with a return string value
JVM缺省状态下,有许多环境变量,getSystemSetting()方法通过构造对象:
properties syspro=System.getproperties();
获取该环境所有变量,并将所有变量返回到一个字符串变量
**********************************************************
 public String getSystemSetting(){
   StringBuffer sb=new StringBuffer();
   properties syspro=System.getproperties();
   Enumeration es=syspro.keys();
   while(es.hasMoreElements()){


      String theKey = (String) es.nextElement();
      String theValue = properties.getproperty(theKey);
      sb.append(theKey + "=" + theValue+"/n");

   }
    return new String(sb);


 }

**********************************************************
 //Save the system setting in to a file
本方法将getSystemSetting()方法中获取的环境变量字符串,写入一个文本文件
主要用于保存所有JVM虚拟机环境变量的设置。
**********************************************************
 public void saveSystemSetting(String filename){

  try {
    FileWriter fw = new FileWriter(filename);
    fw.write(getSystemSetting());
    fw.flush();
    fw.close();
  }
  catch (IOException ex) {
  }

 }
**********************************************************
//this method is used to save the proxySetting into a property file
saveproxySetting()将代理服务器的所有环境变量设置,保存到一个文本文件中
主要用于保存所有有关代理服务器的变量的设置。
**********************************************************
  public void saveproxySetting(String filename) {

    try {
     //打开文件输出流 
FileOutputStream fo = new FileOutputStream(filename);
//这里将环境变量保存到文件流,环境配置文件的第一行为"Network connection proxy setting:",第一行主要用于对文件的注释
      properties.store(fo, "Network connection proxy setting:");
      //properties.
      fo.close();
    }
    catch (IOException ex) {
      System.out.println(ex);
    }

  }
**********************************************************
// This method is used to get the proxySetting from a file
//本方法使用了打开环境配置文件,并返回代理服务的配置字符串,同时可以配置Java虚拟机的环境变量
**********************************************************

  public String  setproxySetting(String filename) {
        StringBuffer sp=new StringBuffer();
    try {
//打开环境配置文件
      FileInputStream fi = new FileInputStream(filename);
//通过properties.load(fi)方面将环境配置文件读入,依次枚举各个环境变量健和值,并配置JVM的环境变量

      properties.load(fi);
      Enumeration emu = properties.keys();

      while (emu.hasMoreElements()) {

        String theKey = (String) emu.nextElement();
        String theValue = properties.getproperty(theKey);
        System.out.println(theKey + "=" + theValue);
        sp.append(theKey + "=" + theValue+"/n");
        System.setproperty(theKey,theValue);

      }
      fi.close();

    }
    catch (IOException ex) {
      System.out.println(ex);
    }

    return new String(sp);
  }

  }
**********************************************************
//该方法设置Http代理服务器,并将环境变量的配置保存到properties对象中。
**********************************************************
  public void setHttpproxy(String host, String port) {

    properties.put("http.proxySet", "true");
    properties.put("http.proxyHost", host);
    properties.put("http.proxyport", port);
   //设置http代理环境
    System.setproperty("http.proxySet", "true");
    System.setproperty("http.proxyHost", host);
    System.setproperty("http.proxyport", port);


  }
**********************************************************
设置Https代理服务器,并将环境变量的配置保存到properties对象中。
**********************************************************
  public void setHttpsproxy(String host, String port) {

    properties.put("https.proxySet", "true");
    properties.put("https.proxyHost", host);
    properties.put("https.proxyport", port);
   //设置https代理环境
    System.setproperty("https.proxySet", "true");
    System.setproperty("https.proxyHost", host);
    System.setproperty("https.proxyport", port);
  }
**********************************************************
设置Ftp代理服务器并将环境变量的配置保存到properties对象中
并将配置保存到properties对象中。
***********************************************************
  public void setFtpproxy(String host, String port) {

    properties.put("FtpproxySet", "true");
    properties.put("FtpproxyHost", host);
    properties.put("Ftpproxyport", port);
//设置Ftp代理环境
    System.setproperty("FtpproxySet", "true");
    System.setproperty("FtpproxyHost", host);
    System.setproperty("Ftpproxyport", port);
  }
}

对现有Java网络应用程序的代理环境的配置
写到这里,读者可能要问,如果一个Java网络应用程序已经编写并编译好了,这个应用程序没有考虑代理服务器问题,有没有其他办法让该程序也能正确运行?答案是有的!Java.exe 提供了装载Java应用程序时候,同时设置JVM环境变量的方法,使用Java -d= *.class,可以设置JVM的环境变量,从而保证应用程序的正确运行!如使用: java -Dhttps.proxySet=true *.class 当然,采用让用户在Java命令行下,配置Java应用程序,可以使程序运行,但对用户的水平要求较高,并不是一种好的发布程序的方法。

结束语
一个好的Java网络应用程序,不但要适应各种操作系统平台,而且要适应各种网络环境(如:代理环境),通过环境配置文件可以提高Java网络应用程序的健壮性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值