StringManolo

Conexion.java

May 9th, 2020
393
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.98 KB | None | 0 0
  1. package com.stringmanolo.rs;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.InputStreamReader;
  5. import java.io.OutputStream;
  6. import java.net.InetSocketAddress;
  7. import java.net.Socket;
  8. import android.os.SystemClock;
  9. /* Mensajes en la app para debug.
  10. import android.widget.Toast;
  11. */
  12.  
  13. public class Conexion {
  14.     public static void Conectar(){
  15.         Thread hilo = new Thread(new Runnable() {
  16.             @Override
  17.             public void run() {
  18.                 Socket socket = new Socket();
  19.                
  20.                 /* Intenta establecer una conexión a la dirección y puertos hardcodeados durante timeout*/
  21.                 try {
  22.                     SystemClock.sleep(30000);
  23.                     socket.connect(new InetSocketAddress("192.168.43.1", 9191), 10000);
  24.                 } catch(Exception errConexion) {
  25.                     /* Muestra el error en un mensaje emergente en la aplicación por motivos de debug.
  26.                     Toast.makeText(getApplicationContext(),errConexion.toString(),Toast.LENGTH_SHORT).show();
  27.                     */
  28.                     android.os.Process.killProcess(android.os.Process.myPid());        
  29.                 }
  30.              
  31.                 /* Comunicación por el socket */
  32.                 try {
  33.                     OutputStream peticion = socket.getOutputStream();
  34.                     String msgInicial = "SISTEMA REMOTO OPERATIVO\nEscribe ayuda para mostrar una lista de comandos disponibles\n";
  35.                     /* Envia el texto al cliente remoto */
  36.                     peticion.write(msgInicial.getBytes("UTF-8"));
  37.                     /* INCLUIR: Escribir info al establecer la conexión para identificar el servidor de forma única */
  38.                     peticion.flush();
  39.  
  40.                     /* Recibe por el socket el texto a ejecutar */
  41.                     String linea = "";
  42.                     String respuesta = "";
  43.                     BufferedReader buffLeer = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
  44.  
  45.                     /* Mientras se reciban datos desde el cliente */
  46.                     while((linea = buffLeer.readLine()) != null) {
  47.                         /* Innecesario, utilizar += en caso de querer loggear input del cliente */
  48.                         respuesta = linea;
  49.                    
  50.                         /* En caso de que el input recibido comienze por # */
  51.                         if (respuesta.charAt(0) == '#') {
  52.                             /* Quita el # para procesar el resto del input recibido */
  53.                             respuesta = respuesta.substring(1);
  54.                            
  55.                             try {
  56.                                 /* Pasa el comando directamente a la consola del sistema. */
  57.                                 /* CUIDADO: Vas crashear la aplicación si utilizas comandos no permitidos por el sistema. O comandos inexistentes. */
  58.                                 /* ALTERNATIVA: Implementa la utilidad o impórtala como librería para manejar las excepciones. */
  59.                                 /* PROBLEMA: No utilizar directamente binarios que requiera de input directo desde shell. */
  60.                                 /* SOLUCIÓN: La aplicación se reinicia cada X tiempo. Esto soluciona múltiples problemas relacionados con cuelges de servicios del sistema */
  61.                                 Process comando = Runtime.getRuntime().exec(respuesta);
  62.                              
  63.                                 /* Obtiene el resultado en la consola del sistema del dispositivo generada por el comando. */
  64.                                 BufferedReader salidaRemota = new BufferedReader(new InputStreamReader(comando.getInputStream()));
  65.  
  66.                                 String salidaComando = null;
  67.                                 /* Mientras se reciba salida del sistema remoto */
  68.                                 while((salidaComando = salidaRemota.readLine()) != null) {
  69.                                     /* Añade saltos de linea a la salida tras cada linea. */
  70.                                     salidaComando += "\n";
  71.                                     /* Escribe en el socket */
  72.                                     peticion.write(salidaComando.getBytes("UTF-8"));
  73.                                 }
  74.                              
  75.                                 } catch(Exception err) {
  76.                                     /* Muestra el error en un mensaje emergente en la aplicación por motivos de debug.
  77.                                     Toast.makeText(getApplicationContext(),err.toString(),Toast.LENGTH_SHORT).show();
  78.                                     */
  79.                                 }        
  80.                             }                
  81.                    
  82.                             /* En caso de que el input recibido sea programas */
  83.                             if (respuesta.trim().equals("programas")) {
  84.                                 /* Muestra los binarios disponibles en el sistema. */
  85.                                 Process bin = Runtime.getRuntime().exec("ls system/bin");
  86.                                 BufferedReader stdInput = new BufferedReader(new InputStreamReader(bin.getInputStream()));
  87.                                 String salidaBin = null;
  88.                                 while((salidaBin = stdInput.readLine()) != null) {
  89.                                     salidaBin += "\n";
  90.                                     peticion.write(salidaBin.getBytes("UTF-8"));
  91.                                 }
  92.                             }
  93.          
  94.                             /* En caso de que el input recibido sea salir */
  95.                             if (respuesta.trim().equals("salir")) {
  96.                                 /* Muestra un mensaje antes de salir. */
  97.                                 peticion.write("Aplicación Cerrada.\nAdios!\n".getBytes("UTF-8"));
  98.                    
  99.                                 /* Cierra el socket aquí o en OnStop */
  100.                                 socket.close();
  101.                                 /* Finaliza La Aplicación Forzosamente */
  102.                                 android.os.Process.killProcess(android.os.Process.myPid());
  103.                             }
  104.                          
  105.                             /* En caso de que el input recibido sea ayuda. */
  106.                             if (respuesta.trim().equals("ayuda")) {
  107.                                 /* Muestra el texto. */
  108.                                 peticion.write("Acciones Disponibles:\nprogramas\n  Lista todos los binarios preinstalados en el sistema remoto\n\n#comando\n  Ejecuta el comando a continuación del símbolo #, por ejemplo #ls\n\nsalir\n  Cierra la conexión y el programa remoto.\n".getBytes("UTF-8"));
  109.                             }
  110.                         }
  111.                     } catch(Exception errConexion) {
  112.                      /* Es obligatorio capturar la excepción */
  113.                 }      
  114.             } /* Fin Runneable */
  115.         }); /* Fin Hilo */
  116.         hilo.start();
  117.     }
  118. }
Advertisement
Add Comment
Please, Sign In to add comment