Documentos de Académico
Documentos de Profesional
Documentos de Cultura
JAVA SE
Introducción al lenguage JAVA
3
¿ Por qué JAVA (por qué tan famoso ) ?
Salida
P1.class del
P1.java Prog.
12
Programa Ejemplo
public class MCD {
//calculo del maximo comun divisor entre
15 y 24
public static void main(String args[ ]) {
int x = 15, y = 24;
while (x != y) {
if (x < y)
y = y - x;
else
x = x - y;
}
System.out.println(“el MCD entre 15 y
24 es “ + x);
}
} 13
La clase String
• Son parte del lenguaje (no hay que importarlos)
• Se crean: String s = new String(“Hola
Mundo”); pero esto se puede resumir con
String s = “Hola Mundo”; u
• Tamaño de un String: int i = s.length();
• k-esimo carácter: char c = s.charAt(k);
• Subsecuencias: String sub =
s.substring(k);
String sub = s.substring(inicio,
fin);
• Búsqueda de subsecuencias: int i =
s.indexOf(“hola”);
14
• Comparacion: boolean iguales
Búsqueda de Substrings
String s = “llego y dijo hola”;
int i = s.indexOf(“go”)´; i == 3
(parten de 0)
Ej: Contar las apariciones de “hola” en
un string s:
public class Cuenta {
public static void main(String
args[]) {
int i , apariciones = 0;
while ((i = s.indexOf(“hola”)) !0 -1) {
++apariciones;
s = s.substring(i+1);
}
System.out.println(“el string hola
aparecio “+
15
apariciones+ “veces”);
Arreglos
• Se pueden declarar como: int[] A; int
A[];
Esto es la declaración del puntero al arreglo, no se
especifica tamaño en la declaración;
• Inicialización: A = new int[10];
int[] A = new int[10];
• Empiezan desde 0: for(int i=0; i <
10; ++i) A[i] = 0;
• Se puede averiguar el largo: int
largo = A.length;
• length es un campo del objeto
arreglo y no un método. No es 16
Los argumentos de un programa
• Si se invoca al programa P1 de ka siguiente manera:
java P1 estos son parametros entonces
en el programa se tendrá args[0] = “estos”, args[1] =
“son”, args[2] = “parametros”.
• Se reciben como un arreglo de strings en la variable
declarada como parámetro del programa String
args[]
19
Ejemplo de Exception I/O
• Muchas veces el compilador OBLIGA a programar el código de
modo de atrapar exceptions cuando estas pueden suceder con
cierta probabilidad. Las más frecuentes son las de IO.
25
Leyendo el contenido de un URL
• Si sabemos a priori que el contenido de un URL es texto podemos
leerlo de la siguiente manera:
import java.net.*;
import java,io.*;
public class Leer URL {
public static void main(String args[]) {
try {
URL miURL = new URL(“http://www.dcc.uchile.cl”);
URLConnection c = miURL.openConnection();
BufferedReader in = new BufferedReader (
new InputStreamReader(
c.getInputStream()));
String line;
while ((line = in.readLine() != null)
System.out.prinln(line);
c.close();
catch(MalFormedURLException e) { }
}
}
26
Los Sockets
• Sockets se pueden describir como dos puntos que arman un
puente de transporte de datos entre dos programas. Dos
programas pueden establecer gracias a los sockets una
comunicación segura (hay recuperación de errores de
transmisión). Un proggrama puede leer datos de un socket (lo
que otro pragrama escribió) o puede escribir datos en un
socket ( para que lo lea otro programa)
• En una comunicación entre dos programas con sockets
siempre hay un servidor y un cliente. El servidor es el que
primero establece la posibilidad de comunicación y se queda
escuchando a ver si hay alguien que quiere comuncarse con el
por medio de este socket.El cliente es un programa que,
sabiendo que hay un programa servidor escuchando, se
conecta al socket del servidor y escribe y/o lee de el.
27
Clases definidas por usuario
Partamos con un ejemplo; en el archivo Auto.java se tiene:
public class Auto {
public String nombre;
public int construccion;
public float rendimiento;
}
Podemos entonces escribir un programa que use esto:
public class Programa {
public static void main(String args[]) {
Auto miAuto1 = new Auto(); // el
constructor clase() es gratis!
miAuto1.nombre = “Volkswagen”;
//porque es public !!!!
miAuto1.construccion = 1994;
miAuto1.rendimiento = 9.65;
System.out.println(“mi auto es un
“+miAuto1.nombre+
“fue construido el 28
Métodos de una Clase
• Son los que tienen la responsabilidad de:
- Entregar datos acerca del objeto
- Modificar datos dentro del objeto (especialmente si las
componenetes del objeto no fueron declarados como public)
- Crear un nuevo objeto (constructores)
33
Clases Abstractas (2)
• Si en la declaración de alguna clase hay al menos un método
abstracto, toda la clase debe ser declarada como abstracta.
• Los métodos abstractos actúan como interfaz del concreto
• Al declarar una clase derivada de una abstracta DEBEMOS
implementar todos los métodos abstractos que se habían
declarado.
35
Clases Abstractas (4)
public class ProgramaSueldos {
public static void main(String args[]){
Personal[] P = new Personal[100];
/* aquí llenar arreglo por ej. con
P[0] = new Trabajador(a1,b1,c,d);
P[1] = new Trabajador(a2,b2,c,d);
P[2] = new Empleado(e1,f1,g,h);
P[3] = new Gerente(g1,l1,xy); o llamando rutina*/
int sumaSueldosBruto = 0;
for(int i = 0; i<100;++i)
sumaSueldosBruto += P[i].sueldoBruto();
System.out.println(“la suma de los sueldos es”+ sumaSueldosBruto;
}
}
• Otro ejemplo muy bueno sería el de un programa para animar
figuras representadas por objetos distintos (cuadrados, rect., circ.,
figuras humanas) en una ventana. Estas figuras pueden rotar,
agrandarse, achicarse, moverse, etc. Si queremos que un conjunto
de ellas se traslade y se vuelva a dibujar, esta es la forma de
hacerlo! 36
Interfaces
• Una interfaz es una forma especial de una clase que consiste
exclusivamente de declaraciones de métodos abstractos y
constantes. En vez de la palabra clave “class” las interfaces tienen
la palabra “interface”. Todos los métodos declarados son
abstractos. Esto implica que tienen que ser implementadas por
alguna clase que use esta interfaz. Ej.
39
Interfaces(4)
• O sea que las interfaces definitivamente no sirven para
implementar herencia múltiple ? SI y No:
• Una clase solo puede heredar constantes de la interfaz
• Una clase no puede heredar implementaciones de una interfaz
• Una interfaz se puede usar como una clase
• Una interfaz puede ser una extensión de una clase abstracta, con
lo cual se heredan características de otra clase más:
40
Haciendo más de una cosa a la vez: Threads
• Un thread es una secuencia o flujo de de instrucciones que se
ejecutan dentro de un programa. Tiene un comienzo y un fin.
Entonces qué diferencia tiene con un proceso ?
• El thread sólo puede ser creado dentro de un proceso. Y un
proceso (programa) puede crear varios threads dentro de él que
se ejecutan en paralelo.
• Entonces, qué diferencia tiene con multiprocesos a la UNIX ?
(para los que programaron en C, qué los difiere del fork ?)
• El programa principal está “conciente” de los threads que
existen, hay variables que los identifican. Pueden ser creados,
inicializados, sustendidos, reactivados o parados por el el
programa que los creó.
• El programa principal puede darles parámetros distintos a cada
thread. Los thread se pueden programar con la canatidad de
variables necesarias para su ejecución (no lo heredan TODO)
41
El método run de la clase Thread
• Los threads son una clase existente. Lo que un thread en
particular hace cuando se echa a correr se debe escribir en el
método run de la clase thread, que es un método que se debe
escribir siempre.
• Hay dos formas de implementar Threads en Java (que coincide
con las dos formas vistas de implementar métodos definidos):
– Crear una nueva clase que extienda la clase abstracta Thread
e implementar el método abstracto run.
– Implementar la interfaz runnable, lo cual implica que se va a
reescribir el método run.
• La razón para escoger una u otra forma es simplemente si
queremos que la clase que implementa el thread sea además
extendida de otra clase (aparte de la clase thread).
42
public class SimpleThread extends Thread {
public SimpleThread(String str) {
super(str);
}
44
Implentación haciendo interface
public class MiThread2 implements Runnable {
public void run() {
int i = 0;
while(true)
System.out.println(i++);
}
}
45
Usando threads para atender clientes de un
•
Servidor de Sockets
La forma de implementar servidores que atiendan a varios
clientes paralelamente a la vez es combinando threads con
sockets
• El servidor abre un ServerSocket desde donde oye ciualquier
intento por conectarse con él de un cliente.
• Una vez establecida la conexión, abre un socket normal e inicia
un thread que atiende a este cliente. El socket abierto se pasa
como parámetro. De esa manera puede seguir oyendo por el
ServerSocket sin estar bloqueado.
• El thread tiene un método run que atiende los pedidos del
cliente
• El cliente se conecta al servidor sin saber que finalmente será un
socket el que está atendiéndolo.
• Si el protocolo de atención especifica la manipulación de datos
comunes (por ejemplo a un archivo con información sobre
cuentas corrientes), hay que tener cuidado con los accesos 46
concurrentes a estos datos (métodos synchronized).
Ejemplos de programas interesantes
• El programa MultiServer.java es el del servidor que establece el
ServerSocket y se queda oyendo para ver si viene un cliente. Si llega
un cliente crea un socket y un nuevo thread, al cual le pasa el socket,
para que sea atendido. El server siguie esperando clientes en el ciclo.
• El programa MultiServerThread es el thread que atiende al cliente. En
este caso sólo manda dos strings, uno avisándole que número de
cliente es el otro para despedirse.
• El programa Client.java se comunica con el servidor y lee los dos
strings desde el socket establecido, los cuales los imprime en
pantalla.
• El programa Syncron.java muestra como debe declararse un método
al cual acceden varios threads de modo que no se produzca problema
de acceso indebido (más de un thread puede obtener el mismo
número!!)
• Los programas DateServer y DateClient muestran como se pueden
traspasar objetos facilmente por un socket (siempre que estos sean
serializables) 47
Objetos Remotos en JAVA
• La tecnología RMI (Remote Method Invocation) permite a un
programa corriendo en una máquina virtual de java (un intérprete)
invocar el método de un objeto localizado en otra máquina virtual de
java (ubicada en cualquier parte de la red TCP/IP que se pueda
acceder desde el lugar)
• Normalmente se tiende a ver aplicaciones que usan RMI como
aplicaciones de cliente servidor. Una típica aplicación de servidor crea
un objeto, lo “publica” para que pueda ser accesible de cualquier
otro lado y espera a que llamen clientes pidiendo la invocación de sus
métodos. Una típica aplicación cliente obtiene una referencia al
objeto remoto en el servidor y luego invoca sus métodos como si
fuera un objeto local.
• RMI provee mecanismos con los cuales el cliente y el servidor se
pueden intercambiar información, convirtiendolas en aplicaciones de
objetos distribuidos. Estos mecanismos deben hacer posible: 1)
localizar objetos remotos, 2) comunicarse con los objetos remotos 3)
traspasar el código de los objetos remotos (deben ser serializables)
48
Interfaces, objetos y métodos remotos
• Como en otras aplicaciones, una aplicación distribuida que usa RMI
está constituida por interfaces y clases. Las interfaces definen los
métodos que serán conocidos por los clientes de los objetos
remotos. Las clases remotas implementan estos y quizas otros
métodos también.
• Un objeto remoto se implementa siguiendo los siguientes pasos:
1) Diseño e implementación de las componentes de la aplicación
distribuida
2) Compilar los códigos fuentes y generar los llamados “stubs” y
skeletons
3) echar a andar la aplicación
49
Un ej: Un objeto remoto que contiene
un número
//el archivo de definición de la interfaz
import java.rmi.*;
public interface Numero extends Remote {
public int getNumero() throws RemoteException;
}
50
Un ej: Un objeto remoto(2)
//el archivo de definición de la implementación
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
public class NumeroImpl extends UnicastRemoteObject implements
Numero
{ int cont = 0;
public int getNumero() throws RemoteException {
int ret = cont++;
return ret;
}
public static void main(String args[]) {
System.setSecurityManager(new RMISecurityManager());
try { NumeroImpl n = new NumeroImpl();
Naming.rebind("//"+args[0]+"/elNumero",n);
System.out.println("Numero creado");
} catch (Exception e) {}
}
} 51
Aclaración: Existe un servidor de
comunicaciones !!!!
• Es un programa que provee java llamado rmiregistry
• Se echa a correr en la máquina donde está el programa
servidor del objeto remoto
• Cualquier cliente que quiera ocupar el objeto remoto
debe pedirle a él una referencia al objeto remoto antes de
ocuparlo => debe saber con qué nombre se registró y en
qué máquina esta corriendo.
rmiregistry
Naming.lookup(2)
Internet Naming.rebind(1)
Cliente
servidor
Objeto.metodo() (3)
52
Un ej: Un objeto remoto que contiene
un número(3)
//el archivo del cliente
import java.rmi*;
import java.rmi.server.*;
class ClienteNumero {
public static void main(String args[]) {
try {
Numero N = (Numero) Naming.lookup("//"+args[0]+"/elNumero");
System.out.println("El numero vale ahora "+N.getNumero();
} catch( Exception e) {}
}
}
53
Compilar los códigos fuentes y generar las
clases y los llamados “stubs” y skeletons
• Una vez implementados las 3 clases hay que
compilarlas para generar
– Numero.class: la interfaz que define lo que se conocerá del
objeto en toda la red.
– NumeroImpl.class: que es el que implementa el objeto
remoto. Además de implementar el constructor y el
método de la interfaz contiene un main que lo único que
hace es crear el objeto y registrarlo o publicarlo con un
nobre dado.
– Cliente.class
– Esto se hace con el compilador javac
54
Compilar los códigos fuentes y generar las
clases y los llamados “stubs” y skeletons(2)
• Una vez generadas las 3 clases hay que compilar la
clase implementadora para generar el stub y skel.
– NumeroImpl_stub.class: Es el llamado stub del objeto
remoto. Es el encargado de recibir y transmitir los datos
necesarios para servir a los clientes que piden acceso al
objeto remoto NumeroImpl.
– NumeroImpl_skel.class: es como un esqueleto de la clase.
Tiene sólo la estructura de la clase pero es suficiente
información para que el cliente pueda reunir todo los
antecedentes para llegar a hacer un pedido al stub
– Esto se hace con el compilador rmic NumeroImpl
55
Echar a andar la aplicación
• Echar a correr rmiregistry: java rmiregistry
• Echar a correr el programa servidor de objeto
remoto: java NumeroImpl
• Echar a correr cliente(s): java Cliente.
• Una vez obtenida la referencia por el cliente el
flujo de datos corre: cliente -> skel->stub->Server-
>stub->skel->cliente
• Veamos una aplicación más interesante: Un
Banco: los clientes son un ejecutivo de cuentas y
un cliente cualquiera. El servidor tiene la info
sobre las cuentas.
56
GRACIAS