使用 Java Socket 编程实现开放平台与 IBM 主机的文件传输
2012-03-16 15:30:03 来源:WEB开发网引言
- 在网络世界中,网络中的节点间的信息的传递无疑是一个重要的环节。在 IBM 大型主机进入这个网络世界后,网络节点中的新成员又多了一种。要实现开放平台与 IBM 大型主机之间的数据通信其实并非难事,对于程序员而言,掌握一种实现模型和实现的接口就会使网络编程变得简单,易于实现。Java 的 JDK 就提供可一系列的 API 来完成网络编程。Socket 就是其中的一种。
- 本文的研究背景源于主机环境的 IMS 产品的 IMS Connect 组件的自动化测试的需求。该产品运行于主机环境,但是对于需要在开放平台进行自动化测试的工程师来说,数据的通信无疑是一个需要解决的问题。
- 本文首先会给出一些基本的概念,包括 Socket 编程、FTP 传输协议的基本概念及原理以及 Java 实现 Socket 编程的特点。然后将阐述 IMS Connect 项目面临的问题,即本文实现的背景环境。接着将给出这个背景下的解决方法和实现细节。然后以项目为背景应用及验证。最后本文会将该实现方法推广为通用的解决方法。
示例必备条件
示例需要的环境:
-
需要在 Windows 上安装的软件:
- Rational Functional Tester V7.0
-
需要在 IBM z/OS 上安装的环境:
- IMS Version 9 (或者更新的版本)
- IMS Connect Version 9 (或者更新的版本)
- OTMA
- TCP/IP
概念介绍
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 十分简单。
ServerSocket server=new ServerSocket(1234);
这样您就创建了一个 Server 的实例,另外要注意,端口从 0 到 65535 之间,但是前 1024 端口已经被 TCP/IP 作为保留端口,所以只能选择 1024 之后的端口。这段 code 就建立了以
1234 为端口的 Server。
Server 建立好了,现在需要的是一个 Client 来连接至刚才建立好的 Server。
Socket client = new Socket(InetAddress.getLocalHost(),1234);由于这个 Client 和 Server 处在同一台机器,所以使用 InetAddress.getLocalHost() 来获得本机的 IP 地址,如果您的 Server 是一个远程的机器,则可以使用它的 IP。例如:Socket client = new Socket( www.test.com, 4321); 此处的域名就是您需要连接的 Server 的 hostname。
建立连接之后,数据的传输还依赖于 Java 的 IO 相关的包,所以还必须引入 java.io 包。Java 的操作也并不复杂,它提供了字节流和 Unicode 的读写,也提供了一些缓冲用于数据的读写。代码 1 给出一个 Client 端的 Socket 编程示例:
清单 1. Client 端的 Socket 编程示例
public class Client { Socket socket; BufferedReader in; PrintWriter out; public Client() { try { socket = new Socket("xxx.xxx.xxx.xxx", 1234); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(socket.getOutputStream(),true); BufferedReader line = new BufferedReader(new InputStreamReader(System.in)); out.println(line.readLine()); line.close(); out.close(); in.close(); socket.close(); } catch (IOException e) { } } …… }
项目面临的问题
本文的研究背景是一个正在实施的项目,所以具有一定的现实意义。该项目是对一个具有 40 多年历史的 IBM 主机层次型数据库产品 - IMS 的一个通信组件 IMS Connect 进行自动化测试。本节将首先简要介绍 IMS 及 IMS Connect 的环境及架构,然后描述自动化测试面临的问题。
更多精彩
赞助商链接