Você está na página 1de 21

Programacin orientada a objetos III

Unidad 3. Programacin en red



1


Ingeniera en Desarrollo de software
Cuatrimestre 06



Asignatura:
Programacin orientada a objetos III




Clave: 150920622/ 160920622









Programacin orientada a objetos III
Unidad 3. Programacin en red

2


ndice
PRESENTACIN DE LA UNIDAD ......................................................................................... 3
PROPSITOS DE LA UNIDAD ............................................................................................. 3
COMPETENCIA ESPECFICA .............................................................................................. 3
TEMARIO DE LA UNIDAD..................................................................................................... 3
TEMA 3.1. MODELO CLIENTE-SERVIDOR .......................................................................... 4
TEMA 3.2. STREAMS ............................................................................................................ 5
CIERRE DE LA UNIDAD ..................................................................................................... 20
PARA SABER MS .......................................................................................................... 21
FUENTES DE CONSULTA .................................................................................................. 21
























Programacin orientada a objetos III
Unidad 3. Programacin en red

3

Presentacin de la unidad

Hoy en da el uso de las computadoras requiere un inevitable intercambio de informacin
con otros equipos, sea para revisar correos electrnicos, chatear, etc. Para poder realizar
este intercambio de informacin es necesario que se realicen programas que permitan dicho
intercambio, con este fin se cuenta con sockets que son los elementos que permiten el paso
de informacin entre equipos diferentes conectados a una misma red.

En esta tercera unidad de la materia Programacin orientada a objetos III, analizars el
modo de trabajo del modelo cliente-servidor, as como el funcionamiento de los streams; al
final se unirn los temas previos para realizar el manejo de sockets para crear programas
que trabajen en red, de manera que se puedan conectar varias computadoras para
intercambiar informacin.

Cabe sealar que la Unidad 3. Programacin en red, representa el cierre de la asignatura
Programacin orientada a objetos III, por lo tanto, es necesario que recuperes los
contenidos de unidades anteriores y de la Programacin orientadas a objetos I y II, pues,
ello te servir para avanzar en cada uno de los logros que componen a la competencia
especifica de la unidad.

Propsitos de la unidad

En esta unidad logrars:
Identificar el modelo de comunicacin clienteservidor.
Distinguir el funcionamiento y la estructura de los streams.
Crear programas en red mediante el uso de sockets.

Competencia especfica

Generar programas en red para el intercambio de informacin entre un cliente y un servidor,
mediante la manipulacin de sockets.

Temario de la unidad

3. Programacin en red
3.1. Modelo cliente-servidor
3.1.1. Cliente
3.1.2. Servidor
3.2. Streams
3.2.1. De entrada
3.2.2. De salida
3.3. Sockets
3.3.1. Apertura
3.3.2. Cierre


Programacin orientada a objetos III
Unidad 3. Programacin en red

4

3. Programacin en red

Hoy en da, la inmensa mayora de las computadoras que existen intercambian informacin
unas con otras; para intercambiar informacin, ya sea personal, comercial, o slo por
convivencia, las personas se encuentran en constante comunicacin y, en dicha actividad,
las computadoras son de gran ayuda, para permitir una instantnea comunicacin sin
importar las distancias. En el presente tema revisaremos lo que es la programacin en red,
con lo que aprenders a realizar programas que realicen un intercambio de informacin
entre computadoras.

Tema 3.1. Modelo cliente-servidor

En la actualidad el intercambio de informacin entre distintos equipos de cmputo se ha
vuelto muy importante, ya que una computadora aislada difcilmente ser de alta utilidad
para un usuario. Para lograr la comunicacin entre computadoras es importante realizar un
intercambio de informacin entre stas, de manera tal que debemos contar con una
computadora que envi una peticin de informacin (cliente) a otra, que al recibir la peticin
le responda con la informacin solicitada (servidor), tal como se muestra en la siguiente
imagen. De esta manera se logra tener un flujo de datos entre ambos equipos, con lo que se
logra el intercambio de informacin.



Figura. Modelo cliente-servidor

Para lograr realizar esto, Java ha desarrollado clases que permiten la manipulacin de los
puertos de las computadoras que permitan esta comunicacin en red entre los diferentes
equipos.

Tpicamente un cliente se reconoce como tal por ser quien comienza el intercambio de
informacin al realizar una peticin al servidor, mientras que el servidor espera a que los
clientes le estn solicitando informacin para responderles.



Programacin orientada a objetos III
Unidad 3. Programacin en red

5

Para que conozcas ms a fondo el modelo de intercambio de informacin cliente-servidor
revisa el siguiente material:

En el texto de Niemeyer, P. (2000, p. 258) se cuenta con una breve introduccin a la
programacin en red, donde encontrars la descripcin de lo que es un cliente y lo
que es un servidor, recordndonos que la principal diferencia es que el cliente puede
crear sockets para iniciar la comunicacin, mientras que el servidor est a la espera
de peticiones.
Por su parte Hervs, C. (2004 p. 1) nos muestra una descripcin de lo que es el
modelo cliente-servidor, donde se indica que los clientes inician las conexiones a un
puerto conocido del servidor siempre que est disponible un puerto del cliente para
realizar el intercambio de informacin.

Ahora bien, slo resta apuntar que para poder realizar un programa que trabaje en red
debers ajustarte al modelo cliente-servidor para el intercambio de informacin; por lo que,
como es de esperarse, se debern crear dos programas, uno que funcionar en el cliente y
otro en el servidor. Ms adelante, cuando veamos el tema de sockets, veremos un ejemplo
para crear un programa cliente y uno servidor, por el momento lo importante es que
comprendas este modelo de comunicacin.

Para concluir este tema, realiza la Actividad 1. Cliente-servidor, que se presenta en el
documento: Actividades de la unidad 3, donde identificars el modelo de comunicacin
cliente-servidor, as como identificar el papel que juega cada uno para la comunicacin en
red.

Tema 3.2. Streams

Para continuar con el tema, se revisar como al pretender mostrar u obtener alguna
informacin de un lugar externo, es necesario que el programa cree un flujo de datos para
poder manejarlos (algo parecido al canal de comunicacin que se abre para conectarse a
una base de datos). Por lo tanto, hay un flujo de entrada que recibe los datos desde el
exterior del programa y un flujo de salida que enva los datos hacia el ordenador u otro
dispositivo de almacenamiento.

Los streams tal como menciona Abin (2004, p.18) son tuberas o canales de
comunicaciones: tienen dos extremos entre los cuales fluyen los datos de manera continua.
En esta misma obra puede verse en Abin (2004, p. 101) una clara descripcin sobre lo que
son los streams y la distincin entre los flujos que toman datos desde una fuente externa
hacia el programa (stream de entrada) y por otra parte estn los flujos que mueven datos
desde un programa haca algn receptor externo (stream de salida).

En Flujos de datos en Java de FIC (2007, p. 33-36) encontrars la descripcin de los
procesos para la lectura y escritura de datos mediante el manejo de streams. Los cuales
pueden ilustrarse mediante las siguientes imgenes, donde en un equipo de origen,
mediante un stream se enva un flujo de informacin a un programa, que se encuentra


Programacin orientada a objetos III
Unidad 3. Programacin en red

6

alojado en otro equipo diferente al origen y se puede regresar mediante otro stream la
informacin de respuesta.



Figura. Flujos de datos en Java.
Recuperado de: FIC (2007).

Para el manejo flujos de entrada/salida, Java nos proporciona dos tipos de flujos posibles,
los de byte y los de caracteres. Los cuales se describen a continuacin:

Flujo de bytes (ByteStreams): Nos proporciona un medio adecuado para el manejo
de entradas y salidas de bytes y su uso lgicamente est orientado a la lectura y
escritura de datos binarios (Suarez, 2001).
Flujo de caracteres (CharacterStreams): Proporciona un medio adecuado para el
manejo de entradas y salidas de caracteres (Suarez, 2001).

En Flujos de datos en Java de FIC (2007, p. 36), encontrars la descripcin de los procesos
para la lectura y escritura de datos mediante el manejo de streams.

Para conocer ms a fondo las clases que controlan la entrada y salida de datos de un
programa revisa los siguientes textos
1
:

En la siguiente liga de Oracle (2012), encontrars la descripcin del uso de flujos de
bytes, los cuales son utilizados para cuando la entrada/salida de datos consta de

1
Para profundizar en el tema y cumplir con las tareas de la unidad, ingresa a la seccin de materiales de apoyo
de la unidad. Consulta los textos de la unidad que se agregan en formato PDF


Programacin orientada a objetos III
Unidad 3. Programacin en red

7

datos representados mediante bytes. Ah encontrars su descripcin, as como la
explicacin de su uso, adems se presenta tambin el cdigo mediante el cual se
crea el stream y se lee su contenido. Por lo tanto ingresa a:
http://docs.oracle.com/javase/tutorial/essential/io/bytestreams.html

En la liga de Oracle (2012) encontrars la descripcin del uso de flujos basados en
caracteres, en este material encontrars una explicacin de dichos streams; as
mismo, vers la explicacin de la sintaxis para crearlos y tambin para leerlos. As
pues, ingresa a:
http://docs.oracle.com/javase/tutorial/essential/io/charstreams.html

Para concluir este tema, realiza la Actividad 2. Programa con streams, que se presenta en el
documento: Actividades de la Unidad 3, donde distinguirs el funcionamiento y la estructura
de los streams para realizar programas en red.

Tema 3.3. Sockets

Para crear un puente entre dos equipos que pretenden conectarse se requiere de los
siguientes elementos: los sockets, que son bsicamente cada uno de los extremos (en cada
equipo/computadora) que generan la comunicacin entre dos programas que se estarn
comunicando en red. Por su parte los sockets requieren de conocerla direccin IP del equipo
con el que se entablar la comunicacin, adems del puerto al que se conectar, pues bien
los puertos son las conexiones fsicas que tiene un equipo para conectarse a la red.

Como se mencion en el tema de Modelo cliente-servidor, el cliente es quien comienza la
comunicacin realizando una peticin al servidor, por lo que el cliente ya debe conocer el
nombre de host de la mquina en que se ejecuta el servidor (IP) y el nmero de puerto en el
que escucha el servidor. Para realizar una solicitud de conexin, el cliente intenta reunirse
con el servidor en la mquina del servidor y el puerto. El cliente tambin debe identificarse
ante el servidor. Tal como se muestra en las siguientes imgenes, primero el cliente enva
una peticin al servidor y, en la segunda imagen, se muestra como el servidor le responde al
cliente, en ambos casos la comunicacin se establece en un punto particular, el puerto.




Figura. Comunicacin cliente-servidor



Programacin orientada a objetos III
Unidad 3. Programacin en red

8

De tal manera que un socket se comunica al equipo al que se quiere conectar mediante un
puerto.

El ciclo de vida de un canal de comunicacin (socket), est determinado por tres fases, Daz
(2011) las enlista de la siguiente manera:
Creacin y apertura del socket.
Lectura y/o escritura, recepcin y/o envo de datos por el socket.
Destruccin, cierre del socket.

Ahora, revisa Programacin con Sockets en FIC (2007, p. 13-15), donde encontrars la
descripcin del proceso de conexin entre un cliente y un servidor mediante sockets.
Revisando este material logrars comprender el proceso de la conexin.

Para identificar las clases necesarias para la programacin en red revisa Martnez (2000, p.
10), ah encontrars el nombre y descripcin de las principales clases requeridas para la
creacin de programas que funcionen en red y logren intercambiar informacin entre
diferentes equipos.

En la siguiente imagen puedes ver el esquema de conexin mediante sockets y el flujo de
streams para que se realicen un programa en red que intercambie informacin entre
equipos.


Figura. Conexin mediante sockets. Recuperada de (Daz, 2011, p. 7)

Para complementar la informacin revisa The Java Tutorials, la leccin All About Sockets,
en Oracle (2012), donde encontrars el tema de sockets completo, desde las explicaciones
tericas respecto al tema, as como ejemplos bsicos para la creacin de programas en red,
resulta muy conveniente que revises el material completo, pues Oracle es dueo del
lenguaje Java, por lo que sus manuales contienen las referencias ms precisas. Por lo tanto,
Ingresa a la liga:
http://docs.oracle.com/javase/tutorial/networking/sockets/index.html


Programacin orientada a objetos III
Unidad 3. Programacin en red

9


A continuacin se te presentan los bloques de cdigo que muestran la creacin de un
programa en red, vers dos clases: una que se encargar de la aplicacin que maneja el
servidor, la otra clase es la encargada del cliente. Analiza detalladamente los cdigos para
que comprendas su aplicacin, todo el cdigo se encuentra comentado para que sea ms
fcil de digerirlo, se sugiere tambin que ejecutes el cdigo presentado para que analices
los resultados. Pon mucha atencin en los comentarios para que identifiques fcilmente el
funcionamiento de la sintaxis presentada.

Ejemplo de cdigo 1. Clase que controla el servidor
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JOptionPane;

/**
* Esta clase representa el programa servidor.
*/
public class Aplicacion_Servidor extends javax.swing.JFrame {

/**
* Creates new form Aplicacion_Servidor
*/
public Aplicacion_Servidor() {
initComponents();
}

SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
/* En esta seccin se tienen los elementos que compondrn la apariencia grfica
de la aplicacin, declaraciones y acomodos en la pantalla */
txtPuertoSocket = new javax.swing.JTextField();
lblPuertoSocket = new javax.swing.JLabel();
btnAbrirPuerto = new javax.swing.JButton();
btnCerrarPuerto = new javax.swing.JButton();
jPanel1 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
txtaDatosEntrantes = new javax.swing.JTextArea();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Comunicacion con Sockets - Servidor");

txtPuertoSocket.setText("12345");

lblPuertoSocket.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
lblPuertoSocket.setText("Puerto:");

btnAbrirPuerto.setText("Abrir");
btnAbrirPuerto.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnAbrirPuertoActionPerformed(evt);
}
});

btnCerrarPuerto.setText("Cerrar");
btnCerrarPuerto.setEnabled(false);
btnCerrarPuerto.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnCerrarPuertoActionPerformed(evt);
}
});



Programacin orientada a objetos III
Unidad 3. Programacin en red

10

jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Datos
Recibidos"));
jPanel1.setEnabled(false);
jPanel1.setLayout(new java.awt.BorderLayout());

txtaDatosEntrantes.setColumns(20);
txtaDatosEntrantes.setEditable(false);
txtaDatosEntrantes.setRows(5);
txtaDatosEntrantes.setEnabled(false);
jScrollPane1.setViewportView(txtaDatosEntrantes);

jPanel1.add(jScrollPane1, java.awt.BorderLayout.CENTER);

javax.swing.GroupLayout layout = new
javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(lblPuertoSocket,
javax.swing.GroupLayout.PREFERRED_SIZE, 74,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(txtPuertoSocket,
javax.swing.GroupLayout.PREFERRED_SIZE, 111,
javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnAbrirPuerto)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnCerrarPuerto)
.addGap(0, 40, Short.MAX_VALUE))
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap())
);

layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new
java.awt.Component[] {btnAbrirPuerto, btnCerrarPuerto});

layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(txtPuertoSocket,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(lblPuertoSocket)
.addComponent(btnAbrirPuerto)
.addComponent(btnCerrarPuerto))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 162,
Short.MAX_VALUE)
.addContainerGap())
);

java.awt.Dimension screenSize =
java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-403)/2, (screenSize.height-253)/2, 403, 253);
}// </editor-fold>
/* Aqu se termina la creacin de la apariencia grfica */

/* El boton de Abrir Puerto ser el que mande a llamar al mtodo abrirSocket */


Programacin orientada a objetos III
Unidad 3. Programacin en red

11

private void btnAbrirPuertoActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
abrirSocket();
}

/* El boto Cerrar Puerto manda a llamar al mtodo cerrarSocket */
private void btnCerrarPuertoActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
cerrarSocket();
}

/**
* El mtodo principal invoca a que se ejecute la aplicacin del servidor */
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {
new Aplicacion_Servidor().setVisible(true);
}
});
}

/* A continuacin se presenta el mtodo de abrirSocket */
public void abrirSocket()
{
String msg = null;
int puerto = 0;
try
{
//Establecemos el puerto a travs del cual se abrir el socket.
puerto = Integer.valueOf(txtPuertoSocket.getText().trim());
//Se asigna ese Puerto al socket creado
serverSocket = new ServerSocket(puerto);

//Habilitamos y deshabilitamos controles de la interfaz de usuario
//para evitar un funcionamiento indeseado.
habilitarControlesAperturaDeSocket(false);

//Notificamos al usuario que se ha creado un socket.
msg ="Socket creado exitosamente en el puerto " + puerto + "." +
"\n\nEl programa quedar bloqueado hasta que se establezca " +
"alguna conexin con un cliente.";
JOptionPane.showMessageDialog(this, msg, "Socket creado.",
JOptionPane.INFORMATION_MESSAGE);

//Esperamos a que un cliente se conecte.
cliente = serverSocket.accept();

//Obtenemos los objetos para poder leer y escribir a travs
//del socket
entrada = cliente.getInputStream();
salida = cliente.getOutputStream();
lector = new DataInputStream(entrada);
escritor = new DataOutputStream(salida);
leerDatosDelCliente();
}
//Si el usuario captura un nmero de puerto incorrecto se captura el error
y se le notifica al usuario.
catch (NumberFormatException nfe)
{
msg = "El numero de puerto debe ser un numero entero mayor a 0 " +
"y menor a 65535.";
JOptionPane.showMessageDialog(this, msg,
"Numero de puerto incorrecto",
JOptionPane.ERROR_MESSAGE);
nfe.printStackTrace();
}
//Si el usuario intenta acceder a un numero de puerto no disponible se
captura el error y se le notifica al usuario.
catch (Exception e)
{


Programacin orientada a objetos III
Unidad 3. Programacin en red

12

msg = "Error al intentar abrir socket en el puerto " + puerto +
"\n\nProbablemente el puerto est en uso o el firewall " +
"de su equipo impidio su apertura.";
JOptionPane.showMessageDialog(this, msg, "Error",
JOptionPane.ERROR_MESSAGE);
}
} //Termina el mtodo se abrirSocket


// Inicia el mtodo de cerrarSocket
public void cerrarSocket()
{
String msg = null;
try
{
leyendo = false;
// Se est en espera de recibir comunicacin por parte del cliente.
if (cliente != null)
{
//Con esto se cierra la conexin con el cliente.
cliente.close();
//Con esto se cierra el socket servidor, ya no atendemos ms
conexiones.
serverSocket.close();

cliente = null;
serverSocket = null;

habilitarControlesAperturaDeSocket(true);
}

}
/* En el caso de que no se pueda cerrar el socket se captura la excepcin y
se cierra el sistema */
catch (Exception e)
{
msg = "Error al intentar cerrar el socket.\n\n" +
"El sistema se cerrara despus de este cuadro de dialogo.";
JOptionPane.showMessageDialog(this, msg, "Error",
JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
}
}

/* El siguiente es el mtodo para en caso de abrir el socket se habiliten los
componentes grficos o se deshabiliten segn sea el estado del socket */
public void habilitarControlesAperturaDeSocket(boolean value)
{
//Habilitamos los controles para la apertura del socket
lblPuertoSocket.setEnabled(value);
txtPuertoSocket.setEnabled(value);
btnAbrirPuerto.setEnabled(value);
//Deshabilitamos los controles de recepcion de datos y cierre
btnCerrarPuerto.setEnabled(!value);
txtaDatosEntrantes.setEnabled(!value);
jPanel1.setEnabled(!value);
}

/* El siguiente mtodo es para leer los datos que el cliente enva hacia el
servidor */
public void leerDatosDelCliente()
{
Thread t = null;

/*Creamos un objeto para leer datos del cliente indefinidamente
a travs de un hilo. La interface Runnable solamente declara una funcin
miembro denominada run, que han de definir las clases que implementen este interface
*/
Runnable r = new Runnable()
{
/* Se declara entonces la funcin run, que implementa la interface
Runnable*/


Programacin orientada a objetos III
Unidad 3. Programacin en red

13

Override
public void run()
{
if (leyendo)
return;
leyendo = true;
while (leyendo)
{
/*Mientras se est leyendo se toman los datos que se estn
introduciendo, en la caja de texto txtaDatosEntrantes*/
try
{
txtaDatosEntrantes.setText(txtaDatosEntrantes.getText() +
"\n" +
lector.readUTF());
if (txtaDatosEntrantes.getText().length() > 0)
txtaDatosEntrantes.setCaretPosition(
txtaDatosEntrantes.getText().length() - 1);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
};

t = new Thread(r);

//Se inicializa el hilo de lectura
t.start();
}

// Variables declaration - do not modify
private javax.swing.JButton btnAbrirPuerto;
private javax.swing.JButton btnCerrarPuerto;
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JLabel lblPuertoSocket;
private javax.swing.JTextField txtPuertoSocket;
private javax.swing.JTextArea txtaDatosEntrantes;
// End of variables declaration

//Socket Servidor que aceptara conexiones de clientes
ServerSocket serverSocket;
//Objeto que se comunicar con los clientes para enviar y recibir datos.
Socket cliente;
//Objetos que permitiran leer y escribir flujos de bits travs del socket.
InputStream entrada;
OutputStream salida;
//Objetos que permitiran leer valores de algun tipo desde el socket.
DataInputStream lector;
DataOutputStream escritor;

//Esta variable sirve para mantener o cerrar el ciclo de lectura de datos
//desde el cliente
boolean leyendo;
}






Ejemplo de cdigo 2. Clase que controla el cliente

import java.io.DataInputStream;
import java.io.DataOutputStream;


Programacin orientada a objetos III
Unidad 3. Programacin en red

14

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JOptionPane;

/**
* Esta clase representa el programa cliente.
*/
public class Aplicacion_Cliente extends javax.swing.JFrame {

/**
* Creates new form Aplicacion_Servidor
*/
public Aplicacion_Cliente() {
initComponents();
}

SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
/* En esta seccin se tienen los elementos que compondrn la apariencia grafica
de la aplicacin, declaraciones y acomodos en la pantalla */
txtPuertoSocket = new javax.swing.JTextField();
lblPuertoSocket = new javax.swing.JLabel();
btnAbrirPuerto = new javax.swing.JButton();
btnCerrarPuerto = new javax.swing.JButton();
lblIp = new javax.swing.JLabel();
txtIp = new javax.swing.JTextField();
txtDatos = new javax.swing.JTextField();
btnEnviarDatos = new javax.swing.JButton();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Comunicacion con Sockets - Cliente");

txtPuertoSocket.setText("12345");

lblPuertoSocket.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
lblPuertoSocket.setText("Puerto:");

btnAbrirPuerto.setText("Abrir");
btnAbrirPuerto.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnAbrirPuertoActionPerformed(evt);
}
});

btnCerrarPuerto.setText("Cerrar");
btnCerrarPuerto.setEnabled(false);

lblIp.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
lblIp.setText("Ip:");

txtIp.setText("127.0.0.1");

txtDatos.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(java.awt.event.KeyEvent evt) {
txtDatosKeyReleased(evt);
}
});

btnEnviarDatos.setText("Enviar");
btnEnviarDatos.addActionListener(new java.awt.event.ActionListener() {


Programacin orientada a objetos III
Unidad 3. Programacin en red

15

public void actionPerformed(java.awt.event.ActionEvent evt) {
btnEnviarDatosActionPerformed(evt);
}
});

javax.swing.GroupLayout layout = new
javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(lblPuertoSocket,
javax.swing.GroupLayout.DEFAULT_SIZE,
74, Short.MAX_VALUE)
.addComponent(lblIp,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING,
false)
.addGroup(layout.createSequentialGroup()
.addComponent(txtPuertoSocket,
javax.swing.GroupLayout.PREFERRED_SIZE,
111,
javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnAbrirPuerto)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnCerrarPuerto))
.addComponent(txtIp)))


Programacin orientada a objetos III
Unidad 3. Programacin en red

16

.addGroup(layout.createSequentialGroup()
.addComponent(txtDatos,
javax.swing.GroupLayout.PREFERRED_SIZE, 258,
javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnEnviarDatos)))
.addContainerGap(49, Short.MAX_VALUE))
);

layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new
java.awt.Component[] {btnAbrirPuerto, btnCerrarPuerto});

layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE)

.addGroup(layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(lblIp)
.addComponent(txtIp, javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addGroup(layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(txtPuertoSocket,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(lblPuertoSocket)
.addComponent(btnAbrirPuerto)
.addComponent(btnCerrarPuerto))

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(txtDatos, javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(btnEnviarDatos))


Programacin orientada a objetos III
Unidad 3. Programacin en red

17

.addGap(179, 179, 179))
);

java.awt.Dimension screenSize =
java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-402)/2, (screenSize.height-145)/2, 402, 145);
}// </editor-fold>
/* Aqu se termina la creacin de la apariencia grfica */
/* El boton de Abrir Puerto ser el que mande a llamar al mtodo
abrirConexionConElServidor */
private void btnAbrirPuertoActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
abrirConexionConElServidor();
}

/* El botn de Enviar Datos ser el que mande a llamar al mtodo enviarDatos */
private void btnEnviarDatosActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
enviarDatos();
}

/* Se tiene un manejo de evento sobre txtDatos para estar escuchando cada una de las
teclas que se oprimen */
private void txtDatosKeyReleased(java.awt.event.KeyEvent evt) {
// TODO add your handling code here:
if (evt.getKeyCode() == evt.VK_ENTER)
enviarDatos();
}

/**
* El mtodo principal invoca a que se ejecute la aplicacin del cliente */
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {

Override
public void run() {
new Aplicacion_Cliente().setVisible(true);
}
});
}

/* A continuacin se presenta el mtodo de abrirConexionConElServidor para estar
enviando los datos desde el cliente*/
public void abrirConexionConElServidor()
{
String msg = null;
String ip = null;
int puerto = 0;
try
{
//Establecemos la ip del servidor
ip = txtIp.getText().trim();
//Establecemos el puerto a travs del cual se abrir el socket.
puerto = Integer.valueOf(txtPuertoSocket.getText().trim());

//Establecemos la conexin con el servidor
cliente = new Socket(ip, puerto);


Programacin orientada a objetos III
Unidad 3. Programacin en red

18


//Habilitamos y deshabilitamos controles de la interfaz de usuario
//para evitar un funcionamiento indeseado.
habilitarControlesAperturaDeSocket(false);

//Notificamos al usuario que se ha creado un socket.
msg ="Conexin realizada con el servidor exitosamente.";
JOptionPane.showMessageDialog(this, msg, "Socket creado.",
JOptionPane.INFORMATION_MESSAGE);
//Obtenemos los objetos para poder leer y escribir a travs
//del socket
entrada = cliente.getInputStream();
salida = cliente.getOutputStream();
lector = new DataInputStream(entrada);
escritor = new DataOutputStream(salida);
}
catch (NumberFormatException nfe)
{
//Notificamos al usuario que se ha creado un socket
msg = "El numero de puerto debe ser un numero entero mayor a 0 " +
"y menor a 65535.";
JOptionPane.showMessageDialog(this, msg,
"Numero de puerto incorrecto",
JOptionPane.ERROR_MESSAGE);
nfe.printStackTrace();
}
catch (Exception e)
{
//Si el usuario intenta acceder a un numero de puerto no disponible se captura el
error y se le notifica al usuario.
msg = "Error al intentar abrir socket.\n" +
"Ip: " + txtIp.getText() + "\n"+
"Puerto: " + puerto +
"\n\nProbablemente el puerto est en uso o el firewall " +
"de su equipo o del servidor impidio su apertura.";
JOptionPane.showMessageDialog(this, msg, "Error",
JOptionPane.ERROR_MESSAGE);
}
}

// Se tiene el mtodo para cerrar el socket previamente abierto.
public void cerrarSocket()
{
String msg = null;
try
{
leyendo = false;
if (cliente != null)
{
//Con esto se cierra la conexin con el servidor
cliente.close();
cliente = null;
habilitarControlesAperturaDeSocket(true);
}
}
catch (Exception e)
{
//Si el usuario intenta cerrar un socket no disponible se captura el error
y se le notifica al usuario.


Programacin orientada a objetos III
Unidad 3. Programacin en red

19


msg = "Error al intentar cerrar el socket.\n\n" +
"El sistema se cerrara despus de este cuadro de dialogo.";
JOptionPane.showMessageDialog(this, msg, "Error",
JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
}
}

/* El siguiente es el mtodo para en caso de entablar comunicacin se habiliten los
componentes grficos o se deshabiliten segn sea el estado de la conexin */
public void habilitarControlesAperturaDeSocket(boolean value)
{
//Habilitamos los controles para la apertura del socket
lblIp.setEnabled(value);
txtIp.setEnabled(value);
lblPuertoSocket.setEnabled(value);
txtPuertoSocket.setEnabled(value);
btnAbrirPuerto.setEnabled(value);
//Deshabilitamos los controles de recepcion de datos y cierre
btnCerrarPuerto.setEnabled(!value);
txtDatos.setEnabled(!value);
btnEnviarDatos.setEnabled(!value);
}

/*A continuacin se presenta el mtodo que enva datos, el cual primero los obtiene
de txtDatos y despus los enva mediante un DataOutputStream */
public void enviarDatos()
{
try
{
escritor.writeUTF(txtDatos.getText());
}
catch (Exception e)
{
e.printStackTrace();
}

}

// Variables declaration - do not modify
private javax.swing.JButton btnAbrirPuerto;
private javax.swing.JButton btnCerrarPuerto;
private javax.swing.JButton btnEnviarDatos;
private javax.swing.JLabel lblIp;
private javax.swing.JLabel lblPuertoSocket;
private javax.swing.JTextField txtDatos;
private javax.swing.JTextField txtIp;
private javax.swing.JTextField txtPuertoSocket;
// End of variables declaration

//Objeto que se comunicar con el servidor para enviarle datos.
Socket cliente;
//Objetos que permitirn leer y escribir flujos de bits travs del socket.
InputStream entrada;
OutputStream salida;
//Objetos que permitirn leer valores de algn tipo desde el socket.
DataInputStream lector;
DataOutputStream escritor;

//Esta variable sirve para mantener o cerrar el ciclo de lectura de datos


Programacin orientada a objetos III
Unidad 3. Programacin en red

20

//desde el cliente
boolean leyendo;
}



Ya que concluiste con el anlisis de las clases que controlan servidor y las clases que
controlan clientes, realiza tu Autoevaluacin.

Autoevaluacin

Para reforzar los conocimientos relacionados con los temas que se abordaron en esta
tercera y ltima unidad del curso, es necesario que resuelvas la Autoevaluacin de la
unidad.
Es importante resaltar que es una actividad no ponderable, por lo tanto, resolverla te servir
para autodiagnosticar tu avance en el tema. Ingresa al archivo de Actividades de la Unidad
3 y atiende a las indicaciones que se te presentan.

Para concluir este tema, realiza la Evidencia de aprendizaje. Programa con sockets, que se
presenta en el documento: Actividades de la Unidad 3, donde debers crear un programa
que comunique dos computadoras y permita comunicacin entre los usuarios de estas
(chat).

Autorreflexiones

Adems de enviar tu trabajo de la Evidencia de aprendizaje, es importante que ingreses al
foro Preguntas de Autorreflexin y consultes las preguntas que tu Facilitador(a) presente, a
partir de ellas, debes elaborar tu Autorreflexin en un archivo de texto llamado
DPO3_U3_ATR_XXYZ. Posteriormente enva tu archivo mediante la herramienta
Autorreflexiones.

Cierre de la unidad

Has concluido la tercera unidad de la asignatura. A lo largo de esta unidad revisaste los
principios del modelo de comunicaciones Cliente Servidor, de esta misma manera
abordaste el tema de Streams, que como sabes se requieren para el intercambio de
informacin y, en esta unidad, pudiste utilizarlos para que ese intercambio de informacin se
realice entre diferentes computadoras. Por ltimo, revisaste la manipulacin de sockets para
realizar una conexin entre diferentes equipos que permita el intercambio de datos mediante
estos.

Al concluir esta unidad, concluyes tambin la materia Programacin Orientada a Objetos III,
en ella te adentraste en conceptos avanzados de la programacin, iniciaste en la unidad
uno con el manejo de archivos que te permitan almacenar informacin o extraerla, en la
unidad dos abordaste la programacin paralela mediante threads y, por ltimo, en esta
unidad generaste programas en red que intercambien informacin entre diferentes


Programacin orientada a objetos III
Unidad 3. Programacin en red

21

computadoras. Con la aplicacin de estos temas ampliars la gama de desarrollos de
software en los que podrs participar.

Es aconsejable que revises nuevamente la unidad en caso de que los temas que se acaban
de mencionar no te sean familiares o no los recuerdes, de no ser este tu caso, Felicidades!
concluiste con la asignatura Programacin Orientada a Objetos III.

Para saber ms

Para que puedas ejecutar los programas que se te presentan, as como las actividades es
importante que instales un IDE en tu computadora, se recomienda NetBeans, puedes
descargarlo de forma gratuita de la siguiente liga: http://netbeans.org/downloads/

Es recomendable que pruebes los cdigos que se presentan en los ejemplos que se
encuentran en cada fuente de consulta mencionada.

Fuentes de consulta

Abin, M. (2004) Java y las redes. [Documento en formato PDF]
Daz, F. (2011) SOCKETS EN JAVA. [Documento en formato PDF]
FIC (2007). Laboratorio de Redes de Comunicaciones. Espaa: Universidad de la
Corua. Tomado de: http://quegrande.org/apuntes/EI/3/RC/practicas/08-
09/seminario_java.pdf
Hervs, C. (2004). Modelo de cliente-servidor en Java. Espaa: Universidad de Cordoba.
Tomado de http://www.uco.es/~i22mugua/_private/aso_pdf/cliserjava.pdf
Martinez, P. (2000). Sockets en Java. Espaa: Universidad de Alicante. Tomado de:
http://www.dlsi.ua.es/asignaturas/sid/JSockets.pdf
Niemeyer, P (2000). Learning Java. E. U.: OReilly.
Oracle (2012). The JAVA Tutorials. Estados Unidos de Amrica: Oracle
Suarez, L. (2001) El paquete java.io. Javahispano. Disponible en:
http://www.javahispano.com
Universidad tecnolgica nacional (2001). Conceptos bsicos sobre Redes. Argentina:
Instituto Tecnolgico de Buenos Aires. Recopilado en:
http://www.dednet.net/institucion/itba/cursos/000183/demo/biblioteca/121redesUTN.pdf

Você também pode gostar