JSch库中SCP协议实现的说明

我正在考虑一个JSch库使用的例子,可以在这里找到:
http://www.jcraft.com/jsch/examples/ScpFrom.java.html

我无法理解此示例中的几种代码模式。 他们来了:

  1. 是否有任何理由偏爱SF而不是SFTP,可以使用同一个库运行?

  2. 为什么我们在远程主机上运行scp -f 而不是简单地运行scp source_file_path destination_file_path ? 为什么在远程主机上执行更好?

  3. 在转移的开始有一条线

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

    这个神奇的C字母是什么意思? 为何选择C

  4. 为什么要一直发送这个信号?

     // send '\0' buf[0]=0; out.write(buf, 0, 1); out.flush(); 
  5. 这怎么可以读取文件大小?

     long filesize=0L; while(true){ if(in.read(buf, 0, 1)<0){ // error break; } if(buf[0]==' ')break; filesize=filesize*10L+(long)(buf[0]-'0'); //What is this?? } 

  1. 是否有任何理由偏爱SF而不是SFTP,可以使用同一个库运行?

不,SCP协议已经过时了。 你现在应该总是使用SFTP。

尽管SFTP协议的简单实现往往比SCP具有更慢的传输(由于其数据包性质,很难有效地实现SFTP传输)。

  1. 为什么我们在远程主机上运行scp -f 而不是简单地运行scp source_file_path destination_file_path ? 为什么在远程主机上执行更好?

这是SCP协议的工作方式。 OpenSSH scp二进制文件既可用作服务器,也可用作客户端。 因此,当您在本地运行scp ,它通过SSH连接并在服务器上运行scp 。 然后这两个实例相互通信。 JSch替换了scp的本地实例。 但它仍然需要远程实例来完成传输。

如果您在本地运行scp ,则必须在计算机上安装OpenSSH。 什么在Unix上可能很常见,但绝对不是在Windows上。 此外,没有简单/标准化的方法来捕获scp程序的结果,将它们转换为JSch Java接口。 这与JSch(或任何其他SFTP库)自己实现SFTP协议的原因相同,而不是使用sftp程序。

  1. 这个神奇的C字母是什么意思? 为何选择C?

SCP协议的每个命令都由一个字符标识。 C表示“文件传输”, D表示“目录传输”,文件传输之前的T表示下一个传输文件的修改时间等。我不知道为什么它是C而不是例如F

  1. 为什么要一直发送这个信号?

NULL( \0 )字符命令是对收到的命令完成的其他站点的确认/响应。

  1. 这怎么可以读取文件大小?

C命令有语法(它是一个人类可读的字符串):

 C permissions size filename 

例如:

 C 0644 153634 index.php 

代码中的循环将字符串"153634"转换为数字153634.它看起来有点太复杂的实现,但它的工作原理。