Escritorio remoto desde Android a PC

Iniciado por Sohelone, 11 Abril 2014, 13:35 PM

0 Miembros y 1 Visitante están viendo este tema.

Sohelone

Hola señores/as,

Abro este post porque estoy desesperado y no he recibido respuesta en 4 foros supuestamente activos de Android, uno de ellos http://stackoverflow.com/, en el que he preguntado dos veces.

Estoy desarrollando una aplicacion Cliente/Servidor en Android que realiza un acceso remoto a un pc mediante Sockets. He estado buscando informacion sobre como realizar un escritorio remoto y segun he leido la mayoria de las apps y programas que se dedican a ello realizan capturas de pantalla para simular la vista del escritorio remoto a tiempo real. Quise empezar por ahi y me puse a probar primero en Java desde un pc a otro con exito. Ahora estoy probandolo desde el movil al pc, pero tengo un problema, y es que al recibir las imagenes y colocarlas en un ImageView no se refresca salvo cuando termina la ejecucion del evento, que muestra la ultima captura tomada. A partir de aqui me gustaria preguntar dos cosas:

La primera es si alguien conoce una forma mejor (que las habra seguro) de establecer un escritorio remoto, tanto de Android como de Java, me gustaria aprender bien como manejarlo y adaptarme a cualquier sistema, ya que me parece un tema interesante.

La segunda pregunta esta relacionada con mi codigo, por si alguien sabe que falla.

Cliente

public class MainActivity extends Activity {

static Button boton;
static Button boton2;
static byte[] imagen;
static ImageView imagenVista;
//static Bitmap bmp;

static Socket clientSocket;
static OutputStream os;
static ObjectInputStream entrada;

@TargetApi(Build.VERSION_CODES.GINGERBREAD)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
boton = (Button)findViewById(R.id.button1);
boton.setOnClickListener(event);
imagenVista = (ImageView)findViewById(R.id.imageView1);

if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}

//boton.performClick();




}

private OnClickListener event = new OnClickListener() {

@TargetApi(Build.VERSION_CODES.GINGERBREAD)
@Override
public void onClick(View v) {

if (boton.getText().equals("Start")){
boton.setText("Stop");

try{

Toast.makeText(getApplicationContext(), "Pulsado", Toast.LENGTH_SHORT).show();
int cont = 0;

while(cont < 9) {

System.out.println("Creando socket cliente");
Socket clientSocket= new Socket();
System.out.println("Estableciendo la conexión");
InetSocketAddress addr=new InetSocketAddress("10.209.0.93", 5555);

clientSocket.connect(addr);

entrada = new ObjectInputStream(clientSocket.getInputStream());
final byte[] bytes_img;
bytes_img = (byte[]) entrada.readObject();
       
new Thread(new Runnable() {

@Override
public void run() {

final Bitmap bmp = BitmapFactory.decodeByteArray(bytes_img, 0, bytes_img.length);

imagenVista.post(new Runnable() {
//runOnUiThread(new Runnable() {
@Override
public void run() {
imagenVista.setImageBitmap(bmp);
imagenVista.invalidate();
}
});
}

}).start();


entrada.close();
clientSocket.close();
cont++;
}
    }catch(Exception e){
    e.printStackTrace();
    }
}

else{
boton.setText("Start");
}

}



};

}



Servidor


public class Servidor implements Runnable, Serializable{

private static final long serialVersionUID = 8760160157002886283L;

static Socket newSocket;
static String msg;
static Boolean recibir = true;
static ServerSocket serverSocket;
public static void main(String args[]) throws IOException {

//serverSocket= new ServerSocket(5555);
char c = 20;

try{

System.out.println("\n" + InetAddress.getLocalHost().getHostName());
while(true){

serverSocket= new ServerSocket(5555);

System.out.println("Acepta conexiones");
newSocket= serverSocket.accept();

recibir = true;
Thread t1 = new Thread(new Servidor());
t1.start();
t1.join();

}

}catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}

}

@Override
public void run() {

InputStream is;
OutputStream os;

System.out.println("Conexión recibida desde IP: " + newSocket.getInetAddress());
System.out.println("Nombre: " + Thread.currentThread().getName());

        try{
           
            ObjectOutputStream salida = new ObjectOutputStream(newSocket.getOutputStream());
            salida.flush(); 
           
            Rectangle dimension_pantalla = new   Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
            Robot robot = new Robot();
            BufferedImage imgBuffer = robot.createScreenCapture(dimension_pantalla);           
            ByteArrayOutputStream salida_img = new ByteArrayOutputStream();
           
            ImageIO.write(imgBuffer, "jpg", salida_img);
         
            byte[] img_en_bytes = salida_img.toByteArray();
            salida.writeObject(img_en_bytes);
           
            salida.flush();
            imgBuffer.flush();
            salida.close();
            newSocket.close();
            serverSocket.close();
           
        }catch(Exception e){
            e.printStackTrace();
        }       
 
}
}



(Si veis cosas que sobran es por las diversas pruebas que he ido haciendo con ambas clases  :P)


Se trata de parte de mi proyecto de fin de curso, por lo que agradezco cualquier informacion que me sirva y estare eternamente agradecido a todo aquel que pueda ayudarme. Gracias!  (Una vez lo termine subire el codigo)  :)