我正在使用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)。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!