0

I am using Apache Mina SSHD to communicate with two Android devices. I have server-side code and client-side I'd like to establish a connection and start streaming data (byte array packet) from server to client and client to server until a button pressed to disconnect. How can I do this?

SERVER

I use this link SSHD SERVER stackOverflow

public void startSSHServer() {
    int port = 22;
    SshServer sshd = SshServer.setUpDefaultServer();
    sshd.setPort(port);
    sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(
            "src/test/resources/hostkey.ser"));
    sshd.setSubsystemFactories(Arrays
            .<NamedFactory<Command>>asList(new SftpSubsystem.Factory()));
    sshd.setCommandFactory(new ScpCommandFactory());
    sshd.setShellFactory(new ProcessShellFactory(new String[]{"/system/bin/sh", "-i", "-l"})); // necessary if you want to type commands over ssh
    sshd.setPasswordAuthenticator(new PasswordAuthenticator() {

        @Override
        public boolean authenticate(String u, String p, ServerSession s) {
            return ("sftptest".equals(u) && "sftptest".equals(p));
        }
    });

    try {
        sshd.start();
    } catch (IOException e) {
        e.printStackTrace();
    }
 }

CLIENT

I use this link SSHD CLIENT geeksforgeeks

Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            // Connection establishment and authentication
            try (ClientSession session = client.connect(username, host, port).verify(10000).getSession()) {
                session.addPasswordIdentity(password);
                session.auth().verify(50000);
                System.out.println("Connection establihed");

                // Create a channel to communicate
                channel = session.createChannel(Channel.CHANNEL_SHELL);
                System.out.println("Starting shell");

                ByteArrayOutputStream responseStream = new ByteArrayOutputStream();
                channel.setOut(responseStream);

                
                // Open channel
                channel.open().verify(5, TimeUnit.SECONDS);
                try (OutputStream pipedIn = channel.getInvertedIn()) {
                    pipedIn.write(command.getBytes());
                    pipedIn.flush();
                }

                // Close channel
                channel.waitFor(EnumSet.of(ClientChannelEvent.CLOSED),
                        TimeUnit.SECONDS.toMillis(5));

                // Output after converting to string type
                String responseString = new String(responseStream.toByteArray());
                System.out.println(responseString);
                shellOutput.setText(responseString);

            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                client.stop();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});
thread.start();
Mark Rotteveel
  • 100,966
  • 191
  • 140
  • 197
CodeBlack
  • 1
  • 2

0 Answers0