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()
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
Un socket es un punto de conexión entre 2 procesos e identificado por una IP y un puerto
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:
public class Elemento { String nombre; double cantidad; public Elemento(String nombre, double cantidad) { this.nombre = nombre; this.cantidad = cantidad; } }
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(); } }
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(); } }
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); } } }