WEB开发网
开发学院软件开发Java 使用 Java Socket 编程实现开放平台与 IBM 主机的... 阅读

使用 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 = ip

清单 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 的配置文件  

上一页  1 2 3 4  下一页

Tags:使用 Java Socket

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接