JSch库中SCP协议实现说明 [英] Explanation for SCP protocol implementation in JSch library
问题描述
我正在考虑一个 JSch 库使用示例,可以在这里找到:
http://www.jcraft.com/jsch/examples/ScpFrom.java.html
我无法从这个例子中理解几个代码模式.他们在这里:
是否有任何理由更喜欢 SCP 而不是 SFTP,后者可以使用相同的库运行?
为什么我们在远程主机上运行
scp -f
而不是简单地运行scp source_file_path destination_file_path
?为什么在远程主机上执行更好?在传输的开头有一行
while(true){int c=checkAck(in);如果(c!='C'){休息;}...
这个神奇的
C
字母是什么意思?为什么是C
?为什么一直发送这个信号?
//发送' 'buf[0]=0;out.write(buf, 0, 1);out.flush();
如何读取文件大小?
长文件大小=0L;而(真){if(in.read(buf, 0, 1)<0){//错误休息;}if(buf[0]==' ')break;文件大小=文件大小*10L+(long)(buf[0]-'0');//这是什么??}
- 是否有任何理由更喜欢 SCP 而不是 SFTP,后者可以使用相同的库运行?
不,SCP 协议已过时.现在您应该始终使用 SFTP.
尽管 SFTP 协议的简单实现往往比 SCP 的传输速度慢(由于其数据包性质,有效地实现 SFTP 传输并不容易).
<块引用>- 为什么我们在远程主机上运行
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
程序.
- 这个神奇的C字母是什么意思?为什么是 C?
SCP 协议的每个命令都由一个字符标识.C
代表文件传输",D
代表目录传输",文件传输前的T
表示下一个传输文件的修改时间等.我不知道为什么它是 C
而不是例如 F
.
- 为什么要一直发送这个信号?
NULL (