Laboratorio 1 Sockets S.O II
Laboratorio 1 Sockets S.O II
Laboratorio 1 Sockets S.O II
SISTEMAS OPERATIVOS 2
COMUNICACIONES TCP/IP
OBJETIVO GENERAL
Brindar al estudiante las herramientas en Java que le permitan desarrollar los
programas especificados para el curso.
OBJETIVOS ESPECIFICOS
MARCO TEORICO
Las comunicaciones entre diferentes sistemas se realizan tpicamente a travs de
una red, que usualmente denominamos local (LAN) cuando la distancia es
pequea y extensa (WAN) cuando se trata de equipos muy alejados (se mantiene
intencionadamente la ambigedad en los conceptos de distancia dada la gran
variedad de redes existente).
Tanto si usamos un tipo de red como otro, existen multitud de protocolos para el
intercambio de informacin. Java incorpora un soporte nativo para la familia de
protocolos que se conoce con el nombre genrico de TCP/IP, que son los
protocolos empleados en Internet.
Como se ver ms adelante esta denominacin hace referencia a dos de los
protocolos utilizados, pero en realidad hay ms protocolos disponibles para el
programador Java.
Bsicamente se va a disponer de dos tipos de servicio claramente diferenciados:
Pgina 1 de 15
SISTEMAS OPERATIVOS 2
(algunos de estos bloques de informacin pueden perderse sin que se
reciba aviso alguno).
Cada uno de estos tipos de servicio ser de aplicacin para tareas diferentes y
posee un conjunto de caractersticas que los hace aptos para diferentes usos.
SISTEMAS OPERATIVOS 2
est incorporado en el sistema operativo y es accedido desde los programas Java
a travs de las clases que se estudiarn en este Laboratorio).
La abstraccin socket.
Un socket1 es el extremo de un enlace de comunicacin bidireccional
entre dos programas que se comunican a travs de la red.
Pgina 3 de 15
SISTEMAS OPERATIVOS 2
Ejemplo: 158.42.53.1:1270 (IP=158.42.53.1, puerto=1270)
El paquete java.net proporciona tres clases: Socket, ServerSocket y
DatagramSocket.
Socket Implementa un extremo de la conexin (TCP) a travs de la cual se
realiza la comunicacin.
ServerSocket Implementa el extremo Servidor de la conexin (TCP) en la
cual se esperan las conexiones de clientes.
DatagramSocket Implementa tanto el extremo servidor como el cliente de
UDP.
El sistema operativo crear un punto de conexin en el protocolo de nivel 4 (nivel
de transporte) correspondiente, en el caso de internet (arquitectura TCP/IP) las
conexiones sern soportadas por el protocolo TCP (si el tipo es Socket fiable y los
datagramas (DatagramSocket) por el protocolo UDP no fiable.
Concepto de fiabilidad:
1. No se perdern paquetes.
2. No llegarn paquetes duplicados.
3. El orden de recepcin ser el mismo que el de emisin.
Si se emplea un protocolo fiable, el programa de aplicacin quedar liberado de la
responsabilidad de gestionar reordenaciones, prdidas y duplicados. A cambio, el
software de protocolos interno necesitar un mayor tiempo de proceso.
Existe otro tipo de socket, el socket crudo RAW SOCKET que se salta el nivel de
transporte y accede directamente al nivel 3 (nivel de red): En el caso de Internet
IP. Este tipo de socket se reserva a usuarios experimentados ya que suele ser
utilizado por programas con privilegios para la definicin de protocolos de bajo
nivel.
Pgina 4 de 15
SISTEMAS OPERATIVOS 2
Se trata del mecanismo ms simple, puesto que el servicio sin conexin tan slo
nos ofrece un mero envo (y se ver si con suerte llega) de datos.
Puesto que no existe aqu la conexin no hay proceso previo alguno antes de
enviar informacin. Para poder comunicar con otro proceso lo nico que hay que
hacer es crear el socket y utilizar sus mtodos para el envo y recepcin de
informacin.
Creacin de un DatagramSocket.
Los constructores disponibles (desde la versin 1.0 del JDK) son:
DatagramSocket() Construye un socket para datagramas y lo conecta al
primer puerto disponible.
Pgina 5 de 15
SISTEMAS OPERATIVOS 2
Pgina 6 de 15
SISTEMAS OPERATIVOS 2
Atencin: Este ejemplo funcionar en Windows NT / 2k,, Linux o Solares. Para
correrlo en Windows 95/98 utilizar el puerto 7.
import java.net.*;
import java.io.*;
class ServidorEcoUdp extends Thread {
// el servidor correra en un thread
// para poder lanzarlo con el cliente
public void run(){
//aqui es donde se hace el trabajo (slo una instancia)
try{ // pueden producirse excepciones
byte[] datos,buffer=new byte[256];
DatagramSocket s=new DatagramSocket(1024); // puerto de
eco
DatagramPacket p;
int puerto,longitud;
InetAddress dir;
String mensaje;
System.out.println("Comienza la ejecucion del servidor ...");
while (true) {
p=new DatagramPacket(buffer,256);
s.receive(p); //espero un datagrama
datos=p.getData(); //obtengo datos
puerto=p.getPort(); //obtengo puerto origen
dir=p.getAddress(); //obtengo dir IP
longitud=p.getLength(); //longitud del mensaje
mensaje=new String(buffer,0,longitud); //texto del
//mensaje
System.out.println("Eco recibido en
Servidor:"+dir+":"+puerto+" > "+mensaje);
// construyo contestacion
p=new DatagramPacket(buffer,longitud,dir,puerto);
s.send(p); //devuelvo contestacion
}
}
catch(SocketException e) {System.out.println(e.toString());}
catch(IOException e) {System.out.println(e.toString());}
}
}
class EcoUdp {
public static void clienteEcoUdp() throws SocketException,
IOException, UnknownHostException {
Pgina 7 de 15
SISTEMAS OPERATIVOS 2
//en este mtodo hemos optado por no tratar las excepciones
String mensaje;
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader teclado = new BufferedReader(isr);
// puerto origen: el que encuentre libre
DatagramSocket s=new DatagramSocket();
do {
System.out.print("Escriba su mensaje en el cliente :");
mensaje=teclado.readLine();
if (mensaje != null) {
// lo convierte a vector de bytes
byte[] buffer= mensaje.getBytes();
//ahora construyo el paquete, especifico destino
// local y puerto 1024
DatagramPacket p=new DatagramPacket( buffer,
mensaje.length(), InetAddress.getLocalHost(),1024);
s.send(p); //envio datagrama
}
} while (mensaje != null );
}
public static void main(String param[]) throws SocketException,
IOException {
// se instancia el thread
ServidorEcoUdp servidor=new ServidorEcoUdp();
// lo lanzo
servidor.start();
// cliente de eco UDP
clienteEcoUdp();
}
}
Pgina 8 de 15
SISTEMAS OPERATIVOS 2
Se puede plantear un smil con el telfono. Si dos usuarios desean comunicar por
telfono entre s, no es una buena estrategia que ambos intenten llamar al otro,
pues al estar los dos telfonos descolgados siempre obtendrn seal de
comunicando. Es mejor que acuerden que uno de ellos (el servidor) espere la
llamada del otro (cliente). De este modo no habr problema para establecer la
comunicacin.
Operaciones en el servidor.
Creacin del ServerSocket.
En Java existen dos constructores para crear un ServerSocket:
public ServerSocket(int port);
public ServerSocket(int port, int count);
En el primer caso se crea un socket local al que se enlaza el puerto especificado y
acepta hasta 50 peticiones en cola (pendientes) de conexin por parte de los
clientes.
En el segundo caso se puede especificar el nmero mximo de peticiones de
conexin que se pueden mantener en cola.
En cualquiera de los dos casos, un puerto 0 indica que se utilice cualquier puerto
disponible.
En la mayora de los casos no suele importar en qu puerto se halle el servidor,
pero es fundamental que el puerto escogido sea conocido por el cliente, ya que,
de no ser as no se podr establecer la conexin.
En otras ocasiones se trata de protocolos normalizados que tendrn que atender
en un puerto local especfico. As, por ejemplo, el servidor de SMTP (Simple Mail
Protocol) para correo electrnico escucha siempre en el puerto 25 o el de HTTP
(HyperText Transfer Protocol), el del WWW, escucha siempre en el 80. Los
primeros 1024 puertos (del 0 al 1.023) son de uso reservado para el sistema.
Pgina 9 de 15
SISTEMAS OPERATIVOS 2
espera a que se realice una conexin por parte del cliente para seguir su
ejecucin.
Una vez que se establece una conexin por el cliente, el mtodo accept() devuelve
un objeto de tipo Socket, a travs del cual se establecer la comunicacin con el
cliente.
Los objetos de tipo ServerSocket nicamente sirven para aceptar llamadas de
clientes, no para establecer comunicaciones con los clientes. Es una especie de
encargado de recibir llamadas (peticiones de conexin) que no es capaz de
completarlas, tan slo nos avisa cuando se han producido y nos proporciona la
informacin necesaria para que podamos completarlas mediante la creacin de un
objeto Socket.
Operaciones en el cliente.
Como ya se ha indicado, es el cliente el que iniciar activamente el proceso de
conexin. Para poder conectar con algn servidor, el cliente necesita varias cosas:
1. Conocer la direccin IP dnde reside el servidor3.
2. Conocer el puerto en el que est esperando conexiones el servidor.
Pgina 10 de 15
SISTEMAS OPERATIVOS 2
public Socket(String host, int port, boolean stream);
Para la creacin de un Socket, hay que proporcionar la direccin (o nombre) del
host y el puerto, del host remoto.
Pgina 11 de 15
SISTEMAS OPERATIVOS 2
Envo de datos:
Para enviar datos, pueden utilizarse los OutputStream de los socket directamente
si lo que se pretende enviar es un flujo de bytes sin buffer, o puede crearse un
objeto de tipo stream de datos ms evolucionado basado en el OutputStream que
proporciona el socket.
Por ejemplo:
Pgina 12 de 15
SISTEMAS OPERATIVOS 2
Recepcin de datos:
Para recibir datos, al igual que para el envo, puede utilizarse el InputStream que
proporciona el socket o definir un nuevo objeto de tipo stream ms eficiente.
Por ejemplo:
BufferedReader lectura;
String s;
lectura=new BufferedReader( new
InputStreamReader(socketRecepcion.getInputStream()));
while ("#".compareTo(s = lectura.readLine())!=0) {
System.out.println(nombre+": "+s);
}
Ejemplo.
Habitualmente es necesario construir dos programas, uno para el cliente y otro
para el servidor, para poder realizar algn tipo de prueba. Una solucin puede
pasar por emplear un cliente o servidor ya construido para realizar esas pruebas,
con lo que slo sera necesario construir el programa complementario.
Por ejemplo, se puede utilizar el programa telnet como cliente de muchas
aplicaciones simplemente especificando el puerto al que se desea conectar (ya
que por defecto este programa se conecta al puerto TCP 23 dnde se encuentra el
servidor).
Del mismo modo, muchos sistemas operativos (excepto Windows 95) incluyen un
servidor de eco TCP en el puerto 7 (el mismo puerto que en UDP) que puede
permitir verificar que una aplicacin cliente, que se est desarrollando, al menos
comunica correctamente.
Pgina 13 de 15
SISTEMAS OPERATIVOS 2
Pgina 14 de 15
SISTEMAS OPERATIVOS 2
System.out.println("Con:"+tcp.toString());
// conectamos salida
OutputStream salida=tcp.getOutputStream();
// conectamos entrada
InputStream entrada=tcp.getInputStream();
// buffer transmision
byte[] buffer= new byte[256];
// buffer recepcion
byte[] buffer2= new byte[256];
int longitud,longitud2=0;
while (true) {
// leemos una linea
System.out.println("Escriba una cadena:");
longitud=System.in.read(buffer);
// la enviamos por el socket
salida.write(buffer,0,longitud);
// leemos la respuesta
longitud2=entrada.read(buffer2);
// mostramos respuesta
System.out.write(buffer2,0,longitud2);
}
ELABORACIN DE INFORME
1. Qu dos tipos de servicio bsicos ofrece la comunicacin en Java?
2. Dnde est, habitualmente, la interface de usuario en un programa clienteservidor?
3. Qu es un socket?
4. Qu tipos de socket proporciona Java y en qu paquete se encuentran?
5. Cul es la finalidad de un RAW SOCKET?
6. Por qu se han creado dos threads en el programa del eco UDP? De qu
se encarga cada uno?
7. Por qu en el programa de eco UDP se reciben dos ecos de una misma
lnea?
8. Por qu se dice que un stream socket permite una comunicacin fiable?
9. Cul es la finalidad de la clase ServerSocket?
10. Cul es la condicin de finalizacin del servidor ejemplo de eco TCP?
Pgina 15 de 15