当前位置: 首页 > 知识库问答 >
问题:

如何在另一个类中重用在AsyncTask中创建的SSH(Jsch)会话

刘运浩
2023-03-14

我是Android

我试图创建一个应用程序,它使用ssh连接连接到Beaglebone Black,然后通过发出来自Android设备的命令来控制连接到BBB的一些外围设备。我打开(成功)一个ssh会话在AsyncWork中,而用户看到一个闪屏,如果连接成功,用户将得到一个确认,然后将能够发送预定义的命令通过点击一些可用的按钮。

接下来我要做的是让会话保持打开状态,然后每次我希望发出命令并等待BBB的响应时创建一个新通道(exec或shell),但我不知道如何在AsynkTask之外重用此类ssh会话。

这可能吗?

我使用的是Android Studio 0.8.2和Jsch 0.1.51,我的代码如下:

公共类SplashScreen扩展了ActionBarActivity{

public static final int segundos =10;
public static final int milisegundos =segundos*1000;
public static  final int delay=2;
private ProgressBar pbprogreso;
@Override

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash_screen);
    pbprogreso= (ProgressBar)findViewById(R.id.pbprogreso);
    pbprogreso.setMax(maximo_progreso());
    empezaranimacion();
}

public void empezaranimacion()
{
    sshConnect task = new sshConnect();
    task.execute(new String[] {"http:"});

    new CountDownTimer(milisegundos,1000)

    {
        @Override
    public void onTick(long milisUntilFinished){
            pbprogreso.setProgress(establecer_progreso(milisUntilFinished));
        }
       @Override
    public void onFinish(){
           finish();
       }
    }.start();

}
public  int establecer_progreso (long miliseconds)
{
    return (int)((milisegundos-miliseconds)/1000);
}

public int maximo_progreso () {
    return segundos-delay;
}

public class sshConnect extends AsyncTask <String, Void, String>{
    ByteArrayOutputStream Baos=new ByteArrayOutputStream();
    ByteArrayInputStream Bais = new ByteArrayInputStream(new byte[1000]);
    @Override
    protected String doInBackground(String... data) {

        String host = "xxxxxxx";
        String user = "root";
        String pwd = "";
        int port = 22;
        JSch jsch = new JSch();
        try {
            Session session = jsch.getSession(user, host, port);
            session.setPassword(pwd);
            session.setConfig("StrictHostKeyChecking", "no");
            session.connect();

            ChannelExec channel = (ChannelExec)session.openChannel("exec");
            channel.setOutputStream(Baos);
            channel.setInputStream(Bais);
            //Run Command
            channel.setCommand("python ~/BBB_test/testconnect.py");
            channel.connect();
            try{Thread.sleep(3500);}catch (Exception ee){}
            channel.disconnect();
            //session.disconnect();
        }catch (Exception e){
            System.out.println(e.getMessage());
        }
        return Baos.toString();
    }
    @Override
    protected void onPostExecute(String result) {
        if (result.equals("Connected to BBB Baby!!\n")) {
            Intent nuevofrom = new Intent(SplashScreen.this, Principal.class);
            startActivity(nuevofrom);
            finish();
        } else {
            Intent newfrom = new Intent(SplashScreen.this, ConnecError.class);
            startActivity(newfrom);
            finish();

        }
    }
}

//这里是我想重用打开的会话并创建一个新通道的地方

public class sendCommand extends AsyncTask <String, Void, String >{
    ByteArrayOutputStream Baosc=new ByteArrayOutputStream();
    ByteArrayInputStream Baisc = new ByteArrayInputStream(new byte[1000])

    protected String doInBackground (String... command){
        try {
            ChannelExec channel2 = (ChannelExec)session.openChannel("exec");
            channel2.setOutputStream(Baosc);
            channel2.setInputStream(Baisc);
            //Run Command
            channel2.setCommand("python ~/BBB_test/testgpio.py");
            channel2.connect();
            try{Thread.sleep(3500);}catch (Exception ee){}
            channel2.disconnect();


        }catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return  Baosc.toString();
    }
    protected void onPostExecute(Long result) {
        TextView txt = (TextView) findViewById(R.id.infotext);
        txt.setText(result);

    }

}

如果还需要什么,请告诉我!(这是我第一次在论坛上提问)

非常感谢您的时间和支持!

共有2个答案

罗乐意
2023-03-14

如果你想重用会话,你不需要每次都重新连接频道。将其作为shell连接一次,将输入和输出流插入其中。使用流传递命令和捕获输出。

请参见JCraft网站上的JSCH示例。

  Channel channel=session.openChannel("shell");

  channel.setInputStream(System.in);
  channel.setOutputStream(System.out);

  channel.connect();
唐彦
2023-03-14

我设法通过使用DamienKnight的建议来获得我想要的在Asynk任务类之外创建会话。我用三种方法创建一个公共类来创建、返回和断开会话:

public static class cSession {
        String host = "xxx.xxx.xxx.xxx";
        String user = "root";
        String pwd = "";
        int port = 22;
        JSch jsch = new JSch();
        public Session Met1 (){
            try {
                session = jsch.getSession(user, host, port);
                session.setPassword(pwd);
                session.setConfig("StrictHostKeyChecking", "no");
            } catch (Exception e2){
                System.out.println(e2.getMessage());
            }return session;
        }
        public Session damesession (){
            return session;
        }
        public void close_ses(){
            session.disconnect();
        }
    }

通过这样做,通道的创建是灵活的,我也可以使用Jsch的方法。

public class sshConnect extends AsyncTask <String, Void, String>{
        ByteArrayOutputStream Baos=new ByteArrayOutputStream();
        ByteArrayInputStream Bais = new ByteArrayInputStream(new byte[1000]);


        @Override
        protected String doInBackground(String... data) {
            cSession jschses = new cSession();
            Session ses =null;
            ses = jschses.Met1();
            try {
                ses.connect();
                ChannelExec channel = (ChannelExec)ses.openChannel("exec");
                channel.setOutputStream(Baos);
                channel.setInputStream(Bais);
                //Run Command
                channel.setCommand("python ~/BBB_test/testconnect.py");
                channel.connect();
                try{Thread.sleep(3500);}catch (Exception ee){}
                channel.disconnect();
                //session.disconnect();
            }catch (Exception e){
                System.out.println(e.getMessage());
            }
            return Baos.toString();

        }

谢谢@Damienknight!

当做

 类似资料:
  • 问题内容: 用Java开发一个简单的井字游戏。 我有一个名为的课程。此类应包含有用的游戏方法。游戏发生在另一个班级。 中的方法是。该方法应该将所有9个按钮(井字游戏板)上的文本设置为空白,再次将它们设置为启用,然后将变量设置为1。 这是它的代码: 是游戏主类中的JButtons数组。 该方法以前在游戏的主要类中使用。但是现在它在不同的类中,它无法到达该类中的按钮并对其进行操作。 我在中创建了get

  • 我有两个bean类--乡村和城市。我需要在乡村班保留城市名单。另外,当我设置城市信息时,我需要设置国家名称,所以在城市类中也需要国家。怎么做?以下是代码: country.java

  • 请指导我如何将所有这些转换为asynctask方法。我必须在asynctask中生成这段代码,因为在uithread中调用它时,它给出了一个null值。请告诉我如何实现这一点的正确方法。我看到了很多关于stackoverflow的问题,但我无法做到这一点。 我看到了以下问题: 如何修复android.os.NetworkOnMainThreadException? android.os.Netwo

  • 问题内容: 我正在尝试开发在线酒店预订系统。我有一个主类,它从用户那里获取输入信息,例如他们的姓名,他们的付款信息和其他数据字段,并使用该信息作为对象。我有另一个名为的类,其中包含每个对象的列表。我遇到的问题是我无法找出一种将对象添加到对象列表中的方法。这是一些代码: 我不知道如何获取新对象作为类中方法的参数传递。我只是束手无策,希望有人能帮助我慢跑。 谢谢你的帮助。 问题答案: 让makeRes

  • 可能重复: Java中的动态变量名: 假设我有一个字符串,如下所示。 现在,我想创建一个字符串,但是字符串的变量将被称为“Hello”。为了使字符串名为“Hello”,我必须访问string以获取名称“Hello”,这样我就可以将其用作变量名。下面是我想看的。 感谢您的努力,请尝试向我解释,因为我是Java初学者D

  • 我试图创建一个方法,反向链接列表。我有一个创建链表的类 反转链表的方法在我的“Main”类中 对于我想添加到新反向链表前面的每个新节点,我需要创建一个“node”类的新实例,该类包含在“LinkedList”类中。“Node”类不能是静态的,因为其“item”属性设置为与“LinkedList”类型相同的泛型类型。所以,我需要一个类“LinkedList”的实例,以便访问“Node”类并创建其对象