IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Introducció

Una aplicació de móbil que envia dades a una aplicació remota mitjançant paquets TCP.

Les dades que se li envien són: missatge, acció que vol fer, i si es vol tancar la conexió.

El client Android demana una ip, un port, un missatge, una acció a fer i si s'ha de tancar o no la connexió. El servidor rebrà les dades i mirarà l'acció que se li ha enviat i la executarà, desprès mirarà si s'ha de tancar la connexió. L'objecte serà de la classe serialitzable que s'implementarà tant al servidor com al client per a poder utilitzar-la als dos llocs, ja que si en un dels dos llocs no hi és o, no es completament igual que a l'altra, no funcionarà perque el client o el servidor no sabranm com utilitzar l'objecte.

Codi

Servidor TCP

package com.iesebre.dam22012.hugolucas.SocketServer;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.*;
import java.sql.Date;

public class SocketServer {
	/**
	 * @param args
	 * @throws ClassNotFoundException 
	 */
	public static void main(String[] args) throws ClassNotFoundException {
		// TODO Auto-generated method stub
		
		ServerSocket serverSocket = null;
		Socket socket = null;
		ObjectInputStream objectInputStream = null;
		DataOutputStream dataOutputStream = null;
		serializable objecte = null;
		  
		try {
			serverSocket = new ServerSocket(8888);
		    System.out.println("Listening :8888");
		  } catch (IOException e) {
		   // TODO Auto-generated catch block
		   e.printStackTrace();
		  }
		
		boolean condicio = false;
		  
		while(!condicio){
			try {
		    socket = serverSocket.accept();
		    
		    objectInputStream = new ObjectInputStream(socket.getInputStream());
		    dataOutputStream = new DataOutputStream(socket.getOutputStream());
		    
		    objecte = (serializable) objectInputStream.readObject();
		    String[] comanda1 = {"/bin/bash", "-c", "/usr/bin/nautilus"};
		    String[] comanda2 = {"/bin/bash", "-c", "/usr/bin/gnome-terminal"};
		    String[] comanda3 = {"/bin/bash", "-c", "/usr/bin/firefox"};
		    
		    if (objecte.getAccio() == 1){
		    	try{
		    		Process p = Runtime.getRuntime().exec(comanda1);
		    	} catch (Exception e){
		    		
		    	}
		    }
		    else if (objecte.getAccio() == 2){
		    	try{
		    		Process p = Runtime.getRuntime().exec(comanda2);
		    	} catch (Exception e){
		    		
		    	}
		    }
		    else if (objecte.getAccio() == 3){
		    	try{
		    		Process p = Runtime.getRuntime().exec(comanda3);
		    	} catch (Exception e){
		    		
		    	}
		    }
		    
		    System.out.println("IP: " + socket.getInetAddress());
			System.out.println("Missatge: " + objecte.getMissatge());
			
			Date meuaData = new Date(0);
			
			SimpleDateFormat dataSimple = new SimpleDateFormat("yyyy-MM-dd:HH-mm-ss");
			String dataString = dataSimple.format(meuaData);
			
			dataOutputStream.writeUTF(dataString + "Connexió establerta! Comanda Executada");
			} catch (IOException e){
				e.printStackTrace();
			} finally {
				if (socket != null){
					try{
						socket.close();
					} catch(IOException e){
						e.printStackTrace();
					}
				} 
				if (objectInputStream != null){
					try{
						objectInputStream.close();
					} catch(IOException e){
						e.printStackTrace();
					}
				}
				if (dataOutputStream != null){
					try{
						dataOutputStream.close();
					} catch(IOException e){
						e.printStackTrace();
					}
				}
			}
		}
	}
}

Client TCP

package com.example.com.iesebre.dam22012.hugolucas.myclient;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOError;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.Socket;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ExpandableListView;
import android.widget.Spinner;
import android.widget.TextView;

@SuppressLint({ "NewApi", "NewApi", "NewApi" })
public class MainActivity extends Activity {

	EditText ip, port, pregunta;
	TextView resposta;
	Spinner desplegable;
	CheckBox finalitza;

	@TargetApi(9)
	@SuppressLint("NewApi")
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		if (android.os.Build.VERSION.SDK_INT > 9) {
			StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
			StrictMode.setThreadPolicy(policy);
			}
			finalitza = (CheckBox) findViewById(R.id.finalitza);
			
			// menú desplegable
			desplegable = (Spinner) findViewById(R.id.spinner);
			String[] opcions = new String[] { "Firefox", "Terminal", "Gedit" };
			ArrayAdapter<String> adaptador = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, opcions);
			adaptador.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
			desplegable.setAdapter(adaptador);
			// fi menú desplegable
			
			pregunta = (EditText) findViewById(R.id.missatge);
			ip = (EditText) findViewById(R.id.editIP);
			port = (EditText) findViewById(R.id.editPort);
			Button buttonConecta = (Button) findViewById(R.id.buttonConecta);
			resposta = (TextView) findViewById(R.id.verificacio);
			
			Button.OnClickListener buttonSendOnClickListener = new Button.OnClickListener() {

				public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Socket scktclient = null;
				ObjectOutputStream objectOutputStream = null;
				DataInputStream dataInputStream = null;
				Serializable obj1 = new serializable();
				try {
				try {
				int portint = Integer.valueOf(port.getText().toString());
				scktclient = new Socket(ip.getText().toString(), portint);
				objectOutputStream = new ObjectOutputStream(
				scktclient.getOutputStream());
				dataInputStream = new DataInputStream(
				scktclient.getInputStream());

				Date meuaData = new Date();
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd:HH-mm-ss");
				String dataString = sdf.format(meuaData);
				int num = 0;
				// posem el missatge a l'objecte
				((serializable) obj1).setMissatge(dataString + pregunta.getText().toString());

				// seleccio de la opció
				if (desplegable.getSelectedItem().toString() == "firefox") {
				num = 1;
				} else if (desplegable.getSelectedItem().toString() == "gnome-terminal") {
				num = 2;
				} else if (desplegable.getSelectedItem().toString() == "gedit") {
				num = 3;
				}
				// carreguem opció
				((serializable) obj1).setAccio(num);

				// carreguem el bolea
				boolean tancar = false;
				if (finalitza.isChecked()) {
				tancar = true;
				} else {
				tancar = false;
				}
				((serializable) obj1).setFinalitzar(tancar);

				objectOutputStream.writeObject(obj1);

				TextView textIn = null;
				textIn.setText(dataInputStream.readUTF());
				} catch (UnknownHostException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				} finally {
				if (scktclient != null) {
				try {
				scktclient.close();
				} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				}
				}

				if (objectOutputStream != null) {
				try {
				objectOutputStream.close();
				} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				}
				}

				if (dataInputStream != null) {
				try {
				dataInputStream.close();
				} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				}
				}
				}
				} catch (IOError a) {
				a.printStackTrace();
				}

				}
				};
				}
}

Layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 >

    <TextView
        android:id="@+id/verificacio"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Introdueix la IP:" />

    <EditText
        android:id="@+id/editIP"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Introdueix el Port:" />

    <EditText
        android:id="@+id/editPort"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" />

    <TextView
        android:id="@+id/textView5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Escriu missatge" />

    <EditText
        android:id="@+id/missatge"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" />

    <Button
        android:id="@+id/buttonConecta"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Conecta" />

    <CheckBox
        android:id="@+id/finalitza"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Tancar connexió" />

    <TextView
        android:id="@+id/textView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Tasques" />

    <Spinner
        android:id="@+id/spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>