android - 使用JSch从Android上的SFTP文件传输进行慢速传输

标签 android ssh sftp jsch android-networking

我正在使用JSch在Android中执行SFTP下载。这是在具有802.11n的LAN和通过有线千兆连接的SFTP服务器上。在具有相同代码的笔记本电脑(也是802.11n)上,我的速度约为8兆字节/秒,但是在Android上,我的速度仅为40 KB /秒。是否有一些标志或我需要打开的东西才能使它更快地传输?我已经在Nexus 5和Nexus 6(均带有5.1)上进行了尝试。我尝试了几个应用程序,一个以230 KB /秒的速度下载了文件,另一个以40 KB /秒的速度下载了文件,所以我猜其中的一个与我有同样的问题。

这是我的代码:

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的话,它似乎要快得多(约160 KB /秒)。这两个get方法之间的代码看起来非常不同,但是即使我走了那条路,160 kbytes / sec仍然比我希望的慢得多。

最佳答案

您正在测试哪个版本的Android?您能否在 shell 中插入adb并查看这些设置是什么(当您使用wifi时)?

cat /proc/sys/net/ipv4/tcp_rmem
cat /proc/sys/net/ipv4/tcp_wmem

然后,如果它们较低(例如“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缓冲区设置得太小的错误(https://code.google.com/p/android/issues/detail?id=64706)。

关于android - 使用JSch从Android上的SFTP文件传输进行慢速传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30113430/

相关文章:

android - 保护android Assets 文件中的代码

ssh - 将 rsa 公钥复制到剪贴板

linux - 我可以以某种方式在网络上使用 plink 进行 SSH 检查吗?

java - 无法在 ubuntu 18.04 中使用 apache commons vfs for vsftpd 重命名文件

git - 如何将我的整个网站从测试区域复制到虚拟主机,而不会中断

java - Android:(亮度)设置更改后如何刷新屏幕

Android:如何将动画图像放置在我们可以显示和隐藏的 EditText 中

android - IllegalArgumentException : java. io.IOException : Cannot run program, 错误=13,权限被拒绝

svn - 如何为多个用户设置svn + ssh?

java - 从哪里获取 JSch 连接到 AWS EC2 的用户名/密码?