在Android上使用JSch从SFTP文件传输进行慢速传输
我使用JSch在Android中执行SFTP下载。这是在一个具有802.11n的局域网和一个有线千兆连接的SFTP服务器上。使用相同的代码,我在笔记本电脑(也是802.11n)上的速度约为8Mbytes/sec,但在Android上的速度仅为40kbytes/sec。是否需要打开一些标志或其他东西来加快传输速度?我已经在Nexus5和Nexus6上试过了,都是5.1版本。我尝试了几个应用程序,其中一个以230kbytes/sec的速度下载了文件,另一个大约40kbytes/sec,所以我猜其中一个也有同样的问题 这是我的密码:在Android上使用JSch从SFTP文件传输进行慢速传输,android,ssh,sftp,jsch,android-networking,Android,Ssh,Sftp,Jsch,Android Networking,我使用JSch在Android中执行SFTP下载。这是在一个具有802.11n的局域网和一个有线千兆连接的SFTP服务器上。使用相同的代码,我在笔记本电脑(也是802.11n)上的速度约为8Mbytes/sec,但在Android上的速度仅为40kbytes/sec。是否需要打开一些标志或其他东西来加快传输速度?我已经在Nexus5和Nexus6上试过了,都是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();
}
}
编辑:如果我告诉它在不给我输入流的情况下将流写入一个文件,速度似乎要快得多(大约160kbytes/sec)。这两种
get
方法的代码看起来非常不同,但即使我采用了这一方法,160kbytes/sec仍然比我希望的慢得多 你在用哪个版本的Android进行测试?你能进来看看这些设置是什么吗(当你使用wifi时)
然后,如果它们较低(如“4092 8760 11680”),则尝试将它们设置为较大的值:
sudo echo "524288,1048576,2097152" > /proc/sys/net/ipv4/tcp_rmem
sudo echo "262144,524288,1048576" > /proc/sys/net/ipv4/tcp_wmem
然后再试一次
这可能是由于wifi缓冲区在某些情况下设置得太小()造成的。您是否尝试过将流包装到缓冲流中
BufferedInputStream bis = new BufferedInputStream(channel.get("file", monitor));
8192字节看起来像一个小缓冲区
还要确保您关闭了连接/流,可能您有很多不知道的传出连接占用了硬件?您可能已经耗尽了硬件。看看你是否可以收集CPU/IO数据。也许是这样,但我只看到我的GS3测试设备的使用率只有40%到60%,这是性能最差的。Nexus 4和Nexus 6的速度非常相似。我刚刚确认这不是硬件限制,另一个名为sshj的库可以以超过1mbyte/sec的速度下载文件。使用新字节[8192]:将大小从1k改为32k(1,2,4,8,16,32),看看是否有区别。除了硬件,你还可能在网络层面上遇到延迟、包碎片等问题。我尝试了许多不同的大小,也将其包装在缓冲区中,但似乎都没有效果。使用他们的方法下载到outputstream,我确实获得了更好的速度,但与sshj相比,速度仍然非常慢。还有一个应用程序可以为您设置这些值(它仍然需要根访问):嗯,我看看是否可以找到一个设备来测试它,我的所有测试设备都没有根目录。请尝试至少对文件进行分类,您可以查看它们是否设置了小缓冲区(我相信您可以在没有根目录的情况下执行此操作)在Nexus 4上,rmem有524288 1048576 2097152和wmem 262144 524288 1048576。我不知道你是否看到了我与其他人交换的其他消息,但基本上,手机中的其他应用程序也可以使用SFTP获得很好的速度,而一个名为sshj的库在同一部手机上的速度约为1 mbyte/sec。我现在换成sshj。是的,我试过用几种尺寸的包装。它发生在多部手机上,在测试之前,我已经将手机上的所有应用程序都杀掉了。正如我在另一篇评论中所说的,sshj的速度要快得多,所以我现在要转向这一点。
BufferedInputStream bis = new BufferedInputStream(channel.get("file", monitor));