Sei sulla pagina 1di 10

Qu es un Socket?

Los sockets son un sistema de comunicacin entre procesos de diferentes mquinas de una red. Ms exactamente, un socket es un punto de comunicacin por el cual un proceso puede emitir o recibir informacin. Fueron popularizados por Berckley Software Distribution, de la universidad norteamericana de Berkley. Los sockets han de ser capaces de utilizar el protocolo de streams TCP (Transfer Contro Protocol) y el de datagramas UDP (User Datagram Protocol). Utilizan una serie de primitivas para establecer el punto de comunicacin, para conectarse a una mquina remota en un determinado puerto que est disponible, para escuchar en l, para leer o escribir y publicar informacin en l, y finalmente para desconectarse. Con todas primitivas se puede crear un sistema de dilogo muy completo.

Para comprender el funcionamiento de los sockets no hay nada mejor que estudiar un ejemplo. El que a continuacin se presenta el cliente establece una conexin con el servidor al tener la conexin perfectamente realizada nuestro cliente despliega un men de operaciones en el cual se muestra las acciones que se pueden realizar, dependiendo a la necesidad del cliente este tecleara la opcin que les sirva, al realizar esto el servidor solicitara dos nmeros y proceder a realizar la operacin solicitada, cuando haya terminado esto le mandara la respuesta al cliente y le preguntara si desea hacer otra consulta si teclea no la conexin se cierra y si teclea si despliega de nuevo el men.

- Este es el cliente
import java.io.*; import java.net.*; public class Cliente{ //Constructor public Cliente(){ } /* Se definen cuatro variables que leen DESDE EL TECLADO stdin1 para saber si sigue o no stdin2 para saber qu funcin desea realizar stdin3 para obtener el valor que quiere resolver*/ private static BufferedReader stdin1 = new BufferedReader(new InputStreamReader(System.in)); private static BufferedReader stdin2 = new BufferedReader(new InputStreamReader(System.in)); private static BufferedReader stdin3 = new BufferedReader(new InputStreamReader(System.in)); private static BufferedReader stdin4 = new BufferedReader(new InputStreamReader(System.in)); //Funcin principal public static void main(String args[]) throws IOException{ //Variable que guarda el nombre del servidor de MULTIPLICACION String IP_MULTI="localhost";// con =null; tambin funciona puedes poner una ip en una red //Variable que guarda el puerto del servidor de MULTIPLICACION int PUERTO_MULTI=5001; //Variable que guarda el nombre del servidor de RESTA String IP_RESTA="localhost"; //puedes poner una ip en una red //Variable que guarda el puerto del servidor de RESTA int PUERTO_RESTA=5002; //Variable que guarda el nombre del servidor de SUMA String IP_SUMA="localhost"; //puedes poner una ip en una red //Variable que guarda el puerto del servidor de SUMA int PUERTO_SUMA=5003; //Por defecto s sigue (empieza) String sigue="s"; System.out.println("\nBuenos das"); //Mientras el usuario siga con ganas de resolver while(sigue.equals("s")){ // Men System.out.println("\nQu desea hacer?\n"); System.out.println("1. Multiplicacion"); System.out.println("2. Resta"); System.out.println("3. Suma"); System.out.println("\n4. Salir"); System.out.print("\n- Ingrese su opcion: "); //Guardo opcin en un string para evitar errores String opcion=stdin2.readLine(); //Inicia La Primera Opcion if(opcion.equals("1")){

System.out.println("Multiplicacion"); try{ //Lee los valores desde teclado System.out.print("Ingresa el Primer Valor "); String pnumero=stdin3.readLine(); System.out.print("Ingresa el Segundo Valor "); String snumero=stdin4.readLine(); //Enva el valor a la funcin de ms abajo String resultado=realizar_operacion(IP_MULTI,PUERTO_MULTI,pnumero,snumero); //Imprime el resultado System.out.println("= "+resultado); } catch(Exception e){ System.err.println(e); } } //Inicia Con La Segunda Opcion else if(opcion.equals("2")){ System.out.println("RESTA"); try{ //Lee los valores desde teclado System.out.print("Ingresa el Primer Valor "); String pnumero=stdin3.readLine(); System.out.print("Ingresa el Segundo Valor "); String snumero=stdin4.readLine(); //Enva el valor a la funcin de ms abajo String resultado=realizar_operacion(IP_RESTA,PUERTO_RESTA,pnumero,snumero); //Imprime el resultado System.out.println("= "+resultado); } catch(Exception e){ System.err.println(e); } } else if(opcion.equals("3")){ System.out.println("SUMA"); try{ //Lee los valores desde teclado System.out.print("Ingresa el Primer Valor "); String pnumero=stdin3.readLine(); System.out.print("Ingresa el Segundo Valor "); String snumero=stdin4.readLine(); //Enva el valor a la funcin de ms abajo

String resultado=realizar_operacion(IP_SUMA,PUERTO_SUMA,pnumero,snumero); //Imprime el resultado System.out.println("= "+resultado); } catch(Exception e){ System.err.println(e); } } else if(opcion.equals("4")){ break;//Opcin Salir } else{ System.out.println("Se equivoc."); break; } //Sigue el ciclo System.out.print("\nDesea realizar otra operacin? (s/n): "); sigue = stdin1.readLine(); } System.out.println("Adios."); }

/* Funcin realizar operacion se encarga de comunicarse con el servidor*/ static String realizar_operacion(String host,int puerto,String valor1,String valor2){ String respuesta=null; try { //System.out.print("Abriendo socket y creando flujos (streams)... "); Socket sockete = new Socket(host,puerto); //Creo dos canales de comunicacin con la conexin DataOutputStream salida = new DataOutputStream(new BufferedOutputStream(sockete.getOutputStream())); DataInputStream entrada = new DataInputStream(new BufferedInputStream(sockete.getInputStream())); //System.out.println("OK\n"); //Pongo el valor en el canal de salida salida.writeUTF(valor1); //Envo lo que hay en el canal de salida salida.flush(); //Si llega un cuarto argumento (el exponente de la potencia) if(valor2!=null){ //Pongo el valor en el canal de salida salida.writeUTF(valor2); //Envo lo que hay en el canal de salida salida.flush(); }

//Leo lo recibido como respuesta por el canal de entrada respuesta = entrada.readUTF(); //System.out.println("Resultado="+respuesta); //Se cierra la peticin de conexin llamada sockete try{ sockete.close(); } catch (Exception ex){} } catch(Exception e){ System.err.println(e); } //Retorna el valor recibido como respuesta return respuesta; } }

Este es el Servidor de Suma aqu se conecta el cliente cuando eligi la opcin suma
import java.io.*; import java.net.*; public class Suma{ //Constructor public Suma(){ } public static void main (String[] args){ //Puerto que se abrir en esta mquina para responder a los clientes int PUERTO_SUMA=5003; Socket socket=null; ServerSocket serverSocket=null; try{ serverSocket =new ServerSocket(PUERTO_SUMA); } catch (Exception e){ System.err.println("Error al crear socket"); return; } //Mientras el programa est funcionando while (true){ try{ System.out.println("Esperando para resolver Operacion..."); //Acepto una peticin de conexin socket=serverSocket.accept(); //Creo dos canales de comunicacin con la conexin

DataOutputStream salida = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream())); DataInputStream entrada = new DataInputStream(new BufferedInputStream(socket.getInputStream())); //System.out.print("Esperando valor... "); //Recibo el valor1 desde el cliente String valor1 = entrada.readUTF(); //Recibo el valor2 desde el cliente String valor2 = entrada.readUTF(); //Creo el objeto con las operaciones definidas Operaciones operar=new Operaciones(valor1,valor2); System.out.print(valor1+" + " + valor2+ " = "); //Realizo la operacin String resultado=String.valueOf(operar.suma()); System.out.println(resultado); //La pongo en el canal de salida salida.writeUTF(resultado); System.out.print("Enviando respuesta... "); //Se enva salida.flush(); System.out.println("OK"); //Se cierra la peticin de conexin llamada socket try{ socket.close(); } catch (IOException ex){} } catch (Exception e){ System.err.println("Cerrando la conexion del socket ..."); if(socket!=null){ try{ socket.close(); } catch (IOException ex){} } } } }

Este es el servidor de Resta aqu se conecta el cliente cuando elige la opcin resta
import java.io.*; import java.net.*; public class Resta{ //Constructor public Resta(){ } public static void main (String[] args){ //Puerto que se abrir en esta mquina para responder a los clientes int PUERTO_RESTA=5002; Socket socket=null; ServerSocket serverSocket=null; try{ serverSocket =new ServerSocket(PUERTO_RESTA); } catch (Exception e){ System.err.println("Error al crear socket"); return; } //Mientras el programa est funcionando while (true){ try{ System.out.println("Esperando para resolver Operacion..."); //Acepto una peticin de conexin socket=serverSocket.accept(); //Creo dos canales de comunicacin con la conexin DataOutputStream salida = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream())); DataInputStream entrada = new DataInputStream(new BufferedInputStream(socket.getInputStream())); //System.out.print("Esperando valor... "); //Recibo el valor1 desde el cliente String valor1 = entrada.readUTF(); //Recibo el valor2 desde el cliente String valor2 = entrada.readUTF(); //Creo el objeto con las operaciones definidas Operaciones operar=new Operaciones(valor1,valor2); System.out.print(valor1+" * " + valor2+ " = "); //Realizo la operacin String resultado=String.valueOf(operar.resta()); System.out.println(resultado); //La pongo en el canal de salida salida.writeUTF(resultado);

System.out.print("Enviando respuesta... "); //Se enva salida.flush(); System.out.println("OK"); //Se cierra la peticin de conexin llamada socket try{ socket.close(); } catch (IOException ex){} } catch (Exception e){ System.err.println("Cerrando la conexion del socket ..."); if(socket!=null){ try{ socket.close(); } catch (IOException ex){} } } } }

Este es el servidor de Multiplicacin aqu se conecta el Cliente cuando elige la opcin multi
import java.io.*; import java.net.*; public class Multi{ //Constructor public Multi(){ } public static void main (String[] args){ //Puerto que se abrir en esta mquina para responder a los clientes int PUERTO_MULTI=5002; Socket socket=null; ServerSocket serverSocket=null; try{ serverSocket =new ServerSocket(PUERTO_MULTI); } catch (Exception e){ System.err.println("Error al crear socket"); return; } //Mientras el programa est funcionando while (true){ try{ System.out.println("Esperando para resolver Operacion..."); //Acepto una peticin de conexin socket=serverSocket.accept();

//Creo dos canales de comunicacin con la conexin DataOutputStream salida = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream())); DataInputStream entrada = new DataInputStream(new BufferedInputStream(socket.getInputStream())); //System.out.print("Esperando valor... "); //Recibo el valor1 desde el cliente String valor1 = entrada.readUTF(); //Recibo el valor2 desde el cliente String valor2 = entrada.readUTF(); //Creo el objeto con las operaciones definidas Operaciones operar=new Operaciones(valor1,valor2); System.out.print(valor1+" - " + valor2+ " = "); //Realizo la operacin String resultado=String.valueOf(operar.multi()); System.out.println(resultado); //La pongo en el canal de salida salida.writeUTF(resultado); System.out.print("Enviando respuesta... "); //Se enva salida.flush(); System.out.println("OK"); //Se cierra la peticin de conexin llamada socket try{ socket.close(); } catch (IOException ex){} } catch (Exception e){ System.err.println("Cerrando la conexion del socket ..."); if(socket!=null){ try{ socket.close(); } catch (IOException ex){} } } } }

Esta es la Clase Operaciones que es mandada llamar por los servidores para realizar la operacin correspondiente
public class Operaciones { //Declaro mis 2 variables a usar int x; int y; //Llegada de 2 Variables public Operaciones(String x, String y) { this.x = Integer.valueOf(x).intValue(); this.y = Integer.valueOf(y).intValue(); } // Una Variable public Operaciones(String x) { this.x = Integer.valueOf(x).intValue(); } //MULTIPLICACION double multi() { double resultado=0; resultado=(double)x*y; return(resultado); } //RESTA double resta() { double resultado=0; resultado=(double)x-y; return(resultado); } //SUMA double suma() { double resultado=0; resultado=(double)x+y; return(resultado); } }

CONCLUSIONES Hemos aprendido a realizar una conexin cliente servidor su funcionamiento y como asignar un puerto y direccin para multiples servidores .

Potrebbero piacerti anche