在Android上使用JSch从SFTP文件传输进行慢速传输

在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,所以我猜其中一

我使用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));