/** * Copyright 2003-2016 SSHTOOLS Limited. All Rights Reserved. * * For product documentation visit https://www.sshtools.com/ * * This file is part of J2SSH Maverick. * * J2SSH Maverick is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * J2SSH Maverick is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with J2SSH Maverick. If not, see <http://www.gnu.org/licenses/>. */ import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.text.DecimalFormat; import java.util.zip.Adler32; import java.util.zip.CheckedInputStream; import com.sshtools.net.SocketTransport; import com.sshtools.sftp.SftpClient; import com.sshtools.ssh.PasswordAuthentication; import com.sshtools.ssh.SshClient; import com.sshtools.ssh.SshConnector; import com.sshtools.ssh2.Ssh2Context; /** * This example demonstrates the performance differences using different cipher * algorithms and socket options. * * @author Lee David Painter */ public class PerformanceTest { static String hostname; static int port; static String username; static String password; static File sourceFile; static long sourceFileChecksum = -1; static File retreivedFile; static DecimalFormat df = new DecimalFormat("#.00"); public static void main(String[] args) { final BufferedReader reader = new BufferedReader(new InputStreamReader( System.in)); try { /** * Perform all the tests against the same host */ System.out.print("Hostname: "); hostname = reader.readLine(); int idx = hostname.indexOf(':'); port = 22; if (idx > -1) { port = Integer.parseInt(hostname.substring(idx + 1)); hostname = hostname.substring(0, idx); } System.out.print("Username [Enter for " + System.getProperty("user.name") + "]: "); username = reader.readLine(); if (username == null || username.trim().equals("")) username = System.getProperty("user.name"); System.out.print("Password: "); password = reader.readLine(); System.out.println("Creating test file"); createTestFile(); // Can only be enabled for servers that support no encryption // System.out.println("****No cipher****"); // performTest(getDefaultConfiguration("none", true)); System.out.println("****JCE Provider with 3DES****"); performTest(getJCEConfiguration(Ssh2Context.CIPHER_TRIPLEDES_CBC, false)); System.out.println("****JCE Provider with Blowfish****"); performTest(getJCEConfiguration(Ssh2Context.CIPHER_BLOWFISH_CBC, false)); System.out.println("****JCE Provider with AES****"); performTest(getJCEConfiguration(Ssh2Context.CIPHER_AES128_CBC, false)); System.out.println("Completed Tests"); } catch (Throwable t) { t.printStackTrace(); } } static void createTestFile() throws Throwable { /** * Generate a temporary file for uploading/downloading */ sourceFile = new File(System.getProperty("user.home"), "sftp-file"); java.util.Random rnd = new java.util.Random(); FileOutputStream out = new FileOutputStream(sourceFile); byte[] buf = new byte[1024000]; for (int i = 0; i < 100; i++) { rnd.nextBytes(buf); out.write(buf); } out.close(); CheckedInputStream cis = new CheckedInputStream(new FileInputStream( sourceFile), new Adler32()); try { byte[] tempBuf = new byte[16384]; while (cis.read(tempBuf) >= 0) { } sourceFileChecksum = cis.getChecksum().getValue(); } catch (IOException e) { } finally { cis.close(); } } static SshClient getJCEConfiguration(String cipher, boolean noDelay) throws Throwable { SshConnector con = SshConnector.createInstance(); con.getContext().setPreferredCipherCS(cipher); con.getContext().setPreferredCipherSC(cipher); SocketTransport transport = new SocketTransport(hostname, port); transport.setTcpNoDelay(noDelay); return con.connect(transport, username, true); } static SshConnector getConnector() throws Throwable { SshConnector con = SshConnector.createInstance(); return con; } static void performTest(SshClient ssh) throws Throwable { /** * Authenticate the user using password authentication */ PasswordAuthentication pwd = new PasswordAuthentication(); pwd.setPassword(password); ssh.authenticate(pwd); /** * Start a session and do basic IO */ if (ssh.isAuthenticated()) { System.out.println("Client info: " + ssh.toString()); SftpClient sftp = new SftpClient(ssh); sftp.setBlockSize(32768); sftp.setTransferMode(SftpClient.MODE_BINARY); /** * Create a directory for the test files */ sftp.mkdirs("sftp/test-files"); /** * Change directory */ sftp.cd("sftp/test-files"); /** * Put a file into our new directory */ long length = sourceFile.length(); long t1 = System.currentTimeMillis(); sftp.put(sourceFile.getAbsolutePath()); long t2 = System.currentTimeMillis(); long e = t2 - t1; float kbs; if (e >= 1000) { kbs = (((float) length / 1024) / ((float) e / 1000) / 1000); System.out.println("Upload Transfered at " + df.format(kbs) + " MB/s"); } else { System.out.println("Download transfered in under one second"); } /** * Download the file inot a new location */ File f2 = new File(System.getProperty("user.home"), "downloaded"); f2.mkdir(); sftp.lcd(f2.getAbsolutePath()); File retrievedFile = new File(f2, sourceFile.getName()); t1 = System.currentTimeMillis(); sftp.get(sourceFile.getName()); t2 = System.currentTimeMillis(); e = t2 - t1; if (e >= 1000) { kbs = (((float) length / 1024) / ((float) e / 1000) / 1000); System.out.println("Download Transfered at " + df.format(kbs) + " MB/s"); } else { System.out.println("Download transfered in under one second"); } long checksum2 = 0; CheckedInputStream cis = new CheckedInputStream( new FileInputStream(retrievedFile), new Adler32()); try { byte[] tempBuf = new byte[16384]; while (cis.read(tempBuf) >= 0) { } checksum2 = cis.getChecksum().getValue(); } catch (IOException ex) { } finally { cis.close(); } if (checksum2 != sourceFileChecksum) { System.out.println("FILES DO NOT MATCH"); } } } }