Vous êtes sur la page 1sur 15

UNIVERSIDAD SURCOLOMBIANA

FACULTAD DE INGENIERA
INGENIERA ELECTRNICA
REDES DE DATOS
PROGRAMACIN DE SOCKETS CON TCP Y UDP
FERNANDO CAMPOS ARCHILA CD. 20131119489
OSCAR QUIROGA GARCS CD. 20131119489

PROGRAMACIN DE SOCKETS CON TCP

TCP SERVER

A continuacin, se presenta el cdigo para el lado del servidor de la aplicacin:

import java.io.*;
import java.net.*;

class appServer {

public static void main(String argv[]) throws Exception {

String fraseCliente;
String fraseMayusculas;

ServerSocket socketAcogida = new ServerSocket (6789);

while(true) {

Socket socketConexion = socketAcogida.accept();

BufferedReader entradaDesdeCliente = new BufferedReader(new


InputStreamReader(
socketConexion.getInputStream()));

DataOutputStream salidaACliente = new DataOutputStream(


socketConexion.getOutputStream());
fraseCliente = entradaDesdeCliente.readLine();
fraseMayusculas = fraseCliente.toUpperCase() + '\n';
salidaACliente.writeBytes(fraseMayusculas);

}
}
}

Cdigo comentado:

import java.io.*;

//Entrada/Salida. Clases que definen distintos flujos de datos.

import java.net.*;

//Se usa en combinacin con las clases del paquete java.io para leer y escribir datos en la red.

class AppServer {

// La palabra clave class inicia la definicin de la clase cuyo nombre es Appserver. Una clase contiene
variables y mtodos.

public static void main(String argv[]) throws Exception {

//En esta lnea de cdigo se define una funcin, o mtodo, pblica y esttica denominada main(). La
palabra reservada static se utiliza para definir las propiedades o los mtodos que pertenecen a una
clase, en este caso la clase App server, en vez de pertenecer a un objeto, o instancia, de esa clase.
El tipo de dato void se usa para indicar a la funcin, o mtodo, que no devuelva parmetros. Todo
programa en Java necesita una funcin, o mtodo, denominada main() para establecer el inicio del
programa. El contenido de dicha funcin, String[] argv, define un vector de cadenas de caracteres
donde recoger los argumentos pasados en la ejecucin del programa App Server.

La palabra clave throws se utiliza para identificar la lista posible de excepciones que un mtodo
puede lanzar. Para la mayora de las subclases de la clase Exception, el compilador Java obliga a
declarar qu tipos podr lanzar un mtodo.

String fraseCliente;

String fraseMayusculas;

//Strings son una secuencia de caracteres. En el lenguaje de programacin Java, las cadenas de
caracteres son objetos y la plataforma proporciona la clase String para crear y manipular dichas
cadenas.

ServerSocket socketAcogida = new ServerSocket (6789);


// La clase ServerSocket es la que se utiliza a la hora de crear servidores, Para comunicaciones
fiables en modo conectado, de dos vas y con tamao variable de los mensajes de datos. Si se
rompe la conexin entre los procesos, stos sern informados, el SocketAcogida indica que se crea
un server de acogida que est pendiente ante la solicitud de cualquier cliente, el new ServerSocket
(6789); indica que la interaccion de datos se realizara por medio del puerto 6789.

while(true) {

// Inicia un ciclo infinito.

Socket socketConexion = socketAcogida.accept();

// En la primera parte establece la comunicacin entre los dispositivos (server-client) por medio de
una conexin tipo Socket, El socket de acogida espera con el mtodo accept() al contacto de un
cliente, retornando un nuevo socket.

BufferedReader entradaDesdeCliente = new BufferedReader(new

InputStreamReader(socketConexion.getInputStream()));

// BufferedReader que nos permite leer una lnea completa, Lee una lnea de texto hasta que
encuentra un carcter de salto de lnea (\n) y retorno de carro (\r). en este caso la entrada
proveniente desde el cliente, InputStreamReader es un puente de flujos de bytes de streams de
caracteres: Se lee bytes y los decodifica en caracteres que utilicen un especificado carcter, esta
cadena de caracteres los lee provenientes de la conexin por medio del socket que esta enlazado
con el cliente, leyendo as lo que envi el cliente, el getInputStream capta los datos ingresados y
produce una excepcin apropiada si no puede hacerlo.

DataOutputStream salidaACliente = new


DataOutputStream(socketConexion.getOutputStream());

//El DataOutputStream Crea un nuevo flujo de salida de datos para escribir datos en el flujo de salida
subyacente especificado, en este caso en la salida hacia el cliente, este flujo lo enva a travs de una
conexin tipo socket, getOutputStream obtiene el flujo de salida del subproceso. El flujo obtenido
se canaliza hacia la salida de manera estndar.

fraseCliente = entradaDesdeCliente.readLine();

// Lee la lnea de caracteres de entrada proveniente del cliente y los guarda como una variable tipo
char frase cliente.
fraseMayusculas = fraseCliente.toUpperCase() + '\n';

// Devuelve una cadena igual a la guardada en la variable frasecliente pero con todos los
caracteres en maysculas. No afecta como es lgico a caracteres no alfabticos, o sea, a los
nmeros, letras acentuadas y caracteres especiales como la , y la almacena en la variable
fraseMayuscula.

salidaACliente.writeBytes(fraseMayusculas);

// Escribe una matriz de valores de byte de los caracteres contenido en frase mayuscula en el
flujo de salida. salidaACliente.

// Se cierra el ciclo a la espera de una nueva conexin servidor cliente.

PROGRAMACIN DE SOCKETS CON UDP

TCP CLIENTE

A continuacin, se presenta el cdigo para el lado del cliente de la aplicacin:

import java.util.Date;

import java.io.*;

import java.net.*;

public class appCliente {

public static void main(String argv[]) throws Exception {

System.out.println("\nHoy = " + new Date());

String frase;

String fraseModificada;

BufferedReader entradaDesdeUsusario = new BufferedReader( new


InputStreamReader(System.in));

Socket socketCliente = new Socket("172.16.2.66", 6789);


DataOutputStream salidaAServidor = new DataOutputStream (
socketCliente.getOutputStream());

BufferedReader entradaDesdeServidor = new BufferedReader(new


InputStreamReader(

socketCliente.getInputStream()));

frase = entradaDesdeUsusario.readLine();

salidaAServidor.writeBytes(frase + '\n');

fraseModificada = entradaDesdeServidor.readLine();

System.out.println("DEL SERVIDOR: " + fraseModificada);

socketCliente.close();

Cdigo comentado:

import java.util.Date;

// La clase java.util.Date representa un instante de tiempo especfico, con precisin de milisegundos.

import java.io.*;

// Paquete de Java. Entrada/Salida. Clases que definen distintos flujos de datos.

import java.net.*;

// Se usa en combinacin con las clases del paquete java.io para leer y escribir datos en la red.

public class appCliente {

// La palabra clave class inicia la definicin de la clase cuyo nombre es appCliente.

public static void main(String argv[]) throws Exception {

// El mtodo main() llama a los restantes mtodos necesarios para ejecutar la aplicacin.

El tipo de dato void se usa para indicar a la funcin, o mtodo, que no devuelva parmetros.
La palabra reservada static se utiliza para definir las propiedades o los mtodos que pertenecen a
una clase, en este caso la clase appCliente, en vez de pertenecer a un objeto, o instancia, de esa
clase. El contenido de dicha funcin, String[] argv, define un vector de cadenas de caracteres donde
recoger los argumentos pasados en la ejecucin del programa appCliente.

La palabra clave throws se utiliza para identificar la lista posible de excepciones que un mtodo
puede lanzar. Para la mayora de las subclases de la clase Exception, el compilador Java obliga a
declarar qu tipos podr lanzar un mtodo.

System.out.println("\nHoy = " + new Date());

// Esto es una funcin contenida en la API de Java SE que imprime, println(), en la salida, out, de la
consola, System. Este objeto dispone de un mtodo llamado println que nos permite imprimir algo
por pantalla en una ventana de consola.

El smbolo + se usa para concatenar cadenas de texto, o variables, en este caso n.

Tener en cuenta que la primera S de System.out es mayscula. Si se escribe minscula se obtendr


un error de compilacin

String frase;

//Declara objeto de tipo String. El objeto frase es la cadena escrita por el usuario y enviada al
servidor.

String fraseModificada;

// El objeto fraseModificada es la cadena proporcionada por el servidor y enviada a la salida estndar


del usuario.

BufferedReader entradaDesdeUsusario = new BufferedReader( new


InputStreamReader(System.in));

// Crea el objeto de flujo entradaDesdeUsuario de tipo Buffered Reader. El flujo de entrada se


inicializa con System.in, que asocia el flujo a la entrada estndar. El comando permite al cliente leer
texto introducido a travs de su teclado.

// BufferedReader nos permite leer una lnea completa,

// InputStreamReader es un puente de flujos de bytes de streams de caracteres.

Socket socketCliente = new Socket("172.16.2.66", 6789);


// Crea el objeto socketCliente de tipo Socket. Tambin inicia la conexin TCP entre el cliente y el
servidor. La primera cadena nombrehost tiene que sustituirse por el nombre de host del servidor
(por ejemplo, apple.poly.edu). Antes de que la conexin TCP se inicie realmente, el cliente realiza
una bsqueda DNS con el nombre de host para obtener la direccin IP correspondiente. El nmero
6789 es el nmero de puerto. Puede utilizar un nmero de puerto diferente, pero debe asegurarse
de utilizar el mismo nmero de puerto en el lado del servidor de la aplicacin. Como ya hemos
mencionado con anterioridad, la direccin IP del host junto con el nmero de puerto de la aplicacin
identifican al proceso servidor.

DataOutputStream salidaAServidor = new DataOutputStream (


socketCliente.getOutputStream());

// Crea objeto de flujo que est asociado al socket. El flujo salidaAServidor proporciona la salida del
proceso hacia el socket.

//El DataOutputStream Crea un nuevo flujo de salida de datos para escribir datos en el flujo de salida
subyacente especificado.

BufferedReader entradaDesdeServidor = new BufferedReader(new InputStreamReader(


socketCliente.getInputStream()));

// Crea objeto de flujo que est asociado al socket. El flujo entradaDesdeServidor proporciona la
entrada de proceso a partir del socket.

frase = entradaDesdeUsusario.readLine();

// Introduce el texto escrito por el usuario en la cadena frase. Esta cadena frase contina
recopilando caracteres hasta que el usuario termina la lnea introduciendo un retorno de carro. La
lnea pasa desde la entrada estndar a travs del flujo entradaDesdeUsuario a la cadena frase.

salidaAServidor.writeBytes(frase + '\n');

// Introduce la cadena frase con un retorno de carro adicional en el flujo salidaAServidor. Esta
cadena aumentada fluye a travs del socket del cliente y entra en el canal TCP. El cliente entonces
espera a recibir los caracteres procedentes del servidor.

fraseModificada = entradaDesdeServidor.readLine();

// Cuando llegan caracteres desde el servidor, entran en el flujo entradaDesdeServidor y se


almacenan en la cadena fraseModificada. Los caracteres continan acumulndose en
modifiedSentence hasta que la lnea termina con un carcter de retorno de carro.
System.out.println("DEL SERVIDOR: " + fraseModificada);

// Muestra en el monitor la cadena fraseModificada devuelta por el servidor.

socketCliente.close();

// Cierra el socket y, por tanto, cierra tambin la conexin TCP entre el cliente y el servidor. Hace
que TCP en el cliente enve un mensaje TCP a TCP en el servidor.

UDP SERVER

A continuacin, se presenta el cdigo para el lado del servidor de la aplicacin:

import java.io.*;

import java.net.*;

class UDPServidor {

public static void main(String args[]) throws Exception

DatagramSocket socketServidor = new DatagramSocket(9876);

byte[] recibirDatos = new byte[1024];

byte[] enviarDatos = new byte[1024];

while(true)

DatagramPacket recibirPaquete = new DatagramPacket(recibirDatos,


recibirDatos.length);

socketServidor.receive(recibirPaquete);

String frase = new String( recibirPaquete.getData());

InetAddress DireccionIP = recibirPaquete.getAddress(); int puerto =


recibirPaquete.getPort();
String fraseMayusculas = frase.toUpperCase(); enviarDatos =
fraseMayusculas.getBytes();

DatagramPacket enviarPaquete = new DatagramPacket(enviarDatos,


enviarDatos.length, DireccionIP, puerto);

socketServidor.send(enviarPaquete);

Cdigo comentado:

import java.io.*;

//Entrada/Salida. Clases que definen distintos flujos de datos.

import java.net.*;

//Se usa en combinacin con las clases del paquete java.io para leer y escribir datos en la red.

class UDPServidor {

// La palabra clave class inicia la definicin de la clase cuyo nombre es UDPservidor. Una clase
contiene variables y mtodos

public static void main(String args[]) throws Exception

// En esta lnea de cdigo se define una funcin, o mtodo, pblica y esttica denominada main().
La palabra reservada static se utiliza para definir las propiedades o los mtodos que pertenecen a
una clase, en este caso la clase App server, en vez de pertenecer a un objeto, o instancia, de esa
clase. El tipo de dato void se usa para indicar a la funcin, o mtodo, que no devuelva parmetros.
Todo programa en Java necesita una funcin, o mtodo, denominada main() para establecer el inicio
del programa. El contenido de dicha funcin, String[] args, define un vector de cadenas de caracteres
donde recoger los argumentos pasados en la ejecucin del programa App Server.

La palabra clave throws se utiliza para identificar la lista posible de excepciones que un mtodo
puede lanzar. Para la mayora de las subclases de la clase Exception, el compilador Java obliga a
declarar qu tipos podr lanzar un mtodo.

DatagramSocket socketServidor = newDatagramSocket(9876);


// Construye un socket de datagramas y se une a cualquier puerto disponible en la mquina host
local, lo nombra SocketServidor, el puerto de enlace es el 9876.

byte[] recibirDatos = new byte[1024];

byte[] enviarDatos = new byte[1024];

// Crea 2 buffers de 1Kb de capacidad nombrados recibirDatos y enviarDatos respectivamente

while(true)

// Inicia un ciclo infinito.

DatagramPacket recibirPaquete =new DatagramPacket(recibirDatos,recibirDatos.length);

// Entrega un paquete de datagramas sin conexin, en ruta el cliente con el servidor basado
nicamente en la informacin que contiene el paquete, recibe el paquete contenido en recibir
datos con una longitud establecida length.

socketServidor.receive(recibirPaquete);

// Recibe los datos provenientes recibir paquete y los guarda en un socket sockectServidor.

String frase = new String(recibirPaquete.getData());

// Guarda en frase la cadena de caracteres obtenida en el paquete recibir paquete.

InetAddress DireccionIP =recibirPaquete.getAddress();

// Guarda en Direccion IP la direccin IP prima de los datos contenidos en recibirPaquete.

int puerto = recibirPaquete.getPort();

// Devuelve el nmero de puerto remoto al que se conecta el socket recibirPaquete y lo guarda


en puerto.

String fraseMayusculas =frase.toUpperCase();


// Devuelve una cadena igual a la guardada en la variable frasecliente pero con todos los
caracteres en maysculas. No afecta como es lgico a caracteres no alfabticos, o sea, a los
nmeros, letras acentuadas y caracteres especiales como la , y la almacena en la variable
fraseMayuscula.

enviarDatos = fraseMayusculas.getBytes();

// Codifica la cadena fraseMayuscula en una secuencia de bytes que utilizan juego de caracteres
por defecto de la plataforma, almacenar el resultado en una nueva matriz de bytes enviarDatos.

DatagramPacket enviarPaquete =new DatagramPacket(enviarDatos,enviarDatos.length,


DireccionIP, puerto);

// Guarda en enviarPaquete el paquete de datagramas enviarDatos establecido con una medida


length, una direccin IP y puerto determinado.

socketServidor.send(enviarPaquete);

// Enva por medio del socket Servidor el paquete de datos enviarPaquete.

//Se cierra el ciclo a la espera de una nueva conexin servidor cliente.

UDP CLIENTE

A continuacin, se presenta el cdigo para el lado del cliente de la aplicacin:

import java.io.*;

import java.net.*;

class UDPCliente {

public static void main(String args[]) throws Exception

BufferedReader entradaDesdeUsuario = new BufferedReader(new InputStreamReader


(System.in));

DatagramSocket socketCliente= new DatagramSocket(); InetAddress DireccionIP =


InetAddress.getByName(nombrehost);
byte[] enviarDatos = new byte[1024];

byte[] recibirDatos = new byte[1024];

String frase = entradaDesdeUsuario.readLine();

enviarDatos = frase.getBytes();

DatagramPacket enviarPaquete = new DatagramPacket(enviarDatos, enviarDatos.length,


DireccionIP, 9876);

socketCliente.send(enviarPaquete);

DatagramPacket recibirPaquete = new DatagramPacket(recibirDatos, recibirDatos.length);

socketCliente.receive(recibirPaquete);

String fraseModificada = new String(recibirPaquete.getData());

System.out.println(DEL SERVIDOR: + fraseModificada); socketCliente.close();

Cdigo comentado:

import java.io.*;

// Paquete de Java. Entrada/Salida. Clases que definen distintos flujos de datos.

import java.net

// Se usa en combinacin con las clases del paquete java.io para leer y escribir datos en la red.

class UDPCliente {

// La palabra clave class inicia la definicin de la clase cuyo nombre es UDPCliente.

public static void main(String args[]) throws Exception {

// El mtodo main() llama a los restantes mtodos necesarios para ejecutar la aplicacin.

El tipo de dato void se usa para indicar a la funcin, o mtodo, que no devuelva parmetros.

La palabra reservada static se utiliza para definir las propiedades o los mtodos que pertenecen a
una clase, en este caso la clase appCliente, en vez de pertenecer a un objeto, o instancia, de esa
clase. El contenido de dicha funcin, String[] args, define un vector de cadenas de caracteres donde
recoger los argumentos pasados en la ejecucin del programa UDPCliente.

La palabra clave throws se utiliza para identificar la lista posible de excepciones que un mtodo
puede lanzar. Para la mayora de las subclases de la clase Exception, el compilador Java obliga a
declarar qu tipos podr lanzar un mtodo.

BufferedReader entradaDesdeUsuario = new BufferedReader(new InputStreamReader


(System.in));

// La lnea anterior crea el objeto de flujo entradaDesdeUsuario de tipo Buffered Reader. El flujo de
entrada se inicializa con System.in, que asocia el flujo a la entrada estndar. El comando permite al
cliente leer texto introducido a travs de su teclado.

DatagramSocket socketCliente= new DatagramSocket();

// El objeto socketClientede tipo DatagramSocket. En contraste con el TCP Cliente, esta lnea no
inicia una conexin TCP. En concreto, el cliente no se pone en contacto con el host servidor al
ejecutar esta lnea. Por esta razn, el constructor DatagramSocket() no toma como argumentos ni
el nombre de host del servidor ni el nmero de puerto. Por lo que crea una puerta para el proceso
cliente, pero no crea un conducto entre los dos procesos.

InetAddress DireccionIP = InetAddress.getByName(nombrehost);

// Innvoca una bsqueda DNS que traduzca el nombre de host en una direccin IP. La versin TCP
del programa cliente tambin invocaba a DNS, aunque lo haca de manera implcita, en lugar de
explcita. El mtodo getByName() toma como argumento el nombre de host del servidor y devuelve
la direccin IP del mismo y almacena dicha direccin en el objeto DireccionIP de tipo InetAddress.

byte[] enviarDatos = new byte[1024];

// El array de bytes enviarDatos almacenarn los datos que el cliente enva.

byte[] recibirDatos = new byte[1024];

// El array de bytes recibirDatos almacenarn los datos que el cliente recibe.

String frase = entradaDesdeUsuario.readLine();

// Obtendremos en frase a una "entradaDesdeUsuario".


enviarDatos = frase.getBytes();

// Conversin de tipos. Toma la cadena frase y la renombra como enviarDatos, que es un array de
bytes.

DatagramPacket enviarPaquete = new DatagramPacket(enviarDatos, enviarDatos.length,


DireccionIP, 9876);

// Construye el paquete, enviarPaquete, que el cliente introducir en la red a travs de su socket.


Este paquete incluye los datos contenidos en el paquete enviarDatos, la longitud de estos datos, la
direccin IPdel servidor y el nmero de puerto de la aplicacin (que se ha definido como 9876).

socketCliente.send(enviarPaquete);

// El mtodo send() del objeto socketCliente toma el paquete que se acaba de crear y lo introduce
en la red a travs de socketCliente.

DatagramPacket recibirPaquete = new DatagramPacket(recibirDatos, recibirDatos.length);

// El cliente crea un contenedor para el paquete, recibirPaquete, un objeto de tipo DatagramPacket,


mientras espera recibir el paquete del servidor.

socketCliente.receive(recibirPaquete);

// El cliente est inactivo hasta que recibe un paquete y cuando le llega, lo almacena en
recibirPaquete.

String fraseModificada = new String(recibirPaquete.getData());

// Extrae los datos de recibirPaquete y realiza una conversin de tipos, convirtiendo un array de
bytes en la cadena fraseModificada.

System.out.println(DEL SERVIDOR: + fraseModificada);

// Esta lnea, que tambin aparece en TCPCliente, muestra la cadena fraseModificada en el monitor
del cliente

socketCliente.close();
// Cierra el socket.

Vous aimerez peut-être aussi