El modelo cliente - servidor
TCP es un protocolo orientado a conexión. No hay relaciones maestro/esclavo. Las aplicaciones, sin embargo, utilizan un modelo cliente/servidor en las comunicaciones.
Un servidor es una aplicación que ofrece un servicio a usuarios de Internet; un cliente es el que pide ese servicio. Una aplicación consta de una parte de servidor y una de cliente, que se pueden ejecutar en el mismo o en diferentes sistemas.
Los usuarios invocan la parte cliente de la aplicación, que construye una solicitud para ese servicio y se la envía al servidor de la aplicación que usa TCP/IP como transporte.
El servidor es un programa que recibe una solicitud, realiza el servicio requerido y devuelve los resultados en forma de una respuesta. Generalmente un servidor puede tratar múltiples peticiones(múltiples clientes) al mismo tiempo.
Un servidor es una aplicación que ofrece un servicio a usuarios de Internet; un cliente es el que pide ese servicio. Una aplicación consta de una parte de servidor y una de cliente, que se pueden ejecutar en el mismo o en diferentes sistemas.
Los usuarios invocan la parte cliente de la aplicación, que construye una solicitud para ese servicio y se la envía al servidor de la aplicación que usa TCP/IP como transporte.
El servidor es un programa que recibe una solicitud, realiza el servicio requerido y devuelve los resultados en forma de una respuesta. Generalmente un servidor puede tratar múltiples peticiones(múltiples clientes) al mismo tiempo.
Figura: El modelo de aplicación cliente/servidor
Algunos servidores esperan las solicitudes en puertos bien conocidos de modo que sus clientes saben a que zócalo IP deben dirigir sus peticiones. El cliente emplea un puerto arbitrario para comunicarse. Los clientes que se quieren comunicar con un servidor que no usa un puerto bien conocido tienen otro mecanismo para saber a qué puerto
dirigirse. Este mecanismo podría usar un servicio de registro como Portmap, que utiliza un puerto bien conocido.
El siguiente código nos muestra un ejemplo de diálogo entre el cliente y el servidor.
En la ejecución del cliente, deberá pasarle como parámetro el nombre o dirección del servidor.
Ejemplo:
Java Clientest localhost
En este ejemplo, el cliente establecerá la comunicación en el puerto 8001 y en el ordenador local, ya que como parámetro se le ha pasado localhost.
Java Clientest localhost
En este ejemplo, el cliente establecerá la comunicación en el puerto 8001 y en el ordenador local, ya que como parámetro se le ha pasado localhost.
Cliente TCP. Código JAVA
El lado cliente de una aplicación TCP/IP descansa en la clase Socket. De nuevo, mucho del trabajo necesario para establecer la conexión lo ha realizado la clase Socket.
import java.io.*;import java.net.*;
public class ClientTest {
public static void pausa(){try {Thread.sleep(3000);} catch (Exception ignored) {}}
public static void main (String args[]) {String welcome, response;Client client;BufferedReader reader;PrintWriter writer;
client = new Client (args[0], 8001); //la clase Client Implementa el socket cliente al que se le pasa el argumento 0 que contendrá la dirección o nombre del servidor
try {//creamos los canales de entrada/salida para comunicarnos con el servidorreader = new BufferedReader (new InputStreamReader (client.in));writer = new PrintWriter (new OutputStreamWriter (client.out), true);//leemos la bienvenida que nos da el servidorwelcome = reader.readLine();pausa();
System.out.println ("Mensaje procedente del servidor: '"+ welcome +"'");//para ver el funcionamiento, enviamos los comandosSystem.out.println ("Enviando comando NAME");writer.println("NAME");response = reader.readLine();System.out.println ("Respuesta del servidor: '"+ response +"'");//pausapausa();System.out.println ("Enviando comando HELP");writer.println ("HELP");response = reader.readLine();System.out.println ("Respuesta del servidor: '"+ response +"'");pausa();
System.out.println ("Enviando comando DATE");writer.println("DATE");response = reader.readLine();System.out.println ("Respuesta del servidor: '"+ response +"'");pausa();
//el siguiente comando no es entendido por el protocolo implementado por el servidor//como vemos en la respuesta que nos devuelve
System.out.println ("Enviando comando xl");writer.println("xl");response = reader.readLine();System.out.println ("Respuesta del servidor: '"+ response +"'");pausa();System.out.println ("Enviando comando QUIT");writer.println("QUIT");
} catch (IOException e) {System.out.println ("IOException en client.in.readln()");System.out.println(e);}try {Thread.sleep(2000);} catch (Exception ignored) {}}}//-------------------------------------------------------------------class Client {
// establece los canales de entrada y de salida a disposicion de las clases de usuariopublic InputStream in;public OutputStream out;
// El socket clienteprivate Socket client;
public Client (String host, int port) {try {client = new Socket (host, port);System.out.println ("Datos del socket: " + client);in = client.getInputStream();out= client.getOutputStream();} catch (IOException e) {System.out.println("IOExc : " + e);}}}
Servidor TCP. Código JAVA
En el siguiente ejemplo, se desarrolla un mínimo servidor TCP. La aplicación servidor TCP depende de una clase de comunicaciones proporcionada por Java: ServerSocket. Esta clase realiza la mayor parte del trabajo de crear un servidor. El servidor implementado escucha por el puerto de comunicaciones 8001, y acepta órdenes del tipo HELP, DATE,QUIT y NAME.
En el siguiente ejemplo, se desarrolla un mínimo servidor TCP. La aplicación servidor TCP depende de una clase de comunicaciones proporcionada por Java: ServerSocket. Esta clase realiza la mayor parte del trabajo de crear un servidor. El servidor implementado escucha por el puerto de comunicaciones 8001, y acepta órdenes del tipo HELP, DATE,QUIT y NAME.
import java.util.*;import java.io.*;import java.net.*;
public class ServerTest {
final static int SERVER_PORT = 8001; // puerto de escucha de nuestro servidor
public static void main (String args[]) {Server server;String clientRequest;BufferedReader reader;PrintWriter writer;
// creamos el servidor y los canales de entrada y salida
server = new Server (SERVER_PORT);reader = new BufferedReader (new InputStreamReader (server.in));writer = new PrintWriter (new OutputStreamWriter (server.out), true);
// En cuanto se establece una conexión por parte del cliente, enviamos un saludowriter.println ("Bienvenido al Servidor: " + new Date() + "/n");
while (true) {try {// leemos del canal de entrada la petición del cliente
clientRequest = reader.readLine();
// Sacamos por pantalla la peticion del clienteSystem.out.println ("Recibido :" + clientRequest);
// El protocolo de nuestro servidor solo acepta ordenes : HELP, QUIT,NAME,DATEif (clientRequest.startsWith ("HELP")) {writer.println ("Órdenes: HELP QUIT NAME DATE");} else {if (clientRequest.startsWith ("QUIT")) {System.exit(0);} else {if (clientRequest.startsWith("NAME")){InetAddress host;host=InetAddress.getLocalHost();writer.println("Nombre del host :"+ host.getHostName());}else if (clientRequest.startsWith("DATE"))(writer.println("Fecha del sistema :"+ new Date()));else {writer.println ("ERROR: Comando :'" + clientRequest +"' no reconocido, use HELP");}}}} catch (IOException e) {System.out.println ("Excepción en el servidor " + e);System.exit(0);}}
}}//-------------------------------------------------------------------
// Esta clase es la que implementa el socket del servidor (ServerSocket)class Server {
private ServerSocket server;private Socket socket;
public InputStream in;public OutputStream out;
public Server (int port) {
try {server = new ServerSocket (port);System.out.println ("Servidor Java Activo! \n");System.out.println(""+server+"\n");// Espera suspendido hasta que un cliente establece una conexiónsocket = server.accept();
in = socket.getInputStream();out = socket.getOutputStream();
} catch (IOException e) {System.out.println ("Excepción en el constructor server: " + e);}}}




0 comentarios:
Publicar un comentario en la entrada