Академический Документы
Профессиональный Документы
Культура Документы
Introduccin
El package java.net proporciona clases para programar aplicaciones de red, en l estn las clases
Socket(clientes) y ServerSocket(servidores), las cuatro primeras operaciones pertenecen a los sockets
clientes, las restantes se necesitan para los sockets servidores, en este trabajo practico explicaremos como
utilizar los Sockets clientes y Sockets servidores, planteando ejercicios.
Cuando se crea un socket cliente usando el constructor Socket(), el socket intenta conectarse al host remoto, si
no se establece la conexin, se produce un error. Si se establece la conexin, tanto el host local como el remoto
pueden enviar y recibir datos utilizando streams desde el socket. La conexin que se establece es del tipo full-
duplex: el host local y remoto envan y reciben datos simultneamente.
El formato de los datos que se envan o reciben desde el socket depende del protocolo que se este usando.
Cuando la transmisin de datos se ha terminado, uno de los dos hosts cierra la conexin, dependiendo del
protocolo que se este utilizando (por ejemplo: HTTP requiere que la conexin se cierre por cada respuesta, en
tanto FTP permite procesar mltiples pedidos en una conexin.)
En este prctico utilizaremos dos clases del paquete java.net, las clases Socket y ServerSocket.
El constructor recibe el nombre del host y el puerto al que debe intentar conectase, puede lanzar dos
excepciones, por lo cual habr que capturarlas por separado. Luego de establecida la conexin, se puede
verificar el nombre del host y el puerto al que se conect utilizando los mtodos:
Ejemplo:
El siguiente programa intenta establecer una conexin con un host remoto (www.google.com.ar) en el puerto 80
(HTTP).
1. import java.net.*;
2. import java.io.*;
3.
4. public class Puertos_tcp {
5.
6. public static void main(String[] args){
7.
8. Socket so_check_port;
9. String host = "www.google.com.ar";
10.
11. try {
12. so_check_port = new Socket(host,80);
13. System.out.println("conectado:" + so_check_port.getInetAddress());
14. System.out.println("port :" + so_check_port.getPort() );
15. } // try
16. catch (UnknownHostException e){
17. System.out.println(e);
18. } // catch
Ejercicio 1
Realizar un programa que permita determinar a cuales de los puertos entre el 1 al 1024 se puede establecer
una conexin a : 1) - al host local 2) una maquina Linux del laboratorio.
Ejercicio 2
Realizar un programa que se conecte a un host y muestre informacin acerca de la conexin usando los
mtodos getInetAddress() y getPort().
Los programas manejan datos estructurados de acuerdo con sus necesidades (arreglos, listas, pilas, etc.). Sin
embargo los mensajes en la red deben transmitirse como secuencias de bytes. Las estructuras de datos deben
ser aplanadas (flattened) antes de ser transmitidas por la red y reconstruidas en el destino.
No todos las computadoras almacenan los datos primitivos de la misma manera, pueden tener distintos
formatos de representacin de punto flotante, o distinto tipo de representacin de caracteres tales como ASCII,
o UNICODE. Para hacer posible que dos computadoras puedan intercambiar datos independientemente de la
forma de representacin de datos que tengan, se puede usar algunos de estos mtodos:
1. Los datos se convierten a un formato externo antes de ser transmitidos y se revierten al formato
local en la recepcin.
2. Los datos se transmiten segn el formato del emisor, junto con una indicacin del formato utilizado
y el receptor los convierte si es necesario.
Para manejar los datos pueden usarse las clases DataInputStream y DataOutputStream que solucionan gran
parte del problema de representacin de los datos en la red. En particular, si maneja cadenas de caracteres,
pueden usarse los mtodos readUTF() de la clase DataInputStream y writeUTF() de la clase
DataOutputStream para enviar y recibir datos como String respectivamente, aunque las mquinas tengan
distinta representacin interna.
El UTF-8 (Universal Transfer Format) es una codificacin de datos para ser transmitidos en un formato
universal.
Para simplificar an mas las cosas asumimos que en ambas partes (cliente y servidor) se codifican los datos en
ASCII, pueden utilizarse entonces los mtodos readLine() de la clase DataInputSytream y writeLine() de la
clase PrintStream para leer y enviar datos como String's.
1. import java.net.*;
2. import java.io.*;
3.
4. public class Daytime {
5.
6. public static void main(String[] args){
7.
8. Socket so_daytime; // declaracion del socket
9. DataInputStream data_daytime; // declaracion del DataInputStream
10. String host = "www.ora.com";
11. //String host = "10.10.11.2"; // al server del lab
12.
13. try{
14. //crea el socket y se intenta conectar
15. so_daytime = new Socket(host,13);
16. // crea el DataStream con InputStream del socket
17. data_daytime = new DataInputStream(so_daytime.getInputStream());
18.
19. //lee una linea en el Stream,
20. //en el stream estan los datos enviados por el server
21. String line = data_daytime.readLine();
22.
23. // verifica el nombre del host y el puerto donde se conecto
24. System.out.println("conectado a :" + so_daytime.getInetAddress());
25. System.out.println("port :" + so_daytime.getPort() );
26. System.out.println("dia y hora :" + line );
27. so_daytime.close();
28. } // end try
29.
30. catch (UnknownHostException e){
31. // si hubo error lo envia a la salida por defecto
32. System.out.println(e);
33. } // end catch
34. catch (IOException e) {
35. // si hubo error lo envia a la salida por defecto
36. System.out.println(e);
37. }
38. }
39. }
Ejercicio 3
Realice el ejemplo anterior, utilice una maquina Linux como Server donde consultar la hora.
El socket enva datos escribiendo en un OutputStream. Para obtener el OutputStream asociado al socket se
usa el mtodo getOutputStream(). Para manejar los datos en ASCII se utiliza la clase PrintStream.
Para probar el envo de datos se usa el protocolo echo (RFC862). Echo es un protocolo de servicio TCP, cuyo
funcionamiento es el siguiente: un socket cliente se conecta en el puerto 7 del servidor echo, si el socket cliente
enva datos, el servidor echo contesta con un eco de los mismos datos, la conexin queda activa hasta que el
cliente decida cerrarla.
El programa a continuacin utiliza el protocolo echo a travs de un socket para enviar datos desde lnea de
comando a un servidor echo, luego lee los datos enviados desde el servidor y los manda a la salida estndar.
1. import java.net.*;
2. import java.io.*;
3.
4. public class Echo {
5.
6. public static void main(String[] args){
7. // Declaracion del socket
8. Socket so_echo;
9. // Declaracion del InputStream para el socket
10. DataInputStream data_in_socket;
11. // Declaracion del InputStream para la linea de comandos
12. DataInputStream data_in_consola;
13. String linea;
14. //Declaracion del OutStream
15. PrintStream data_out_socket;
16. // Declaracion del nombre del host servidor daytime
17. String host = "localhost";
18. // String host = "10.10.11.2"; // al server del lab
19. try{
20. //crea el socket y se intenta conectar
21. so_echo = new Socket(host,7);
22.
23. // crea el DataStream con InputStream del socket
24. data_in_socket = new DataInputStream(so_echo.getInputStream());
25. // crea el PrintStream con el OutputStream del socket
26. data_out_socket = new PrintStream(so_echo.getOutputStream());
27.
28. // crea el Stream de entrada
29. data_in_consola = new DataInputStream(System.in);
30.
31. while(true) {
32. //lee una liena desde la consola
33. linea = data_in_consola.readLine();
34. if (linea.equals(".")) break;
35. // envia la linea el Strem del Socket
36. data_out_socket.println(linea);
37. // lee los datos del InputSteeam del socket y
38. //los envia a la salida estandar
39. System.out.println(data_in_socket.readLine());
Ejercicio 4
Realizar el ejemplo anterior, utilice una maquina Linux del laboratorio para probar el programa.
Un socket servidor esta preparado para atender en un puerto, escuchar pedidos de conexin, aceptar y cerrar
conexiones. Al crear un ServerSocket, el constructor ServerSocket(.....) deja el socket servidor escuchando en
un determinado puerto, el mtodo accept() escucha un pedido de conexin y retorna un objeto socket
conectado con el socket cliente. Los datos se envan y reciben utilizando un socket del lado del cliente y un
socket del lado del servidor. El funcionamiento del socket servidor se puede sintetizar en los siguientes pasos :
El siguiente programa acepta una conexin, enva un mensaje al cliente y cierra la conexin.
1. import java.net.*;
2. import java.io.*;
3.
4. public class Server_msg {
5.
6. public static void main(String[] args){
7.
8. // Declaracion del socket Servidor
9. ServerSocket so_serv;
10.
11. //Declaracion del OutStream donde escribira el Socket de la conexion
12. PrintStream data_out_conex;
13.
14. try{ // try 1
15. //crea el socket Server atendiendo en el puerto 7000
16. so_serv = new ServerSocket(7000);
17. System.out.println("Servidor atendiendo en el puerto 7000");
18. try {
19. while(true) {
20.
21. // Declara un socket para atender la conexion
22. Socket so_conex = so_serv.accept();
23.
24. // crea el PrintStream con el OutputStream del socket
25. data_out_conex = new PrintStream(so_conex.getOutputStream());
26. data_out_conex.println("Se a conectado al socket servidor ");
27. so_conex.close();
28. } //fin del while
29. } // end try
30. catch (UnknownHostException e){
31. // si hubo error lo envia a la salida por defecto
32. System.out.println(e);
33. } // end catch
34. catch (IOException e) {
35. // si hubo error lo envia a la salida por defecto
36. System.out.println(e);
37. }
38. //cierra el socket Server
39. so_serv.close();
40. } // Cierra try 1
41. catch (IOException e) {
42. // si hubo error lo envia a la salida por defecto
43. System.out.println(e);
44. }
45. }
46. }
Ejercicio 5
Modifique el programa anterior para que el servidor atienda en el puerto que recibe desde lnea de comando por
ej. Linux_machine> java Server_msg 7000.
Ejercicio 6
Realizar un programa cliente que se conecte al servidor del ejemplo anterior, lea los datos que le enva el
servidor y los enve a la salida estndar de SO (el programa recibe los datos de nombre de host y puerto al que
debe conectarse desde lnea de comandos) . Para verificar el funcionamiento debe dejar el programa del
servidor corriendo en algn host de un compaero y corra este programa en otro host.
Ejercicio 7
Desarrollar una aplicacin para enviar mensajes entre maquinas usando Sockets cliente y servidor
Ejercicio 8
Realizar una aplicacin para transferir archivos desde diferentes maquinas. Una aplicacin servidora que
comunica a los distintos clientes, los clientes pueden enviar archivos entre ellos.