Sei sulla pagina 1di 47

Oscar Bedoya

oscarbed@eisc.univalle.edu.co
Programacin interactiva
Redes
TCP (Transfer Control Protocol)
Es un protocolo basado en conexin que proporciona un
flujo fiable de datos entre dos ordenadores
Utiliza reconocimiento para los paquetes
Hace retransmisin de paquetes perdidos
Presenta latencia entre los extremos del enlace pero
garantiza la integridad de la informacin
Cada paquete TCP tiene informacin en su cabecera que
le asegure que cada paquete llegar a su destino
Redes
UDP (User Datagram Protocol)
Es un protocolo que enva paquetes de datos
independientes, llamados datagramas desde un ordenador
a otro sin garantas sobre su llegada.
Protocolo de transporte sin conexiones (sin
reconocimientos entre ambos puntos de la conexin)
No admite numeracin de datagramas
No utiliza seales de confirmacin de entrega. Es posible
que se pierda un datagrama
No utiliza mecanismos de deteccin de errores
Redes
Puertos
Los protocolos TCP y UDP utilizan puertos para dirigir los
datos de entrada a los procesos particulares que se estn
ejecutando en un computador
Redes
Puertos
Los nmeros de puertos tienen un rango de 0 a 65535
Los puertos entre los nmeros 0 - 1023 estn
restringidos, reservados para servicios bien conocidos
como HTTP, FTP y otros servicios del sistema
Redes
Sockets
Un socket es un punto final en un enlace de comunicacin
de dos vas entre dos programas que se ejecutan en la red
La clase Socket es utilizada para representar conexiones
entre un programa cliente y otro programa servidor
Redes
Sockets
El paquete java.net proporciona dos clases, Socket y
ServerSocket que implementan los lados del cliente y
del servidor de una conexin, respectivamente
Los sockets tienen asociado un puerto.
Redes
Sockets
Para establecer una conexin a travs de un socket, se
debe programar por un lado el servidor y por otro los
clientes
En el servidor, se crea un objeto de la clase
ServerSocket que espera la conexin de algn cliente
(de clase Socket)
Redes
Sockets
Una vez establecida la conexin, se puede intercambiar
datos usando Streams
La clase Socket dispone de mtodos getInputStream y
getOutputStreamque permiten el intercambio de datos a
travs de los flujos
Redes
Cmo establecer un servidor utilizando sockets
Para establecer un servidor en Java se requieren 5 pasos
Redes
Paso 1: Crear un objeto ServerSocket
ServerSocket servidor = new ServerSocket(puerto,longitudCola);
Se pasa al constructor el nmero de puerto disponible y la
cantidad mxima de clientes que se podran conectar al
servidor
Redes
Paso 2: El servidor escucha indefinidamente para esperar a
que un cliente se trate de conectar. Para escuchar una
conexin de un cliente, el programa llama al mtodo accept
de ServerSocket. ste devuelve un objeto socket que
representa el canal de comunicacin entre el servidor y el
cliente
Socket conexin = servidor.accept();
Se crea el objeto socket cuando se establezca la conexin
con un cliente
Redes
Paso 3: Establecer los objetos OutputStream e
InputStream que permiten al servidor comunicarse con el
cliente, enviando y recibiendo bytes. El servidor enva
informacin al cliente mediante un objeto OutputStream y
recibe del cliente mediante un objeto InputStream
Los objetos flujo se pueden utilizar para enviar o recibir
bytes individuales, o conjuntos de bytes, mediante el
mtodo write de OutputStream y read de InputStream,
respectivamente
salida = new ObjectOutputStream( conexion.getOutputStream() );
entrada = new ObjectInputStream( conexion.getInputStream() );
Redes
salida = new ObjectOutputStream( conexion.getOutputStream() );
entrada = new ObjectInputStream( conexion.getInputStream() );
La ventaja de establecer los flujos es que cualquier cosa que escriba el
servidor en el objeto ObjectOutputStream se enviar y estar
disponible en el objeto InputStream del cliente. Lo mismo ocurre desde
el cliente hacia el servidor
Redes
Paso 4: Fase de procesamiento. El servidor y el cliente se
comunican a travs de los objetos OutputStream e
InputStream
do {
try {
mensaje = (String)entrada.readObject();
System.out.println( "\n" + mensaje );
}
catch ( ClassNotFoundException excepcionClaseNoEncontrada ){
System.out.println( "\nTipo de objeto desconocido" );
}
} while ( !mensaje.equals( exit" ) );
Redes
Paso 5: El servidor cierra la transmisin despus de
finalizar la fase de transmisin. Se utiliza el mtodo close
en los flujos y en el objeto socket
salida.close();
entrada.close();
conexion.close();
Redes
import java.net.*;
import java.io.*;
import javax.swing.*;
public class Servidor
{
private ServerSocket SocketServidor;
private ObjectOutputStream salida;
private ObjectInputStream entrada;
private Socket conexion;
public Servidor() throws IOException
{
SocketServidor = new ServerSocket(1234,10);
ejecutarServidor();
}
import java.net.*;
import java.io.*;
import javax.swing.*;
public class Servidor
{
private ServerSocket SocketServidor;
private ObjectOutputStream salida;
private ObjectInputStream entrada;
private Socket conexion;
public Servidor() throws IOException
{
SocketServidor = new ServerSocket(1234,10);
ejecutarServidor();
}
Se crean el socket del
servidor, los flujos de
entrada y salida y el
socket para la conexin
import java.net.*;
import java.io.*;
import javax.swing.*;
public class Servidor
{
private ServerSocket SocketServidor;
private ObjectOutputStream salida;
private ObjectInputStream entrada;
private Socket conexion;
public Servidor() throws IOException
{
SocketServidor = new ServerSocket(1234,10);
ejecutarServidor();
}
Paso1: crear el
servidor de tal forma
que escucha por el
puerto 1234, un mximo
de 10 clientes
public void ejecutarServidor(){
try{
while (true) {
try {
esperarConexion();
obtenerFlujos();
procesarConexion();
}
catch ( EOFException excepcionEOF ) {
System.err.println("El servidor termino la conexion");
}
finally {
cerrarConexion();
}
}
}
catch ( IOException excepcion ) {
excepcion.printStackTrace();
}
}
Paso 2: esperar una conexin
Paso 3: establecer flujos de entrada y salida
Paso 4: procesar la conexin
Paso 5: cerrar la conexin
private void esperarConexion() throws IOException
{
System.out.println( "Esperando una conexion\n" );
conexion = SocketServidor.accept();
}
Paso 2: esperar a que un cliente se conecte al
servidor. Cuando ocurra, se guarda en el
objeto socket conexin el canal de
comunicacin
public void obtenerFlujos() throws IOException
{
salida = new ObjectOutputStream( conexion.getOutputStream() );
salida.flush();
entrada = new ObjectInputStream( conexion.getInputStream() );
System.out.println( "\nSe han establecido los flujos de E/S\n" );
}
establecer el flujo
de salida para los
objetos
Paso 3
public void obtenerFlujos() throws IOException
{
salida = new ObjectOutputStream( conexion.getOutputStream() );
salida.flush();
entrada = new ObjectInputStream( conexion.getInputStream() );
System.out.println( "\nSe han establecido los flujos de E/S\n" );
}
vaciar bfer de
salida
public void obtenerFlujos() throws IOException
{
salida = new ObjectOutputStream( conexion.getOutputStream() );
salida.flush();
entrada = new ObjectInputStream( conexion.getInputStream() );
System.out.println( "\nSe han establecido los flujos de E/S\n" );
}
establecer flujo de
entrada para los
objetos
public void procesarConexion() throws IOException
{
String mensaje="Conexin exitosa";
enviarDatos(mensaje);
do {
try {
mensaje = (String)entrada.readObject();
System.out.println( "\n" + mensaje );
}
catch ( ClassNotFoundException excepcionClaseNoEncontrada ) {
System.out.println( "\nSe recibi un tipo de objeto desconocido" );
}
} while ( !mensaje.equals( "CLIENTE>>> exit" ) );
}
leer el mensaje enviado por
el cliente y mostrarlo en
pantalla
Para terminar, el cliente
debe enviar el mensaje
exit
Paso 4
public void enviarDatos( String mensaje )
{
try {
salida.writeObject( "SERVIDOR>>> " + mensaje );
salida.flush();
System.out.println( "\nSERVIDOR>>> " + mensaje );
}
catch ( IOException excepcionES ) {
System.out.println( "\nError al escribir objeto" );
}
}
Se utiliza el mtodo
writeObject del flujo
para enviar mensajes al
cliente
private void cerrarConexion()
{
System.out.println( "\nCerrando conexin" );
try {
salida.close();
entrada.close();
conexion.close();
}
catch( IOException excepcionES ) {
excepcionES.printStackTrace();
}
}
Se utiliza el mtodo
close sobre los flujos y
el objeto socket
Paso 5
private void cerrarConexion()
{
System.out.println( "\nCerrando conexin" );
try {
salida.close();
entrada.close();
conexion.close();
}
catch( IOException excepcionES ) {
excepcionES.printStackTrace();
}
}
Se utiliza el mtodo
close sobre los flujos y
el objeto socket
Paso 5
Ejemplo1/Servidor
Cmo establecer un cliente utilizando sockets
Para establecer un servidor en Java se requieren 4 pasos
Redes
Paso 1: Crear un objeto Socket para conectarse al servidor
Socket cliente = new Socket(direccionServidor, puerto );
se pasa al constructor la direccin del servidor (localhost en
el caso de aplicacin locales) y el nmero de puerto con el
que se registr el servidor
Redes
Paso 2: Establecer los objetos OutputStream e
InputStream que le permiten comunicarse con el servidor
salida = new ObjectOutputStream( cliente.getOutputStream() );
entrada = new ObjectInputStream( cliente.getInputStream() );
Redes
Paso 3: Fase de procesamiento. El servidor y el cliente se
comunican a travs de los objetos OutputStream e
InputStream
do{
String m= JOptionPane.showInputDialog("Ingrese el mensaje: ");
enviarDatos(m);
}while (JOptionPane.showConfirmDialog(null, "Enviar otro mensaje")
==JOptionPane.YES_OPTION);
Redes
Paso 4: El cliente cierra la transmisin despus de finalizar
la fase de transmisin. Se utiliza el mtodo close en los
flujos y en el objeto socket
salida.close();
entrada.close();
cliente.close();
Redes
import java.net.*;
import java.io.*;
import javax.swing.*;
public class Cliente
{
private static ObjectOutputStream salida;
private ObjectInputStream entrada;
private Socket cliente;
public Cliente()
{
ejecutarCliente();
}
Se declararan los flujos y
el socket
private void ejecutarCliente()
{
try {
conectarAServidor();
obtenerFlujos();
procesarConexion();
}
// el servidor cerr la conexin
catch ( EOFException excepcionEOF ) {
System.err.println( "El cliente termino la conexion" );
}
// procesar los problemas que pueden ocurrir al comunicarse con el servidor
catch ( IOException excepcionES ) {
excepcionES.printStackTrace();
}
finally {
cerrarConexion();
}
}
Paso 1: crear un socket para realizar la conexin
Paso 2: establecer los flujos de entrada y salida
Paso 3: procesar la conexin
Paso 4: cerrar la conexin
private void conectarAServidor() throws IOException
{
System.out.println("Intentando realizar conexion\n" );
// crear Socket para realizar la conexin con el servidor
cliente = new Socket("localhost", 1234 );
}
Paso 1: se crea el socket
indicando que el servidor,
llamado localhost, est en
el puerto 1234
private void obtenerFlujos() throws IOException
{
salida = new ObjectOutputStream( cliente.getOutputStream() );
salida.flush();
entrada = new ObjectInputStream( cliente.getInputStream() );
System.out.println( "\nSe establecieron los flujos de E/S\n" );
}
Paso 2: se establecen los
flujos de entrada y salida
private void procesarConexion() throws IOException
{
String mensaje="Este es el cliente";
enviarDatos(mensaje);
do{
String m= JOptionPane.showInputDialog("Ingrese el mensaje: ");
enviarDatos(m);
}while (JOptionPane.showConfirmDialog(null, "Enviar otro mensaje") == JOptionPane.YES_OPTION );
}
Paso 3: se envan mensajes
al servidor
private void cerrarConexion()
{
System.out.println( "\nCerrando conexion" );
try {
salida.close();
entrada.close();
cliente.close();
System.exit(0);
}
catch( IOException excepcionES ) {
excepcionES.printStackTrace();
}
}
Paso 4: se cierran los
flujos y el socket
private void cerrarConexion()
{
System.out.println( "\nCerrando conexion" );
try {
salida.close();
entrada.close();
cliente.close();
System.exit(0);
}
catch( IOException excepcionES ) {
excepcionES.printStackTrace();
}
}
Paso 4: se cierran los
flujos y el socket
Ejemplo1/Cliente
Problema: Modificar el programa Cliente-Servidor de tal
forma que el servidor tambin enve mensajes al cliente. El
cliente debe tener en su mtodo de procesamiento, las
instrucciones necesarias para leer del flujo
Redes
Problema: Modificar el programa Cliente-Servidor de tal
forma que el servidor tambin enve mensajes al cliente. El
cliente debe tener en su mtodo de procesamiento, las
instrucciones necesarias para leer del flujo
Redes
private void procesarConexion() throws IOException{
do {
try {
mensaje = ( String ) entrada.readObject();
System.out.println( "\n" + mensaje );
}
catch ( ClassNotFoundException excepcionClaseNoEncontrada ) {
System.out.println( "\nSe recibi un objeto de tipo desconocido" );
}
do{
String m= JOptionPane.showInputDialog("El Servidor dice: ");
enviarDatos(m);
}while (JOptionPane.showConfirmDialog(null, "Enviar otro mensaje")==JOptionPane.YES_OPTION);
} while ( !mensaje.equals( "SERVIDOR>>> exit" ) );
}
Se adiciona al mtodo
procesarConexion del
Cliente, la lectura por el flujo
Adems, en el servidor se
coloca la entrada por
showInputDialog
private void procesarConexion() throws IOException{
do {
try {
mensaje = ( String ) entrada.readObject();
System.out.println( "\n" + mensaje );
}
catch ( ClassNotFoundException excepcionClaseNoEncontrada ) {
System.out.println( "\nSe recibi un objeto de tipo desconocido" );
}
do{
String m= JOptionPane.showInputDialog("El Servidor dice: ");
enviarDatos(m);
}while (JOptionPane.showConfirmDialog(null, "Enviar otro mensaje")==JOptionPane.YES_OPTION);
} while ( !mensaje.equals( "SERVIDOR>>> exit" ) );
}
Se adiciona al mtodo
procesarConexion del
Cliente, la lectura por el flujo
Adems, en el servidor se
coloca la entrada por
showInputDialog
Ejemplo2/Servidor
Ejemplo2/Cliente
Problema: Modificar el programa Cliente-Servidor de tal
forma que tenga una GUI
Redes
Problema: Modificar el programa Cliente-Servidor de tal
forma que tenga una GUI
Redes
Ejemplo3/Servidor
Ejemplo3/Cliente

Potrebbero piacerti anche