Académique Documents
Professionnel Documents
Culture Documents
ESCUELA DE INFOMATICA
MANUAL DE PROGRAMACION II
ALUMNA:
TATIANA MEDINA
DOCENTE:
QUIMESTRE:
AÑO LECTIVO
2010-2011
Unidad 1. IDENTIFICACIÓN DEL LENGUAJE DE PROGRAMACIÓN
La plataforma NetBeans permite que las aplicaciones sean desarrolladas a partir de un conjunto
de componentes de software llamados módulos. Un módulo es un archivo Java que contiene
clases de java escritas para interactuar con las APIs de NetBeans y un archivo especial (manifest
file) que lo identifica como módulo. Las aplicaciones construidas a partir de módulos pueden ser
extendidas agregándole nuevos módulos. Debido a que los módulos pueden ser desarrollados
independientemente, las aplicaciones basadas en la plataforma NetBeans pueden ser extendidas
fácilmente por otros desarrolladores de software.
CREANDO UN PROYECTO:
Para seguir conociendo a fondo nuestro IDE empezaremos creando un proyecto el cual nos ayudara
para ver las demás herramientas las cuales podremos utilizar más adelante en proyectos más
complejos. Para crear un proyecto primero tenemos que darle:
Por el momento nuestro proyecto no hace nada pero si queremos empezar a trabajar podemos
hacer el famoso hola mundo luego de poner este código.
System.out.println(´hola mundoµ);
Para correr nuestro proyecto, tenemos que dar un clic en nuestro icono color verde que está en
nuestra barra de accesos directos, con esto podemos corremos nuestro proyecto. Y nos quedaría así
fíjense bien en nuestro output en esa parte tendremos el resultado de nuestro pequeño ejemplo.
Cuando esté escribiendo código Java, debería saber que Java reserva ciertas palabras clave como
parte del lenguaje. No hay muchas, de cualquier modo.
yV abstract: Especifica la clase o método que se va a implementar más tarde en una subclase.
yV boolean: Tipo de dato que sólo puede tomar los valores verdadero o falso.
yV Vreak: Sentencia de control para salirse de los Vucles.
yV V te: Tipo de dato que soporta valores en 8 Vits.
yV V alue: Reserada para uso futuro.
yV case: Se utiliza en las sentencias switch para indicar bloques de texto.
yV cast: Reservada para uso futuro.
yV catch: Captura las excepciones generadas por las sentencias tr .
yV char: Tipo de dato que puede soportar caracteres Unicode sin signo en 16 bits.
yV class: Declara una clase nueva.
yV const: Reservada para uso futuro.
yV continue: Devuelve el control a la salida de un bucle.
yV ° fault: In°ica l bloqu ° có°igo por ° f cto n una s nt ncia switch.
yV ° Inicia un bucle °hile.
yV °uVl Tip ° °at qu sprta núm rs n cma fltant , 64 Vits.
yV ls Indica la opción alt rnativa n una s nt ncia if.
yV t n° In°ica qu una cla ° riva°a ° otra o ° una int rfaz.
yV final Indica que una variable soporta un valor constante o que un método no se
sobrescribirá.
yV finall Indica un bloque de código en una estructura tr - catch que siempre se ejecutará.
yV flat Tip de dat que sprta un númer en cma fltante en 32 bits.
yV fr Utilizad para iniciar un bucle fr.
yV futur R s rvada para uso futuro.
yV Ò n ric R s rvada para uso futuro.
yV Òt Reservada para us futur.
yV =f Evalúa s= una expres= n es verdadera o falsa y la d=r=ge adecuadamente.
yV =pl nt Ep c=f=ca qu una cla =pl nta una =nt rfaz.
yV =prt Referenc=a a tras clases.
yV =nn r R s rvada para uso futuro.
yV =ntanc f Ind=ca = un bj t una =ntanc=a d una cla p cíf=ca =mpl m nta una
=nt rfaz p cíf=ca.
yV =nt T=po de dato que puede soportar un entero con s=gno de 32 b=ts.
yV =nt rfac D clara una =nt rfaz.
yV lnÒ Tip de dat que sprta un enter de 64 bits.
yV nat= Esp c=f=ca qu un método stá =mpl m ntado con c d=go nat=o ( sp cíf=co d la
plataforma).
yV n Cr a obj tos nu vos.
yV null Indica que una referencia no se refiere a nada.
yV p ratr R s rvad para us futur. .
yV ut r R s rvad para us futur.
yV packaÒ D clara un paqu t Java.
yV pr=at Esp c=f=cador d acc so qu =nd=ca qu un método o ar=abl s lo pu d s r
acc s=bl d sd la clas n la qu stá d clarado.
yV prt ct ° Esp cifica°r ° acc s qu in°ica qu un mét° variabl s l pu ° s r
acc sibl ° s° la clas n la qu stá ° clara° ( una subclas ° la clas n la qu stá
° clara°a u tras clas s ° l mism paqu t ).
yV puVl=c Espec=f=cador de acceso ut=l=zado para clases, =nterfaces, métodos y var=aVles que
=nd=can que un tema es acces=Vle desde la apl=cac= n (o desde donde la clase def=na que es
acces=Vle).
yV r t R rvada para uo futuro.
yV r turn Envía control posibl m nt d vu lv un valor d sd l método qu fu invocado.
yV hrt Tip de dat que puede prtar un enter de 16 bit.
yV tat=c Ind=ca que una var=able o método e un método de una clae (má que etar l=m=tado
a un objeto part=cular).
yV up r S r fi r a una cla ba d la cla (utilizado n un método o contructor d cla ).
yV =tch Sentenc=a que ejecuta c d=go baándoe en un valor.
yV synchronized: Especifica secciones o métodos críticos de c digo multihilo.
yV this: Se refiere al objeto actual en un método o constructor
yV throw: Crea una excepci n.
yV throws: Indica qué excepciones puede proporcionar un método,
yV transient: Especifica que una variable no es parte del estado persistente de un objeto.
yV tr Inicia un bloque de c digo que es comprobado para las excepciones.
yV var: Reservado para uso futuro.
yV void: Especifica que un método no devuelve ningún valor.
yV volatile: Indica que una variable puede cambiar de forma asíncrona.
yV while: Inicia un bucle while.
Herencia:
Parece una pena, sin embargo, acometer todo el problema para crear una clase y
posteriormente BASE
verse forzado a crear una nueva que podría tener una funcionalidad similar. Sería
mejor si pudiéramos hacer uso de una clase ya existente, clonarla, y después hacer al
"clon" las adiciones y modificaciones que sean necesarias. Efectivamente, esto se logra
mediante la herencia, con la excepci n de que si se cambia la clase original DERIVADA
(denominada la clase base, clase super o clase padre), el "clon" modificado
(denominado clase derivada, clase heredada, subclase o clase hijo) también reflejaría esos cambios.
1.2.VAPLICACIONES GUI
Dentro de Java hay una serie de paquetes destinados a la creaci n de aplicaciones con un Interface
Gráfico de Usuario, es decir, son aplicaciones compuestas de ventanas, menús que se pueden
desplegar, iconos para las distintas funciones, sonidos, etc.
Ahora nos encontramos dentro del entorno del paquete java. Swing, un ambiente muy amigable,
que no tiene nada que envidiar a otros leguajes visuales. La figura muestra las partes del entorno.
1.3.VFLUJOS
Los flujos surgen por la necesidad de las aplicaciones Java de interaccionar con el exterior de dos
posibles formas:
Lectura
Las clases Reader e InputStream son similares aunque se refieren a distintos tipos de datos, lo mismo
ocurre con Writer y OutputSream.
Escritura
La clase Writer proporciona tres métodos para escribir un carácter char o un array de caracteres
int write(int c)
int write(char buf[])
int write(char buf[], int offset, int len)
int write(int c)
int write(byte buf[])
int write(byte buf[], int offset, int len)
1.4.VPROGRAMACION
Tipos de Variables
Todas las variables en el lenguaje Java deben tener un tipo de dato. El tipo de la variable determina
los valores que la variable puede contener y las operaciones que se pueden realizar con ella.
Existen dos categorías de datos principales en el lenguaje Java: los tipos primitivos y los tipos
referenciados.
Los tipos primitivos contienen un s lo valor e incluyen los tipos como los enteros, coma flotante, los
caracteres, etc... La tabla siguiente muestra todos los tipos primitivos soportados por el lenguaje Java,
su formato, su tamaño y una breve descripci n de cada uno.
Los tipos referenciados se llaman así porque el valor de una variable de referencia es una referencia
(un puntero) hacia el valor real. En Java tenemos los arrays, las clases y los interfaces como tipos de
datos referenciados.
Nombres de Variables
Un programa se refiere al valor de una variable por su nombre. Por convenci n, en Java, los
nombres de las variables empiezan con una letra minúscula (los nombres de las clases empiezan con
una letra mayúscula).
Un nombre de variable Java.
1.V debe ser un identificador legal de Java comprendido en una serie de caracteres Unicode. Unicode
es un sistema de codificaci n que soporta texto escrito en distintos lenguajes humanos. Unicode
permiten la codificaci n de 34.168 caracteres. Esto le permite utilizar en sus programas Java
varios alfabetos como el japonés, el griego, el ruso o el hebreo. Esto es importante para que los
programadores pueden escribir c digo en su lenguaje nativo.
2.V no puede ser el mismo que una palabra clave o el nombre de un valor booleano (true or false)
3.V no deben tener el mismo nombre que otras variables cuyas declaraciones aparezcan en el mismo
ámbito.
La regla número 3 implica que podría existir el mismo nombre en otra variable que aparezca en un
ámbito diferente.
Por convenci n, los nombres de variables empiezan por una letra minúscula. Si una variable está
compuesta de más de una palabra, como 'nombreDato' las palabras se ponen juntas y cada palabra
después de la primera empieza con una letra mayúscula.
Operadores Aritméticos
El lenguaje Java soporta varios operadores aritméticos - incluyendo + (suma), - (resta), *
(multiplicaci n), / (divisi n), y % (m dulo)-- en todos los números enteros y de coma flotante. Por
ejemplo, puedes utilizar este c digo Java para sumar dos números:
Suma Esto + a Esto
O este c digo para calcular el resto de una divisi n:
Divide Esto % por Esto
Esta tabla sumariza todas las operaciones aritméticas binarias en Java.
Operador Uso Descripci n
+ op1 + op2 Suma op1 y op2
- op1 - op2 Resta op2 de op1
* op1 * op2 Multiplica op1 y op2
/ op1 / op2 Divide op1 por op2
% op1 % op2 Obtiene el resto de dividir op1 por op2
Nota: El lenguaje Java extiende la definici n del operador + para incluir la concatenaci n de
cadenas.
Los operadores + y - tienen versiones unarias que seleccionan el signo del operando.
Operador Uso Descripci n
Indica un
+ + op valor
positivo
Niega el
- - op
operando
Además, existen dos operadores de atajos aritméticos, ++ que incrementa en uno su operando, y --
que decrementa en uno el valor de su operando.
Operador Uso Descripci n
++ op ++ Incrementa op en 1; evalúa el valor antes de incrementar
++ ++ op Incrementa op en 1; evalúa el valor después de incrementar
-- op -- Decrementa op en 1; evalúa el valor antes de decrementar
-- -- op Decrementa op en 1; evalúa el valor después de decrementa
UNIDAD 2: INTRODUCCION DE REDES.
En su nivel más elemental, una red de equipos consiste en dos equipos conectados entre sí con un
cable que les permite compartir datos. Todas las redes de equipos, independientemente de su nivel
de sofisticaci n, surgen de este sistema tan simple. Aunque puede que la idea de conectar dos
equipos con un cable no parezca extraordinaria, al mirar hacia atrás se comprueba que ha sido un
gran logro a nivel de comunicaciones.
Este sistema funciona bien en ciertas situaciones, y presenta sus ventajas (nos permite tomar un café o
hablar con un amigo mientras intercambiamos y combinamos datos), pero resulta demasiado lento e
ineficiente para cubrir las necesidades y expectativas de los usuarios informáticos de hoy en día. La
cantidad de datos que se necesitan compartir y las distancias que deben cubrir los datos superan con
creces las posibilidades del intercambio de disquetes.
yV Al hacer que la informaci n esté disponible para compartir las redes pueden reducir la
necesidad de comunicaci n por escrito, aumenta la eficiencia y hace que cualquier tipo de
dato esté disponible simultáneamente para cualquier usuario que lo necesite.
Configuraci n de Redes
yV En general todas las redes tienen ciertos componentes, funciones y características comunes,
estos incluyen:
KV Tamaño de la Organizaci n
KV Tipo de negocio
KV Presupuesto de la red
Anillo: Las estaciones están unidas unas con otras formando un círculo
por medio de un cable común. El último nodo de la cadena se conecta al
primero cerrando el anillo. Las señales circulan en un solo sentido
alrededor del círculo, regenerándose en cada nodo. Con esta
metodología, cada nodo examina la informaci n que es enviada a través
del anillo. Si la informaci n no está dirigida al nodo que la examina, la
pasa al siguiente en el anillo. La desventaja del anillo es que si se rompe una conexi n, se cae la red
completa.
Estrella: Los datos en estas redes fluyen del emisor hasta el concentrador, este realiza todas las
funciones de la red, además actúa como amplificador de los datos.
La red se une en un único punto, normalmente con un panel de control centralizado, como un
concentrador de cableado. Los bloques de informaci n son dirigidos a través del panel de control
central hacia sus destinos. Este esquema tiene una ventaja al tener un panel de control que monitorea
el tráfico y evita las colisiones y una conexi n interrumpida no afecta al resto de la red.
2.2. MODELO OSI Y TCP/IP
öV Definir el medio o medios físicos por los que va a viajar la comunicaci n: cable de pares
trenzados (o no, como en RS232/EIA232), coaxial, guías de onda, aire, fibra ptica.
öV Manejar las señales eléctricas del medio de transmisi n, polos en un enchufe, etc.
MODELO TCP/IP
El TCP/IP es la base de Internet, y sirve para comunicar todo tipo de dispositivos, computadoras que
utilizan diferentes sistemas operativos, minicomputadoras y computadoras centrales sobre redes de
área local (LAN) y área extensa (WAN). TCP/IP fue desarrollado y demostrado por primera vez en
1972 por el departamento de defensa de los Estados Unidos, ejecutándolo en ARPANET, una red de
área extensa del departamento de defensa.
EL MODELO TCP/IP esta compuesto por cuatro capas o niveles, cada nivel se encarga de
determinados aspectos de la comunicaci n y a su vez brinda un servicio específico a la capa superior.
Estas capas son:
Algunas de las capas del modelo TCP/IP poseen el mismo nombre que las capas del modelo OSI.
Resulta fundamental no confundir las funciones de las capas de los dos modelos ya que si bien tienen
aspectos en común, estas desempeñan diferentes funciones en cada modelo.
Capa de Aplicaci n
La capa de aplicaci n del modelo TCP/IP maneja protocolos de alto nivel, aspectos de
representaci n, codificaci n y control de diálogo. El modelo TCP/IP combina todos los aspectos
relacionados con las aplicaciones en una sola capa y asegura que estos datos estén correctamente
empaquetados antes de que pasen a la capa siguiente. TCP/IP incluye no s lo las especificaciones de
Internet y de la capa de transporte, tales como IP y TCP, sino también las especificaciones para
aplicaciones comunes. TCP/IP tiene protocolos que soportan la transferencia de archivos, e-mail, y
conexi n remota, además de los siguientes:
Capa de Transporte
La capa de transporte proporciona servicios de transporte desde el host origen hacia el host destino.
En esta capa se forma una conexi n l gica entre los puntos finales de la red, el host transmisor y el
host receptor. Los protocolos de transporte segmentan y reensamblan los datos mandados por las
capas superiores en el mismo flujo de datos, o conexi n l gica entre los extremos. La corriente de
datos de la capa de transporte brinda transporte de extremo a extremo.
Se suele decir que internet es una nube. La capa de transporte envía los paquetes de datos desde la
fuente transmisora hacia el destino receptor a través de la nube. El control de punta a punta, que se
proporciona con las ventanas deslizantes y la confiabilidad de los números de secuencia y acuses de
recibo, es el deber básico de la capa de transporte cuando utiliza TCP. La capa de transporte también
define la conectividad de extremo a extremo entre las aplicaciones de los hosts. Los servicios de
transporte incluyen los siguientes servicios:
Se dice que internet es una nube, por que los paquetes pueden tomar múltiples rutas para llegar a su
destino, generalmente los saltos entre routers se representan con una nube que representa las
distintas posibles rutas. La capa de transporte envía los paquetes de datos desde la fuente transmisora
hacia el destino receptor a través de la nube. La nube maneja los aspectos tales como la
determinaci n de la mejor ruta, balanceo de cargas, etc.
Capa de Internet
Esta capa tiene como prop sito seleccionar la mejor ruta para enviar paquetes por la red. El
protocolo principal que funciona en esta capa es el Protocolo de Internet (IP). La determinaci n de la
mejor ruta y la conmutaci n de los paquetes ocurren en esta capa.
A veces, se considera a IP como protocolo poco confiable. Esto no significa que IP no enviará
correctamente los datos a través de la red. Llamar al IP, protocolo poco confiable simplemente
significa que IP no realiza la verificaci n y la correcci n de los errores. De esta funci n se encarga
TCP, es decir el protocolo de la capa superior ya sea desde las capas de transporte o aplicaci n.
También denominada capa de host de red. Esta es la capa que maneja todos los aspectos que un
paquete IP requiere para efectuar un enlace físico real con los medios de la red. Esta capa incluye los
detalles de la tecnología LAN y WAN y todos los detalles de las capas físicas y de enlace de datos del
modelo OSI.
Los controladores para las aplicaciones de software, las tarjetas de m dem y otros dispositivos
operan en la capa de acceso de red. La capa de acceso de red define los procedimientos para realizar
la interfaz con el hardware de la red y para tener acceso al medio de transmisi n. Los estándares del
protocolo de los m dem tales como el Protocolo Internet de enlace serial (SLIP) y el Protocolo de
punta a punta (PPP) brindan acceso a la red a través de una conexi n por m dem. Debido a un
intrincado juego entre las especificaciones del hardware, el software y los medios de transmisi n,
existen muchos protocolos que operan en esta capa. Esto puede generar confusi n en los usuarios. La
mayoría de los protocolos reconocibles operan en las capas de transporte y de Internet del modelo
TCP/IP.
Esta arquitectura consiste básicamente en un cliente que realiza peticiones a otro programa
(el servidor) que le da respuesta. Aunque esta idea se puede aplicar a programas que se ejecutan
sobre una sola computadora es más ventajosa en un sistema operativo multiusuario distribuido a
través de una red de computadoras.
En esta arquitectura la capacidad de proceso está repartida entre los clientes y los servidores, aunque
son más importantes las ventajas de tipo organizativo debidas a la centralizaci n de la gesti n de la
informaci n y la separaci n de responsabilidades, lo que facilita y clarifica el diseño del sistema.
La separaci n entre cliente y servidor es una separaci n de tipo l gico, donde el servidor no se
ejecuta necesariamente sobre una sola máquina ni es necesariamente un
s lo programa. Los tipos específicos de servidores incluyen los
servidores web, los servidores de archivo, los servidores del correo, etc.
Mientras que sus prop sitos varían de unos servicios a otros, la
arquitectura básica seguirá siendo la misma.
Una disposici n muy común son los sistemas multicapa en los que el
servidor se descompone en diferentes programas que pueden ser
ejecutados por diferentes computadoras aumentando así el grado de
distribuci n del sistema.
La arquitectura clienteservidor sustituye a la arquitectura monolítica en la
que no hay distribuci n, tanto a nivel físico como a nivel l gico.
La red clienteservidor es aquella red de comunicaciones en la que todos los clientes están conectados
a un servidor, en el que se centralizan los diversos recursos y aplicaciones con que se cuenta; y que
los pone a disposici n de los clientes cada vez que estos son solicitados. Esto significa que todas las
gestiones que se realizan se concentran en el servidor, de manera que en él se disponen los
requerimientos provenientes de los clientes que tienen prioridad, los archivos que son de uso público
y los que son de uso restringido, los archivos que son de s lo lectura y los que, por el contrario,
pueden ser modificados, etc. Este tipo de red puede utilizarse conjuntamente en caso de que se este
utilizando en una red mixta.
Características
En la arquitectura C/S el remitente de una solicitud es conocido como cliente. Sus características son:
öV Es quien inicia solicitudes o peticiones, tienen por tanto un papel activo en la comunicaci n
(dispositivo maestro o amo).
öV Espera y recibe las respuestas del servidor.
öV Por lo general, puede conectarse a varios servidores a la vez.
öV Normalmente interactúa directamente con los usuarios finales mediante una interfaz gráfica de
usuario.
öV Al contratar un servicio de redes, se tiene que tener en la velocidad de conexi n que le otorga al
cliente y el tipo de cable que utiliza, por ejemplo: cable de cobre ronda entre 1 ms y 50 ms.
Al receptor de la solicitud enviada por cliente se conoce como servidor. Sus características son:
öV Al iniciarse esperan a que lleguen las solicitudes de los clientes, desempeñan entonces un papel
pasivo en la comunicaci n (dispositivo esclavo).
öV Tras la recepci n de una solicitud, la procesan y luego envían la respuesta al cliente.
öV Por lo general, aceptan conexiones desde un gran número de clientes (en ciertos casos el número
máximo de peticiones puede estar limitado).
öV No es frecuente que interactúen directamente con los usuarios finales.
UNIDAD 3: SOCKETS
3.1. INTRODUCCION.
Las aplicaciones desarrolladas en Sockets están basadas en la arquitectura Cliente Servidor. La
aplicaci n necesita conocer el papel que va a desempeñar (cliente o servidor) ya que la estructura del
sw y primitivas difieren.
ÈV InputStr a / OutputStr a
Ahra n cli nt t n s la cn xi n cn l cli nt (valga la r dundancia). L únic qu t n s
qu hac r s bt n r d él l OuputStr a InputStr a cn ls étds g tOutputStr a()
g tInputStr a(). La clas OutpuStr a ns sirv para nviarl dats al cli nt . La clas InputStr a
ns sirv para l r dats d l cli nt .
Los métodos de estas dos clases para leer o escribir datos son un poco feos, ya que únicamente
envían bytes. Suele ser habitual construir alguna otra clase de entrada/salida de datos que tenga
métodos más adecuados:
yV Si queremos enviar o recibir tipos normales (enteros, flotantes, strings) tenemos las clases
DataInputStream y DataOutputStream. Estas clases tienen un constructor que admite un
InputStream y un OutputStream respectivamente.
yV Si queremos enviar o recibir clases enteras propias nuestras, tenemos las clases
ObjectInputStream y ObjectDataStream. Al igual que las anteriores, usaremos el constructor
que admite un InputStream y un OutputStream
Estas nuevas clases tienen métodos más bonitos de usar (writeInt(), writeChar(), etc)
´ ´
V
Si estamos programando un //cliente//, el socket se abre de la forma:
Socket miCliente;
miCliente = new Socket ( "maquina",numeroPuerto );
En el ejemplo anterior no se usan excepciones; sin embargo, es una gran idea la captura de
excepciones cuando se está trabajando con sockets. El mismo ejemplo quedaría como:
Socket miCliente;
try {
miCliente = new Socket( "maquina",numeroPuerto );
} catch( IOException e ) {
System.out.println( e );
}
Socket miServicio;
try {
miServicio = new ServerSocket( numeroPuerto );
} catch( IOException e ) {
System.out.println( e );
}
try {
salida.close();
entrada.close();
miCliente.close();
} catch( IOException e ) {
System.out.println( e );
}
try {
salida.close();
entrada.close();
socketServicio.close();
miServicio.close();
} catch( IOException e ) {
System.out.println( e );
}
import java.awt.*;
import java.net.*;
import java.io.*;
class minimoServidor {
public static void main( String args[] ) {
ServerSocket s = (ServerSocket)null;
Socket s1;
String cadena = "Tutorial de Java!";
int longCad;
OutputStream s1out;
Las clases de tipos de java (Integer, Float, String, etc) implementan esa interface, así que se pueden
enviar/leer a través de estos métodos.
Si una clase nuestra contiene atributos que sean primitivos de java (int, float, etc) o clases primitivas
(Float, Integer, String, etc), basta con hacer que implemente la interface Serializable para poder
enviarlas. No hace falta que escribamos ningún método, simplemente poner que se implementa.
Si alguno de los atributos no es primitivo de java, basta con que implemente la misma interface
Serializable. Si es así, no tendremos ningún problema.
// Esta clase se puede enviar/leer por un socket
class DatoSocket implements Serializable
{
int c;
String d;
Atributo e; // Esta clase es serializable.
}
Si alguna de las clases no es Serializable, tendremos que implementar los métodos privados
En los dos cuadros de ejemplo de arriba hemos puesto el c digo de ambos métodos para la clase
Atributo, pero realmente no hace falta escribir este c digo. En las fuentes de ejemplo aparece el
c digo, pero está comentado. Si lo descomentas funcionará igual.
Para leerlo es igual de simple, s lo que tenemos que saber qué tipo de clase estamos recibiendo para
hacer el "cast" adecuado.
DatoSocket dato;
Object aux;
aux = socket.readObject();// Se lee el objeto
if (aux instanceof DatoSocket) // Se comprueba si es de tipo DatoSocket
dato = (DatoSocket)aux; // Se hace el cast.
Debemos ir haciendo varios if con las posibles clases que nos envíen desde el otro lado.
Son un servicio de transporte sin conexi n. Son más eficientes que TCP, pero en su utilizaci n no está
garantizada la fiabilidad. Los datos se envían y reciben en paquetes, cuya entrega no está
garantizada. Los paquetes pueden ser duplicados, perdidos o llegar en un orden diferente al que se
envi .
El protocolo de comunicaciones con datagramas es un protocolo sin conexi n, es decir, cada vez
que se envíen datagramas es necesario enviar el descriptor del socket local y la direcci n del socket
que debe recibir el datagrama. Como se puede ver, hay que enviar datos adicionales cada vez que se
realice una comunicaci n, aunque tiene la ventaja de que se pueden indicar direcciones globales y el
mismo mensaje llegará aun muchas máquinas a la vez.
Ahora se presenta un problema, al haber varias opciones, ¿qué protocolo, o tipo de sockets, se debe
emplear - UDP o TCP? La decisi n depende de la aplicaci n cliente/servidor que se esté escribiendo;
aunque hay algunas diferencias entre los protocolos que sirven para ayudar en la
decisi n y decantar la utilizaci n de sockets de un tipo.
En UDP, cada vez que se envía un datagrama, hay que enviar también el descriptor del socket
local y la direcci n del socket que va a recibir el datagrama, luego los mensajes son más grandes que
los TCP. Como el protocolo TCP está orientado a conexi n, hay que establecer esta conexi n entre
los dos sockets antes de nada, lo que implica un cierto tiempo empleado en el establecimiento de la
conexi n, que no es necesario emplear en UDP.
En UDP hay un límite de tamaño de los datagramas, establecido en 64 kilobytes, que se pueden
enviar a una localizaci n determinada, mientras que TCP no tiene límite; una vez que se ha
establecido la conexi n, el par de sockets funciona como los streams: todos los datos se leen
inmediatamente, en el mismo orden en que se van recibiendo. UDP es un protocolo desordenado,
no garantiza que los datagramas que se hayan enviado sean recibidos en el mismo orden por el
socket de recepci n. Al contrario, TCP es un protocolo ordenado, garantiza que todos los paquetes
que se envíen serán recibidos en el socket destino en el mismo orden en que se han enviado.
Los datagramas son bloques de informaci n del tipo lanzar y olvidar. Para la mayoría de los
programas que utilicen la red, el usar un flujo TCP en vez de un datagrama UDP es más sencillo
y hay menos posibilidades de tener problemas. Sin embargo, cuando se requiere un rendimiento
ptimo, y está justificado el tiempo adicional que supone realizar la verificaci n de los datos, la
comunicaci n a través de sockets TCP es un mecanismo realmente útil.
En resumen, TCP parece más indicado para la implementaci n de servicios de red como un control
remoto (rlogin, telnet) y transmisi n de ficheros (ftp); que necesitan transmitir datos de longitud
indefinida. UDP es menos complejo y tiene una menor sobrecarga sobre la conexi n; esto hace que
sea el indicado en la implementaci n de aplicaciones cliente/servidor en sistemas distribuidos
montados sobre redes de área local.
Los sockets proporcionan una comunicaci n de dos vías, punto a punto entre dos procesos. Los
sockets son muy versátiles y son un componente básico de comunicaci n entre interprocesos e
intersistemas. Un socket es un punto final de comunicaci n al cual se puede asociar un nombre.
Por lo que son necesarios tres recursos que originan el concepto de socket
b) Una direcci n del Protocolo de Red (Direcci n IP, si se utiliza el Protocolo TCP/IP), que identifica
una computadora.
Los tipos de socket definen las propiedades de comunicaci n visibles para la aplicaci n. Los procesos
se comunican solamente entre los sockets del mismo tipo. Existen cinco tipos de sockets.
El Cliente actúa de la siguiente forma.
1) Establece una conexi n con el servidor (Crea un socket con el servidor). 2) Mandar mensajes al
servidor o Esperar un mensaje de él. (Consultas) 3) Esperar su respuesta o contestarle (existen casos
en que este paso no es necesario). 4) Repetir los pasos 2 y 3 mientras sea necesario. 5) Cerrar la
conexi n con el servidor.
2) Una vez que se conecta alguien, crea un hilo de ejecuci n para este usuario mientras que el
thread principal vuelve al paso 1. Esto comunmente se hace para que el servidor puede atender a
varios clientes al mismo tiempo.
4) Espera que el cliente se vaya o lo bota el mismo servidor (Cierrra el socket entre ellos) y elimina
el thread de comunicaci n entre ellos.
II.V
Se garantiza que todo octeto llegará a su destino en el mismo orden en que se
ha transmitido.
Los tipos de socket definen las propiedades de comunicaci n visibles para la aplicaci n. Los procesos
se comunican solamente entre los sockets del mismo tipo. Existen tres tipos básicos de sockets.
Socket de flujo : da un flujo de datos de dos vías, confiable, y sin duplicados sin límites de grabaci n.
El flujo opera en forma parecida a una conversaci n telef nica. El tipo del socket es SOCK_STREAM,
el cual en el dominio de Internet usa TCP (Transmission Control Protocol).
Socket de datagrama
Soporta un flujo de mensajes de dos vías. En un socket de datagrama podría recibir mensajes en
diferente orden de la secuencia de la cual los mensajes fueron envíados. Los límites de grabaci n en
los datos son preservados. Los sockets de datagrama operan parecidos a pasar cartas hacia adelante y
hacia atrás en el correo. El tipo de socket es SOCK_DGRAM, el cual en el dominio de internet usa
UDP (User Datagram Protocol).
PROGRAMA CLIENTE
En primer lugar se crea el Socket denominado skSocket, al que se le especifican el nombre de host
(HOST) y el número de puerto (PORT) en este ejemplo constante. Luego se asocia el flujo de datos
de dicho Socket (obtenido mediante getInputStream), que es asociado a un flujo (flujo) Data Input
Streamde? lectura secuencial. De dicho flujo capturamos una cadena ( readUTF()), y la imprimimos
por pantalla (System.out). El Socket se cierra, una vez finalizadas las operaciones, mediante el
método close(). Debe observarse que se realiza una gesti n de excepci n para capturar los posibles
fallos tanto de los flujos de datos como del Socket.
PROGRAMA SERVIDOR
El programa servidor se instala en un puerto determinado, a la espera de conexiones, a las que
tratará mediante un segundo SOCKET. Cada vez que se presenta un cliente, le saluda con una frase
´Hola cliente Nµ. Este servidor s lo atenderá hasta tres clientes, y después finalizará su ejecuci n,
pero es habitual utilizar ciclos infinitos (while(true)) en los servidores, para que atiendan llamadas
continuamente.Tras atender cuatro clientes, el servidor deja de ofrecer su servicio:
UNIDAD 4: CONCURRENCIA
Los procesos pueden ser cooperantes o independientes, en el primer caso se entiende que los
procesos interactúan entre sí y pertenecen a una misma aplicaci n. En el caso de procesos
independientes en general se debe a que no interactúan y un proceso no requiere informaci n de
otros o bien porque son procesos que pertenecen a distintos usuarios.
Una hebra posee también su propio entorno de ejecuci n pero al crear una nuea hebra, se necesitan
menos recursos que para un nuevo proceso. Las hebras tienen un ciclo de vida dentro de un proceso
y comparten los recursos de este proceso incluyendo la memoria asignada, los ficheros abiertos y
todos los recursos.
La implementaci n del modelo de procesos se logra debido a que el sistema operativo almacena en
una tabla denominada tabla de control de procesos informaci n relativa a cada proceso que se está
ejecutando en el procesador. Cada línea de esta tabla representa a un proceso.
La ejecuci n de múltiples hebras es una característica esencial en Java. Todas las aplicaciones tienen al
menos una hebra o varias si tomamos cada llamada al sistema System como una hebra que se va a
ejecutar de forma independiente.
Desde el punto de vista del programador, cada programa java comienza con una hebra
denominada main que posee la habilidad de crear hebras adicionales.
La idea es crear aplicaciones que puedan realizar a la vez diferentes tareas o, al menos, hacer creer a
los usuarios de que se están realizados varias cosas simultáneamente. Por ejemplo, una aplicaci n
multithreaded que gestiona un almacén será capaz de recibir datos por la red, realizar cálculos y a la
vez, aceptar la entrada del usuario. Aunque s lo se ejecutará un thread a la vez, el sistema operativo
que ejecuta el programa, va ejecutando durante cierto tiempo un thread y luego saltará al siguiente
thread y al usuario le dará la impresi n de que se están ejecutando todos a la vez.
Para entender c mo se codifican los threads, vamos a ver un ejemplo que contiene un solo proceso.
En este ejemplo, el c digo se ejecuta de forma lineal hasta que se llega a la última línea, entonces el
proceso termina.
Explicaci n: La ejecuci n comienza y se crea una instancia de la clase Saludo. Luego se llama tres
veces al método saluda(). Cada llamada se ejecuta y luego se devuelve el control al programa
principal. La última sentencia del main() escribe "Todo el mundo ha saludado" y entonces el
programa termina. Al introducir los threads en este programa, se romperá la linealidad de la
ejecuci n. El programa se dividirá en fragmentos y cada uno de los cuales se encargará de escribir el
mensaje en pantalla.
Ahora el programa inicia dos threads que se ejecutan concurrentemente a la vez que el programa
principal. Después de que se crean los threads, se llama al método start() de cada thread, lo que le
dice al intérprete de Java que comience a procesar ese thread. El método main() es el responsable de
inicializar cada thread y de determinar cuando terminan. Esto es necesario porque el programa
necesita saber cuándo es seguro ejecutar la línea de c digo:
De otro modo, el programa podría terminar antes de que los threads hayan terminado y el
programa podría colgarse. Para controlar esto, se ha puesto un bucle que incrementa el valor de una
variable mientras los threads se están ejecutando.
Si se compila y ejecuta este programa, se podrá comprobar que el valor de la variable i es diferente
en cada ejecuci n del programa. Esta variable almacena el número de veces que se ejecuta el bucle
while mientras se ejecutan los threads. El hecho de que este valor cambie, ilustra como Java ejecuta
los programas que se dividen en distintos procesos.
En la actualidad casi todos los sistemas operativos proporciona servicios para la programaci n
multihilo pero el tratamiento por parte de la JVM es algo distinto a como lo realizan estos sistemas.
Todas las JVM de todas las plataformas proporcionan hilos de ejecuci n aunque el sistema operático
subyacente no los proporcione, en este caso el JVM simula ese comportamiento. Sin embargo incluso
en sistemas que sí admiten este tipo de programaci n hasta la versi n del JDK 1.2 los hilos de la JVM
no se correspondían a hilos nativos del sistema (excepto en su versi n para Solaris) con lo cual el
rendimiento del programe en general se veía gravemente dañado. Sin embargo a partir de esta
versi n la JVM para entornos Windows proporciona servicios de hilos nativos (esto es
proporcionados por el api Win32 y no simulados por el sistema) y a partir de la versi n 1.3 realiza el
mismo tratamiento para entornos Windows. A parte de estos hilos nativos la JVM en todo caso sigue
proporcionando hilos simulados por ella misma (no nativos) conocidos como hilos verdes (green
threads) que garantizan el mismo comportamiento en todas las plataformas en las que se ejecuten en
cuanto a la cuesti n de la planificaci n (que hilo toma el control del procesador y en qué momento).
Habíamos dicho un hilo puede crearse extendiendo a la clase Thread o bien implementando a la
interfaz Runnable.En ambos casos la clase debe proporcionar una definici n del método run () que
contiene el c digo a ejecutarse una vez que el hilo entre en estado de ejecuci n. Veamos un ejemplo
de los dos métodos:
//Clase HiloThread
public classHiloThread extendsThread {
public voidrun() {
while(true) {
System.out.println("Hola mundo,soy el hilo HiloTread"); } } }
//Clase HiloRunnable
public classHiloRunnable implementsRunnable
{
public voidrun() {
while(true) {
System.out.println("Hola mundo,soy el hilo HiloRunnable"); } } }
''
''
** Establc la coio y cra la vtaa y la clas d cotrol
privat void craYVis alizaVtaa) /** Cra a vtaa, l mt dtro l pal para l
clit y la vis aliza **/
{
ram v = w ram)
pal = w PalClitv gtCottPa))
v pack)
v stVisibltr )
v stDa ltClospratioidowCostats EXIT_ _CLSE)
}
}
/**
'
'
* Lo q llga por l sockt lo m stra l ttAra dl pal, lo q
* scrib l s ario l pal lo via por l sockt
*/
packag Chat_Hilos chat clit
privat DataIp tStram dataIp t /** Para lct ra d datos dl sockt */
privat Data tp tStram data tp t /** Para scrit ra d datos l sockt */
privat PalClit pal /** Pal co los cotrols para l s ario */
privat Strig ombr /** E sta Variabl s g arda l ombr q os da l srvidor*/
} catch Ecptio )
{
pritStackTrac)
}
}
p blic void actioPrormdActioEvt vto)
{
try
{
data tp t writ
Tombr + pal gtTto))
} catch Ecptio cpcio)
{
cpcio pritStackTrac)
}
}
/**
* Mtodo r para atdr al sockt Todo lo q llga por l sockt s
* scrib l pal
*/
p blic void r )
{
try
{
ombr = dataIp t rad
T)
pal Por ombrombr)
whil tr )
{
pal addTtodataIp t rad
T) +)
}
} catch Ecptio )
{
pritStackTrac)
}
}
}
/**
'
* Pal para mostrar la covrsacio y pdir al s ario l tto q q ir viar
*/
packag Chat_Hilos chat clit
p blic Strig gtTto) /** Dv lv l tto q hay l ttild y lo borra */
{
Strig tto = ttild gtTt)
ttild stTt)
rt r tto
}
}
Concurrencia y sincronizaci n
La programaci n concurrente puede dar lugar a muchos errores debido a la utilizaci n de recursos
compartidos que pueden ser alterados. Las secciones de codigo potencialmente peligrosas de
provocar estos errores se conocen como secciones criticas. En general los programas concurrentes
deben ser correctos totalmente. Este concepto es la suma de dos conceptos distintos la correcci n
parcial(o safety) esto es que no entrará nunca en ningún mal estado y la correcci n temporal(o
liveness) esto es que terminará en un algun momento de tiempo finito.En estos programas por tanto
hay que evitar que varios hilos entren en una secci n critica (exclusi n mutua o mutex) y que los
programas se bloqueen (deadlock). Además los programas que no terminan nunca (programas
reactivos) deben cumplir la ausencia de inanici n (starvation) esto es que tarde o temprano todos los
hilos alcanzan el control del procesador y ninguno quede indefinidamente en la lista de hilos listos y
también deben cumplir la propiedad de equitativita (fairwess) esto es repartir el tiempo de la forma
más justa entre todos los hilos.
Un monitor impide que varios hilos accedan al mismo recurso compartido a la vez. Cada monitor
incluye un protocolo de entrada y un protocolo de salida. En Java los monitores se consiguen
mediante el uso de la palabra reservadasynchronized bien como instrucci n de bloque o bien como
modificador de acceso de metodos.Este segundo caso se declararía como sigue: public synchronized
void método() Este método declarado de tal forma garantiza que solo un hilo de esta clase puede
acceder a este método a la vez, de tal forma que si un hilo de la misma clase intenta llamar a este
método mientras otro hilo esta dentro del hilo que realiza la llamada quedará en estado de
bloqueado esperando a que el primer hilo libere el monitor, esto es, salga del método sincronizado.
Sin embargo las seccione criticas, y el uso de monitores define secciones criticases muy costoso en
tiempo de ejecucuci n dado que los demás hilos se detendrán hasta que el monitor sea liberado. Y
también es costoso en tiempo de computaci n ya que como media se ha determinado que un
método sincronizado se ejecuta 6 veces más lento que uno que no este sincronizado. Por tanto es
recomendable sincronizas sola y exclusivamente aquellas partes del codigo que formen la secci n
critica y nada más. A este fin responde el delimitador de bloque synchronized, cuyo uso es el
siguiente:
synchronized(objeto)
{
...
}
http://dialnet.unirioja.es/servlet/articulo?codigo