使用 Java Socket 编程实现开放平台与 IBM 主机的文件传输
?
引言
示例必备条件
示例需要的环境:
?
概念介绍
Socket
在网络出现之前的单机系统时代,更多的是进程之间的通信。由于每个进程有自己的地址空间,为了保证两个进程的通信互不干扰又协调工作,操作系统提供了相应的设施。如 UNIX 系统中的管道(pipe)、命名管道(named pipe)和软中断信号(signal)。而在网络中,两个不同计算机中的进程需要通信首先要解决的是进程识别的问题。同一主机上,不同进程可以用进程号(process ID)作为唯一标识,但是在网络的环境里不同的主机上完全可以用同一进程号,所以这种方法来区别进程是不可行的。另外 , 操作系统支持的网络协议很多,不同的协议的工作方式是不一样的,包括网络的地址格式也不同。因此,还需要考虑不同网络协议的识别问题。
这个问题催生了 Socket。Socket 又称为“套接字”,用于描述网络地址与端口,它是一个通信的接口。它是应用层与 TCP/IP 协议族通信的中间的软件抽象层,它位于运输层和网际层之上,又位于应用层之下,作为一个抽象层存在。在设计模式中,可以把 Socket 的设计想象成“门面模式”。它把负责的 TCP/IP 协议族隐藏在 Socket 接口的后面,对用户而言,之需要找到 Socket,然后后面的事就让 Socket 的去组织。图 1 描述了 Socket 的作用和所处的位置。
图 1. Socket 抽象层的位置
?
FTP 传输协议
FTP(File Transfer Protocol) 远程文件传输协议是众多应用层协议的一种。它工作在 OSI 模型的第七层,TCP 模型的第四层,即应用层。它是为了简化 IP 网络上系统之间文件传送的协议,所以与两台计算机所处的位置,连接的方式甚至是否使用同样的操作系统是无关的。这也正符合本文研究的开放平台与 IBM 主机环境传输文件的问题背景。
相比于 HTTP(HyperText Transfer Protocol,超文本传输协议),FTP 协议工作需要两个端口(HTTP 需要一个端口 80),一个端口是作为控制连接端口,也就是 21 端口,用于发送指令给服务器以及等待服务器响应;另一端口是 20(仅限于 PORT 模式),用于数据的传输,主要作用是从客户向服务器发送文件的。
下面给出了 Passive 模式和 Port 模式的示例图 :
图 2. Port 模式 端口示意图
?
图 3. Passive 模式 端口示意图
?
Java Socket 编程
要想用 Java 来实现 Socket 这种客户机到服务器的模型,其实并非难事。Java 的 JDK 中有很多 API 帮助程序员来实现这个模型,这些 API 封装在 java.net 这个包里。正是由于这些 API 的存在,使用 Java 来创建您所在位置的 Server 十分简单。
?项目面临的问题
本文的研究背景是一个正在实施的项目,所以具有一定的现实意义。该项目是对一个具有 40 多年历史的 IBM 主机层次型数据库产品 - IMS 的一个通信组件 IMS Connect 进行自动化测试。本节将首先简要介绍 IMS 及 IMS Connect 的环境及架构,然后描述自动化测试面临的问题。
- 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 类结构:
?
应用及验证
本节将就之前描述的项目背景测试的流程,使用上一节的方法来实现。在本项目中,通过 FTE 的界面使用 TSO 登陆远程的 IBM 主机的测试环境。在测试环境中,IMS Connect 产品使用 USER.PRIVATE.PROCLIB 的 DataSet 作为配置文件的目录。首先验证,在没有上传需要测试的配置文件时,该目录下的情况如下图,可以看出该 DataSet 中目前只有 HWSCFA01 和 SQARCJCL 两个 Member:
图 7. 上传文件之前 USER.PRIVATE.PROCLIB 目录下的 Datasets
?需要上传的 IMS Connect 的配置文件如下,以测试 MAXSOC 为例,修改 MAXSOC 为 60:
图 8. IMS Connect 的配置文件
?需要执行的自动化脚本会调用本文实现的 FTPUpload 类的 uploadFile 方法,代码 6 给出了部分脚本:
清单 6 自动化脚本示例?执行脚本之后,重新登陆 TSO,查看相应的目录,新的 IMS Connect 配置文件已经上传成功。
图 10. 上传文件之后 USER.PRIVATE.PROCLIB 目录下的 Datasets
?在 FTPUpload 中加入相应的输出 FTP 反馈信息的函数,可以在脚本运行完后可以从 console 窗口打印出 FTP 上传的过程,如下是 console 的部分打印信息:
图 11. RFT 运行脚本的后台输出
?推广应用
在本文中,基于项目的需求通过 Java Socket 编程实现了从开放平台到 IBM 主机环境的文件传输的 upload 的功能。基于 FTP 的命令其实有很多,一些常用的如下:
命令描述ABOR中断数据连接程序ACCT <account>系统特权帐号CDUP <dir path>改变服务器上的父目录MODE <mode>传输模式(S= 流模式,B= 块模式,C= 压缩模式)NOOP无动作,除了来自服务器上的承认PASV请求服务器等待数据连接REIN重新初始化登录状态连接SMNT <pathname>挂载指定文件结构DELE <filename>删除服务器上的指定文件PWD显示当前工作目录NLST <directory>列出指定目录内容RETR <filename>从服务器上找回(复制)文件
表 1.FTP 常用命令
根据不同的场景,可以将 FTPUpload 进行扩展,在一些跨越两个环境的项目中,可能需要 download 的功能,或者需要上传二进制文件的功能等等,都可以对这种方法进行扩展,以实现不同项目的需求。
为了说明推广的可行性,代码 7 给出了 NLST 命令的示例:
清单 7 NLST 命令实现示例?总结
在 IBM 大型主机的发展的历程中,伴随的出现了许多主机的产品,例如 CICS、IMS、DB2 等等。这些大型主机的产品的许多配置文件,日志文件都被存在大型主机的 Dataset 中,对在开放平台上的测试人员来说无疑是一个巨大的挑战。当需要进行跨越不同环境的自动化测试时,不可避免的需要使用跨平台的文件传输协议。
本文以 IMS 的 IMS Connect 组件的自动化测试为场景,研究并实现了通过 Java Socket 编程实现的 FTP 文件传输的功能。该实现方法是对 FTP 传输协议客户端的实现,并且还有许多可以扩展的空间,是 Java Socket 编程初学者的较好的示例。本文给出了较为详细的代码示例,并演示和验证了代码的可行性。
最后,本文为可能面临同样的或类似问题的人提供了一些推广和扩展的思路,希望能有利于应用开发或者测试工程师更好的完成工作。