使用 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 的配置文件
更多精彩
赞助商链接