使用 Java Socket 编程实现开放平台与 IBM 主机的文件传输
2012-03-16 15:30:03 来源:WEB开发网清单 3.FTPUpload 类构造函数
FTPUpload(String ipAddress, String username, String password,
String remotDir, String localFilePath ){
this.ipAddress = ipAddress;
this.userName = username;
this.passWord = password;
this.remotDir = remotDir;
this.localFilePath = localFilePath;
}
openConnection 方法通过构造的 IP 地址的属性和默认的 FTP 控制端口 21 初始化该类的另一个属性用于控制的 Socket(controlSocket),并且通过 controlSocket 生成需要相应的输入输出流实例。
清单 4 FTPUpload 类 openConnection 函数 :
public void openConnection() throws IOException,
UnknownHostException {
controlSocket = new Socket(ipAddress, controlPort);
controlOutput = new PrintWriter(
controlSocket.getOutputStream());
controlInput = new BufferedReader(
new InputStreamReader(controlSocket.getInputStream()));
}
doLogin、changeRemDir 和 uploadFile 三个方法是该类的重要方法,负责登陆服务器,改变远程目录和上传文件。dataConnection 方法的功能是建立用于数据传输的 Socket,uploadFile 方法将会调用这个方法来实现。
清单 5 FTPUpload 类 login,changeRemDir,uploadFile 和 dataConnection 函数 :
public void login() {
try {
controlOutput.println("USER " + userName);
controlOutput.flush();
controlOutput.println("PASS " + passWord);
controlOutput.flush();
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
public void changeRemDir () {
try {
controlOutput.println("CWD " + remotDir);// CWD 命令
controlOutput.flush();
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
public void uploadFile(String remoteFileName) {
try {
int n;
byte[] buff = new byte[1024];
FileInputStream sendfile = null;
// 准备读出客户端上的文件
try {
sendfile = new FileInputStream(localFilePath);
} catch (Exception e) {
System.out.println("文件不存在");
return;
}
// 准备发送数据的流
Socket dataSocket = dataConnection("STOR " + remoteFileName);
OutputStream outstr = dataSocket.getOutputStream();
while ((n = sendfile.read(buff)) > 0) {
outstr.write(buff, 0, n);
}
dataSocket.close();
sendfile.close();
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
public Socket dataConnection(String ctrlcmd) {
String command = "PORT ";
int i;
Socket dataSocket = null;
try {
// 本地 IP 地址
byte[] address = InetAddress.getLocalHost().getAddress();
// 使用任意端口构造传输的 socket,backlog 为 1
serverDataSocket = new ServerSocket(0, 1);
// 准备传送 PORT 命令用的数据
for (i = 0; i < 4; ++i)
command = command + (address[i] & 0xff) + ",";
command = command + (((serverDataSocket.getLocalPort()) / 256) & 0xff)
+ "," + (serverDataSocket.getLocalPort() & 0xff);
// 利用控制流先发送 PORT 命令
controlOutput.println(command);
controlOutput.flush();
// 发送控制命令
controlOutput.println(ctrlcmd);
controlOutput.flush();
dataSocket = serverDataSocket.accept();
serverDataSocket.close();
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
return dataSocket;
}
应用及验证
本节将就之前描述的项目背景测试的流程,使用上一节的方法来实现。在本项目中,通过 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 的配置文件
更多精彩
赞助商链接
