Jsch ScpTo示例说明

3

我一直在阅读Jsch ScpTo Example,但是我不太理解他们所做的部分。更具体地说,我不太理解checkAck方法的工作原理。

checkAck方法:

static int checkAck(InputStream in) throws IOException{
    int b=in.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;
        do {
            c=in.read();
            sb.append((char)c);
        }
        while(c!='\n');
        if(b==1){ // error
            System.out.print(sb.toString());
        }
        if(b==2){ // fatal error
            System.out.print(sb.toString());
        }
    }
    return b;
}

似乎这是在引用TCP协议中的ACK标志。然而,阅读TCP协议后发现,在TCP头中发送了相当大量的内容。但是,当调用该方法时,它并不需要对所有内容进行排序并提取标志。它只是假设ACK标志将成为流中的下一个整数。
有人能解释一下以下哪个适用:
1. 为什么这种假设是有效的, 2. 提取标志的正确方式, 3. 如何确保输入流在调用该方法之前始终处于正确的标志位置,或者 4. 如果这与TCP ACK标志无关,那么它与什么有关?
1个回答

1

ScpTo.javaSCP协议的一个实现。

标志位checkAck方法读取的是来自服务器的SCP协议响应(ack)。

它与TCP没有任何关系,TCP在协议栈中比SSH层低两层,被Java和操作系统隐藏起来,因此JSch主要是通过SSH层进行传输。

我认为遗憾的是,没有SCP协议规范。您只能参考OpenSSH scp代码中对SCP的典型实现来了解该协议。

简而言之:服务器对客户端发送的每个命令都会用单字节“ack”作出响应,其中:

  • 0x00表示成功
  • 0x01表示错误
  • 0x02表示致命错误

如果可能,强烈建议您不要使用SCP,而是使用SFTP,因为SFTP是JSch(以及其他SSH实现)原生支持的。


感谢澄清。不幸的是,我不能使用SFTP。SCP是我正在处理的项目中唯一允许的文件传输协议。 - Davis Broda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接