【发布时间】:2015-07-18 18:08:21
【问题描述】:
我正在使用 JSch 在 Android 中执行 SFTP 下载。这是在具有 802.11n 的 LAN 和有线千兆位连接上的 SFTP 服务器上。我在具有相同代码的笔记本电脑(也是 802.11n)上获得大约 8 mbytes/sec,但在 Android 上我只能获得 40kbytes/sec。是否有一些标志或我需要打开的东西才能让它更快地传输?我已经在 Nexus 5 和 Nexus 6 上尝试过,两者都是 5.1。我尝试了几个应用程序,一个以 230kbytes/sec 的速度下载了文件,另一个以 40kbytes/sec 的速度下载了文件,所以我猜其中一个与我有同样的问题。
这是我的代码:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Thread thread = new Thread() {
@Override
public void run() {
try {
JSch jsch = new JSch();
jsch.setConfig("StrictHostKeyChecking", "no");
Session session = jsch.getSession("ftptest", "192.168.1.205");
session.setPort(22);
session.setPassword("password");
session.connect();
ChannelSftp channel = (ChannelSftp) session.openChannel("sftp");
channel.connect();
SftpProgressMonitor monitor = new SftpProgressMonitor() {
long finalCount = 0;
long start = -1;
@Override
public void init(int op, String src, String dest, long max) {
start = System.currentTimeMillis();
}
@Override
public boolean count(long count) {
finalCount += count;
/* long took = (System.currentTimeMillis() - start) / 1000;
if (took > 0) {
Log.w("SFTP", "Transferred so far " + finalCount + " at speed bytes/sec " + (finalCount / took));
}*/
return true;
}
@Override
public void end() {
long took = (System.currentTimeMillis() - start) / 1000;
Log.w("SFTP", "Transferred " + finalCount + " in " + took + " speed bytes/sec " + (finalCount / took ));
}
};
InputStream stream = channel.get("file", monitor);
int read = -1;
byte[] bs = new byte[8192];
while((read = stream.read(bs)) >= 0){
//do nothing
}
} catch (JSchException e) {
e.printStackTrace();
} catch (SftpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
};
thread.start();
}
}
编辑:如果我告诉它在不给我 InputStream 的情况下将流写入文件,它似乎要快得多(大约 160kbytes/sec)。两种get 方法之间的代码看起来非常不同,但即使我走那条路,160kbytes/sec 仍然比我希望的要慢得多。
【问题讨论】:
-
您可能会用尽硬件。看看你是否可以收集 CPU/IO 数据。
-
也许是这样,但我在我的 GS3 测试设备上只看到大约 40% 到 60% 的使用率,这是表现最差的。 Nexus 4 和 Nexus 6 的速度非常相似。
-
我刚刚确认这不是硬件限制,另一个名为 sshj 的库可以以超过 1mbyte/sec 的速度下载文件。
-
玩转新字节[8192]:将大小从 1k 到 32k (1,2,4,8,16,32) 不同,看看是否有区别。除了硬件之外,您还可能在网络级别遇到延迟、包碎片等问题
-
我尝试了许多不同的尺寸并将其包装在缓冲区上,但似乎都没有帮助。使用他们下载到输出流的方法,我确实获得了更快的速度,但与 sshj 相比,它仍然非常慢。
标签: android ssh sftp jsch android-networking