Programación Sockets
Programación Sockets
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
TCP SERVER
import java.io.*;
import java.net.*;
class appServer {
String fraseCliente;
String fraseMayusculas;
while(true) {
}
}
}
Cdigo comentado:
import java.io.*;
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.
//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.
while(true) {
// 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.
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.
//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.
TCP CLIENTE
import java.util.Date;
import java.io.*;
import java.net.*;
String frase;
String fraseModificada;
socketCliente.getInputStream()));
frase = entradaDesdeUsusario.readLine();
salidaAServidor.writeBytes(frase + '\n');
fraseModificada = entradaDesdeServidor.readLine();
socketCliente.close();
Cdigo comentado:
import java.util.Date;
import java.io.*;
import java.net.*;
// Se usa en combinacin con las clases del paquete java.io para leer y escribir datos en la red.
// 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.
// 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.
String frase;
//Declara objeto de tipo String. El objeto frase es la cadena escrita por el usuario y enviada al
servidor.
String fraseModificada;
// 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.
// 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();
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
import java.io.*;
import java.net.*;
class UDPServidor {
while(true)
socketServidor.receive(recibirPaquete);
socketServidor.send(enviarPaquete);
Cdigo comentado:
import java.io.*;
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
// 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.
while(true)
// 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.
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.
socketServidor.send(enviarPaquete);
UDP CLIENTE
import java.io.*;
import java.net.*;
class UDPCliente {
enviarDatos = frase.getBytes();
socketCliente.send(enviarPaquete);
socketCliente.receive(recibirPaquete);
Cdigo comentado:
import java.io.*;
import java.net
// Se usa en combinacin con las clases del paquete java.io para leer y escribir datos en la red.
class UDPCliente {
// 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.
// 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.
// 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.
// 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.
// Conversin de tipos. Toma la cadena frase y la renombra como enviarDatos, que es un array de
bytes.
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.
socketCliente.receive(recibirPaquete);
// El cliente est inactivo hasta que recibe un paquete y cuando le llega, lo almacena en
recibirPaquete.
// Extrae los datos de recibirPaquete y realiza una conversin de tipos, convirtiendo un array de
bytes en la cadena fraseModificada.
// Esta lnea, que tambin aparece en TCPCliente, muestra la cadena fraseModificada en el monitor
del cliente
socketCliente.close();
// Cierra el socket.