Вы находитесь на странице: 1из 8

Facultad Regional Concepcin del Uruguay

Ingeniera en sistemas de informacin


Redes de informacin 4to ao

Servicio de Transporte confiable Sockets TCP


Contenidos
Introduccin ............................................................................................................................................................1
Socket TCP Cliente.................................................................................................................................................1
Establecer una conexin TCP ..............................................................................................................................1
Ejemplo:.............................................................................................................................................................2
Ejercicio 1 ..........................................................................................................................................................3
Ejercicio 2 ..........................................................................................................................................................3
Datos en la red Streams ....................................................................................................................................3
Recibir datos con un socket TCP..........................................................................................................................3
Ejercicio 3 ..........................................................................................................................................................4
Enviar datos con un socket TCP...........................................................................................................................4
Ejercicio 4 ..........................................................................................................................................................6
Socket TCP Servidor ..............................................................................................................................................6
Aceptar y Cerrar conexiones en el Server Socket TCP........................................................................................6
Ejercicio 5 ..........................................................................................................................................................7
Ejercicio 6 ..........................................................................................................................................................8
Ejercicio 7 ..........................................................................................................................................................8
Ejercicio 8 ..........................................................................................................................................................8

Introduccin

Un socket puede realizar siete operaciones bsicas:

1. Conectarse a una maquina remota


2. Enviar datos
3. Recibir datos
4. Cerrar una conexin
5. Escuchar en un puerto
6. Prepararse para aceptar datos de entrada
7. Aceptar conexiones de una maquina remota en un puerto especfico.

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.

Socket TCP Cliente

Establecer una conexin TCP

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.

Ing. Ulises M. A. Rapallini - 1


Facultad Regional Concepcin del Uruguay
Ingeniera en sistemas de informacin
Redes de informacin 4to ao

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.

Para crear un socket cliente usaremos el constructor:

public Socket(String host, int port)throws UnknownHostException,IOException

(Observe los otros constructores de la clase en la documentacin de Java)

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:

InetAddress getInetAddress() Returns the address to which the socket is connected.


int getPort() Returns the remote port to which this socket is connected.

Existen otros mtodos que dan informacin sobre el socket: getKeepAlive(),getLocalAddress(),


getLocalPort(), getReceiveBufferSize(), getSendBufferSize(), getSoLinger(),
getSoTimeout(), getTcpNoDelay(), verifique en la documentacin de java el uso de cada uno de
ellos.

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

Ing. Ulises M. A. Rapallini - 2


Facultad Regional Concepcin del Uruguay
Ingeniera en sistemas de informacin
Redes de informacin 4to ao

19. catch (IOException e) {


20. System.out.println(e);
21. } // catch
22. }
23. } // Puertos_tcp

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().

Datos en la red Streams

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.

Recibir datos con un socket TCP

En el siguiente programa, el mtodo getInputStream() retorna el ImputStream asociado a so_daytime y lo


utiliza para crear un DataInputStream desde donde el programa lee usando readLine(). Usaremos un protocolo
llamado "daytime" ( RFC867 ) como ejemplo para leer datos desde un socket, este protocolo nos da informacin
del da y la hora. El socket cliente se conecta con el servidor daytime en el puerto 13 y el servidor responde
enviando los datos del da y la hora.
Ing. Ulises M. A. Rapallini - 3
Facultad Regional Concepcin del Uruguay
Ingeniera en sistemas de informacin
Redes de informacin 4to ao

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.

Enviar datos con un socket TCP

Ing. Ulises M. A. Rapallini - 4


Facultad Regional Concepcin del Uruguay
Ingeniera en sistemas de informacin
Redes de informacin 4to ao

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());

Ing. Ulises M. A. Rapallini - 5


Facultad Regional Concepcin del Uruguay
Ingeniera en sistemas de informacin
Redes de informacin 4to ao

40. } //fin del while


41.
42. //cierra la conexion
43. so_echo.close();
44. } // end try
45. catch (UnknownHostException e){
46. // si hubo error lo envia a la salida por defecto
47. System.out.println(e);
48. } // end catch
49.
50. catch (IOException e) {
51. // si hubo error lo envia a la salida por defecto
52. System.out.println(e);
53. }
54. }
55. }

Ejercicio 4
Realizar el ejemplo anterior, utilice una maquina Linux del laboratorio para probar el programa.

Socket TCP Servidor

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 :

1. Creacin de un servidor con el mtodo ServerSocket(), atendiendo en un puerto.


2. El servidor escucha los intentos de pedido de conexin en el puerto usando el mtodo accept(),
crea una conexin retornando un objeto socket conectado al socket cliente.
3. Se leen datos en el InputStream o se escriben datos en el OutputStream con los mtodos
getInputStream() o getOutputSteam() para comunicarse con el cliente.
4. El servidor y el cliente interactan de acuerdo al protocolo que se este utilizando, hasta que se
cierra la conexin.
5. El cliente o el servidor cierran la conexin.
6. Se retorna al paso 2, esperando una nueva conexin.

Aceptar y Cerrar conexiones en el Server Socket TCP

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 {

Ing. Ulises M. A. Rapallini - 6


Facultad Regional Concepcin del Uruguay
Ingeniera en sistemas de informacin
Redes de informacin 4to ao

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.

Ing. Ulises M. A. Rapallini - 7


Facultad Regional Concepcin del Uruguay
Ingeniera en sistemas de informacin
Redes de informacin 4to ao

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.

Ej. En la maquina servidor nombre_server#java Server_msg 3500


En la maquina cliente nombre_cliente#java Cliente_msg nombre_server 3500

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.

Ing. Ulises M. A. Rapallini - 8

Вам также может понравиться