Tabla de Contenidos

Resumen parcial 1 DAD

Hilos

Un hilo es una secuencia única de control de flujo dentro de un programa

Cuando se implementa un hilo primero debe heredar la clase Thread y luego dentro implementar el run(), que es donde irá la funcionalidad de este. Para ejecutar un hilo se debe poner el nombre del objeto de la clase hilo seguido por .start()

Sistemas Distribuidos

Un sistema distribuido es un conjunto de computadores independientes interconectados a través de una red y que son capaces de colaborar con el fin de realizar una tarea

Formas de colaboración

Ventajas

Desventajas

Formas de computación existentes

Sockets

Un socket es un punto de conexión entre 2 procesos e identificado por una IP y un puerto

Puntos clave

Práctica

Se suele pedir implementar un protocolo, lo que se resume en un servidor que responde a comandos enviados desde un cliente. Generalmente para implementar esto necesitaremos 4 clases:

A continuación se muestran implementaciones de ejemplo:

Elemento

Elemento.java
public class Elemento {
	String nombre;
	double cantidad;
 
	public Elemento(String nombre, double cantidad) {
		this.nombre = nombre;
		this.cantidad = cantidad;
	}
}

Cliente

Cliente.java
public class Cliente {
	Socket socket;
 
	public void ejecutar() {
		try {
		  socket = new Socket("localhost", 5000);
 
		  BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		  PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
 
		  String linealeida ="";
	          Scanner sc = new Scanner(System.in);
 
		  do {
 
			pw.println(sc.nextLine());
			pw.flush();
 
			linealeida = br.readLine();
 
			System.out.println(linealeida);
 
 
		  } while (linealeida.equals("cerrar") == false);
 
		  sc.close();
		  br.close();
			pw.close();
 
		} catch (IOException e) {
			System.out.println("Error en el Socket del Cliente: " + e);
		}
 
 
	}
 
	public static void main(String[] args) {
		(new Cliente()).ejecutar();
	}
}

Servidor

Server.java
public class Server {
	ServerSocket serverSocket;
	Socket socket;
 
	static Hashtable<String, ArrayList<Elemento>> listaElementos = new Hashtable<String, ArrayList<Elemento>>();
 
	public void ejecutar() {
 
 
		try {
			serverSocket = new ServerSocket(5000);
 
			while(true) {
			socket = serverSocket.accept();
			//implementamos ServerThread
			(new ServerThread(socket)).start();
 
			}
 
 
 
 
		} catch (IOException e) {
			System.out.println("Error en el socket servidor: "+e);
		}
 
 
	}
 
	public static void main(String[] args) {
		(new Server()).ejecutar();
	}
}

Server Thread

ServerThread.java
public class ServerThread extends Thread{
	Socket socket;
 
	public ServerThread(Socket socket) {
		this.socket = socket;
	}
 
 
	public void run() {
		try {
 
			BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
 
 
 
			String linealeida[];
 
			do {
				linealeida = br.readLine().split(" ");
 
				switch (linealeida[0]) {
					case "ADD":
						if(linealeida.length == 3) {
							ArrayList<Elemento> listado;
 
							listado = Server.listaElementos.get(linealeida[1]);
 
							Elemento elemento = new Elemento(linealeida[1], Double.parseDouble(linealeida[2]));
 
							if (listado == null) {
								listado = new ArrayList<Elemento>();
								Server.listaElementos.put(linealeida[1], listado);
							}
							listado.add(elemento);
							pw.println("Elemento insertado");
							pw.flush();
 
 
 
						}else {
							pw.println("Uso incorrecto para ADD");
							pw.flush();
						}
						break;
 
					case "GET":
						if(linealeida.length == 2) {
							ArrayList<Elemento> listado = new ArrayList<Elemento>();
 
							listado = Server.listaElementos.get(linealeida[1]);
 
							if(listado == null){
								pw.println("Ese elemento no exite en la lista");
								pw.flush();
							}else {
								double total=0;
 
								for(Elemento elemento : listado) {
									total += elemento.cantidad;
								}
 
								pw.println("Total: " + total);
								pw.flush();
							}
 
 
						}else {
							pw.println("USo incorrecto del comando GET");
							pw.flush();
						}
						break;
 
					case "DELETE":
 
						if(linealeida.length == 2) {
							ArrayList<Elemento> listado = new ArrayList<Elemento>();
 
							listado = Server.listaElementos.get(linealeida[1]);
 
							if(listado == null){
								pw.println("Ese elemento no existe");
								pw.flush();
							}else {
 
								listado.remove(listado.size()-1);
								pw.println("Elemento eliminado");
								pw.flush();
 
 
							}
 
						}else {
							pw.println("USo incorrecto del comando DELETE");
							pw.flush();
						}
						break;
 
 
					case "EXIT":
						pw.println("cerrar");
						pw.flush();
						break;
 
					default:
						pw.println("Error: Comando inexistente");
						pw.flush();
						break;
				}
 
			}while(linealeida[0].equals("EXIT")==false);
 
			br.close();
			pw.close();
 
		} catch (IOException e) {
			System.out.println("Error en el Socket ServerThread: "+ e);
		}
 
 
 
 
	}
 
 
 
}