2013-06-07 1 views
0

JSch를 사용하여 원격 호스트에서 SCP를 시도하고 있습니다. 내가 성공적으로 자바 STS IDE에서 파일 양식 원격 호스트를 복사했습니다. 그러나 SOAP UI를 사용하여 실행중인 Groovy 스크립트에서 실행하려고하면 다음과 같은 오류가 발생합니다.groovy를 사용하는 원격 호스트의 SCP

Fri Jun 07 16:53:02 IST 2013:INFO:Exception : groovy.lang.MissingMethodException: No signature of method: java.lang.Byte.minus() is applicable for argument types: (java.lang.String) values: [0] 
Possible solutions: minus(java.lang.Number), minus(java.lang.Character), plus(java.lang.String), plus(java.lang.Character), plus(java.lang.Number), times(groovy.lang.Closure) 

내 코드는 다음과 같습니다

import com.jcraft.jsch.*; 
import java.io.*; 
import java.lang.*; 


    FileOutputStream fos=null; 
    try{ 

     String user="soapui"; 
     String host="192.168.1.1"; 
     String rfile="//bin//output.txt"; 
     String lfile="E://temp1.txt"; 

     String prefix=null; 
     if(new File(lfile).isDirectory()){ 
     prefix=lfile+File.separator; 
     } 

     JSch jsch=new JSch(); 
     Session session=jsch.getSession(user, host, 22); 

     // username and password will be given via UserInfo interface. 
     UserInfo ui=new MyUserInfo(); 
     session.setUserInfo(ui); 
     session.connect(); 

     // exec 'scp -f rfile' remotely 
     String command="scp -f "+rfile; 
     Channel channel=session.openChannel("exec"); 
     ((ChannelExec)channel).setCommand(command); 

     // get I/O streams for remote scp 
     OutputStream out=channel.getOutputStream(); 
     InputStream ins=channel.getInputStream(); 

     channel.connect(); 

     byte[] buf=new byte[10240]; 

     // send '\0' 
     buf[0]=0; out.write(buf, 0, 1); out.flush(); 

     while(true){ 
    int c=checkAck(ins); 
     if(c!='C'){ 
     break; 
    } 

     // read '0644 ' 
     ins.read(buf, 0, 5); 

     long filesize=0L; 
     while(true){ 
      if(ins.read(buf, 0, 1)<0){ 
      // error 
      break; 
      } 
      if(buf[0]==' ')break; 
      //char c1='0'; 
      //long tmp=Long.valueOf(buf[0]-'0'); 
      **filesize=filesize*10L+(long)(buf[0]-'0');** 
     } 

     String file=null; 
     for(int i=0;;i++){ 
      ins.read(buf, i, 1); 
      if(buf[i]==(byte)0x0a){ 
      file=new String(buf, 0, i); 
      break; 
     } 
     } 

    log.info("filesize="+filesize+", file="+file); 

     // send '\0' 
     buf[0]=0; out.write(buf, 0, 1); out.flush(); 

     // read a content of lfile 
     fos=new FileOutputStream(prefix==null ? lfile : prefix+file); 
     int foo; 
     while(true){ 
      if(buf.length<filesize) foo=buf.length; 
     else foo=(int)filesize; 
      foo=ins.read(buf, 0, foo); 
      if(foo<0){ 
      // error 
      break; 
      } 
      fos.write(buf, 0, foo); 
      filesize-=foo; 
      if(filesize==0L) break; 
     } 
     fos.close(); 
     fos=null; 
     log.info("Closing Stream"); 

    if(checkAck(ins)!=0){ 
     System.exit(0); 
    } 

     // send '\0' 
     buf[0]=0; out.write(buf, 0, 1); out.flush(); 
     } 

     session.disconnect(); 

     System.exit(0); 
    } 
    catch(Exception e){ 
     log.info("Exception : " + e); 
     try{if(fos!=null)fos.close();}catch(Exception ee){} 
    } 


    static int checkAck(InputStream ins) throws IOException{ 
    int b=ins.read(); 
    // b may be 0 for success, 
    //   1 for error, 
    //   2 for fatal error, 
    //   -1 
    if(b==0) return b; 
    if(b==-1) return b; 

    if(b==1 || b==2){ 
     StringBuffer sb=new StringBuffer(); 
     int c; 
    while(c!='\n') { 
    c=ins.read(); 
    sb.append((char)c); 
     } 

     if(b==1){ // error 
    System.out.print(sb.toString()); 
     } 
     if(b==2){ // fatal error 
    System.out.print(sb.toString()); 
     } 
    } 
    return b; 
    } 

    public class MyUserInfo implements UserInfo{ 
    public String getPassword(){ return passwd;} 
    public boolean promptYesNo(String str){return true;} 
    String passwd="123"; 
    public String getPassphrase(){return null;} 
    public boolean promptPassphrase(String message){return true;} 
    public boolean promptPassword(String message){return true;} 
    public void showMessage(String s){}; 
    } 

내가 디버깅 한 것은 코드의 라인 filesize=filesize*10L+(long)(buf[0]-'0');에 끝내 실패하고 예외 groovy.lang.MissingMethodException를 생성하는 없습니다 : 방법의 어떤 서명 : java.lang.Byte.minus(). 이 문제에 대한 해결책을 제안하십시오.

+1

무엇을하려고합니까? 바이트 배열에서 String 0을 빼는 이유는 무엇입니까? 그것이 숫자 일지라도, 왜 그런 식으로합니까? –

답변

1

groovy에서 '0'은 문자 또는 바이트가 아닌 문자열 상수입니다. 바이트에서 String을 뺄 수 없습니다. 숯불로 변환하거나 첫 번째 바이트 사용

byte b = 51 // ASCII '3' 
assert b - ('0' as char) == 3 
assert b - '0'.bytes[0] == 3 

바이트가 Character.digit()를 사용하는 것입니다에서 자리를 얻을 수있는 더 좋은 방법입니다. 예 :