使用 Java Socket 编程实现开放平台与 IBM 主机的文件传输
2012-03-16 15:30:03 来源:WEB开发网- IMS 及 IMS Connect 的环境及架构
IMS 是 IBM 的一个软件产品,具有为大型商业应用系统提供事务管理和数据库管理的功能,最初发布于 1968 年,是一个历史悠久的产品。IMS 由数据通信管理器(IMS TM,最初称为 DC),数据库管理器(DB)及一套系统服务设施组成。
IMS 是一个层次型数据的管理系统,只能运行在 z/OS 系统上。DB 主要负责支持 IMS 的层次型数据库模型,它为应用层提供了存储数据库的 API 并且保持数据库的一致性。应用层不需要知道数据库的底层组织,因为有 Data Language/Interface(DL/I,类似于 SQL 的 API)将其分离。而 IMS TM 负责与应用程序进行交互,通过消息队列保持整个通信的顺畅,当然在入队和出队时也会调用到 DL/I 的 API。系统服务组件 TM 和 DB 提供公用的服务,以保持两者的正常工作。图 4 描述了整个 IMS 的简要架构。
图 4. IMS 结构的简略图
IMS Connect 是一个 IMS 的通信组件。通过 IMS Connect 可以使多个 IMS 系统与多个 IMS Connect 的客户端程序保持高效的 TCP/IP 的通信。可以简单把 IMS Connect 理解为外部客户端需要访问的 IMS TCP/IP 服务器。通过这个服务器,任何的 TCP/IP 客户端程序可以与 IMS 建立连接。目前,IMS Connect 对 IMS TM 和 IMS DB 都是支持的。图 5 描述了 IMS Connect 组件在整个 IMS 系统中的位置。图中的 OTMA 是开放事务管理访问,是一个访问协议,ODBM 是开放数据库管理器,负责数据库端的接口。
图 5. IMS Connect 组件的位置
由于 IMS Connect 是一个 TCP/IP 的服务器,就一定需要开放相应的端口,让客户端程序能够与之通信。IMS Connect 有自己的配置文件,在配置文件中能够自定义需要开放的端口,以及一些 TCP/IP 的 Socket 连接的缓冲设置等。
面临的问题
本文涉及的这个项目正是针对 IMS Connect 配置文件升级的测试。由于 IMS Connect 配置文件更新了,相应的 IMS Connect 作为 TCP/IP 服务器所表现的一些特征也会改变。本文以 IMS Connect 的最大 Socket 连接数配置参数(MAXSOC)为例进行说明。
测试的流程如下:
- 创建 IMS Connect 配置文件 HWSCFG01
- 设置 HWSCFG01 中的 MAXSOC = 60(默认值 50)
- 使用 HWSCFG01 配置文件重新启动 IMS Connect
- 输入 IMS Connect 查看配置参数命令(VIEWHWS),查看 IMS Connect 的最新参数 MAXSOC 是否已经和预期的 60 匹配
- 输入 IMS Connect 查看工作状况的命令(QUERY MEMBER),确保 IMS Connect 按照新的 MAXSOC 参数工作
- 模拟客户端程序发送最大值的 Socket 连接测试 IMS Connect 能按照预期的工作,当到达峰值时拒绝连接。
按照这个测试流程,本文需要实现的情况是在开放平台上创建多个配置文件(HWSCFG01 ~ HWSCFGxx),以边界值测试法尽量覆盖可能的最大 Socket 参数,确保 IMS Connect 正确的工作。图 6 描述了这个测试环境的示意图。
图 6. 项目测试环境示意图
如果所有的工作都在主机环境上进行无疑会减少很多不必要的麻烦,但是由于测试的后续工作主要在模拟客户端发送 Socket 连接以及判断测试是否被拒绝上,所以项目经理选择了在开放平台上做这个交互式的测试。所以本项目的前期工作无疑是解决如何在开放平台与 IBM 大型主机之间进行文件传输的问题。
解决方法及实现细节
本文在测试 IMS Connect 项目时,使用了 Rational Functional Tester(RFT) 和 Rational Functional Tester Extension (FTE,一个 z/OS 终端 3270 和 5250 的模拟界面)两个工具。根据 FTE 的界面,另外有一个 TerminalUtility 的工具 Jar 包,用于对 FTE 进行必要输入和操作。
在 RFT 中使用的自动化测试脚本实际上是 Java 语言的 Script,所以要本文在解决开放平台和 IBM 大型主机之间文件传输问题也采用 Java 语言实现。要将之前所述的测试流程自动化,需要在测试流程 1 之后加入关键的一步,即使用 Java 实现将开放平台的配置文件上传至 IMS Connect 需要读取配置文件的功能。这个功能在底层将会用到 FTP 协议,所以可以按照 FTP 协议的要求来逐步完成。
首先,需要获得 IMS Connect 所在主机 IP 地址,在本案例中将会使用 IMS Connect 的产品的特有命令 QUERY MEMBER 来查看 IMS Connect 的运行状况,从而获得 IP 地址。如下图所示 :
为了用 Socke 编程实现文件通过 FTP 协议上载文件的功能,本文创建了 FTPUpload 类。代码 2 给出该类的结构:
清单 2. FTPUpload 类结构:
public class FTPUpload { String ipAddress; // 需要上传文件的 Server 的 IP address String remotDir; // 需要上传文件到主机的目录 String localFilePath; // 需要上传的开放平台文件路径 String userName; // 用户名 String passWord; // 密码 Socket controlSocket;// 控制用 Socket public PrintWriter controlOutput;// 控制输出用的流 public BufferedReader controlInput;// 控制输入用的流 final int controlPort = 21;// FTP 的控制用端口 ServerSocket serverDataSocket; // 构造函数 FTPUpload(String ipAddress, String username, String password, String remotDir, String localFilePath ){ …… } // 由 ipAddress 和 controlPort 号构造 Socket,形成控制用的流 public void openConnection(String host) throws IOException, UnknownHostException { …… } // 关闭控制用的 Socket public void closeConnection() throws IOException { …… } // 登陆 FTP 服务器 public void login() { …… } // 改变远程的目录 public void changeRemDir() { …… } // 将文件由本地上传至服务器 Public void uploadFile(String remoteFileName){ …… } // 构造与服务器交换数据用的 Socket // 再用 PORT 命令将端口通知服务器 public Socket dataConnection(String ctrlcmd) { …… } // 根据 type 的输入选择不同的传输类型(1-ASCII 2-Binary) public void transferType(int type){ …… } …… …… }
从结构可以看出,该类有十个基本属性。其中,IBM 主机的 IP 地址、需要的访问账号、密码,本地需要上传的文件目录以及上传需要的远程路径,这个五个属性需要在构造该类的时候给出以便其他方法的执行:
更多精彩
赞助商链接