Programando en Java Raspberry Pi (RPi) 2015/05/08 Juan V. Capella



Documentos relacionados
Sockets en Java. Prof. Wílmer Pereira Universidad Simón Bolívar

Federico Peinado

UNIVERSIDADE DA CORUÑA Departamento de Tecnoloxías da Información e as Comunicacións LABORATORIO DE RC: TUTORIAL DE SOCKETS EN JAVA

PROGRAMACIÓN CLIENTE-SERVIDOR MEDIANTE SOCKETS EN JAVA

EJEMPLOS PROGRAMACIÓN SOCKET - JAVA

Examen de Redes - ETSIA 9 de septiembre - Primer Parcial

Sockets en Java. La Creatividad proviene de un conflicto de ideas. Uso de Sockets

Práctica 5: Servidor web concurrente en Java

1.- FUNDAMENTOS FUNCIONAMIENTO GENÉRICO JAVA SOCKETS Creación de Streams de Entrada...7

Arquitecturas cliente/servidor

ARQUITECTURAS CLIENTE/SERVIDOR

Modelo de Objetos Distribuidos

Arquitecturas cliente/servidor

UNIVERSIDAD POLITÉCNICA DE PACHUCA SOCKETS EN JAVA

Lab 01: Programación de Sockets en TCP

Examen de Redes - Primer Parcial - ETSIA 26 de Enero de 2006

Las clases Java Socket y ServerSocket

Tema 1. Introducción a JAVA

Introducción... 1 Qué es Java?... 1 Compilando a Bytecode... 1 Usando jgrasp Para Hacer el Trabajo Sucio... 5 El Entorno de jgrasp...

Curso de Redes Computadores 1 Tema 3 Introducción a la capa de transporte. Interfaz de programación en redes. Sockets.

Redes (IS20) Ingeniería Técnica en Informática de Sistemas. CAPÍTULO 8: El nivel de transporte en Internet

Introducción a Java LSUB. 15 de enero de 2015 GSYC

TELEPROCESO Y SISTEMAS DISTRIBUIDOS

Java. Mtro. Manuel Suárez Gutiérrez

Qué es Java? Introducción a Java. Lenguajes Orientados a Objetos. Qué es Java? Historia de Java. Objetivos de Java

COMUNICACIÓN ENTRE PROCESOS SOCKETS

Introducción al lenguaje Java

Introducción al lenguaje de programación java

CLASE SOCKET. 1. Crear un nuevo socket usando un constructor de la clase. 2. El socket trata de conectarse al host remoto.

Para leer la entrada de consola, lo primero que se hace es construir un Scanner que este asociado al flujo de entrada estándar System.

Java: comunicación en Internet. Modem. Satelite UMTS W-LAN. Láser. Fibra óptica. Conceptos básicos

Universidad de Cantabria

LABORATORIO DE RC PRÁCTICA 2: IMPLEMENTACIÓN DE UN CLIENTE Y SERVIDOR DE

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

USO DE LOS OBJETOS JLABEL, JTEXTFIELD Y JBUTTON

Identificadores, palabras reservadas, tipos de datos, operadores aritméticos y el sistema estándar de salida en Java

Java en 2 horas. Rodrigo Santamaría

1. Definición de puerto 2. Sockets 3. Conceptos cliente/servidor 4. Definición de Stream 5. Concurrencia, multiprogramación y multitarea 6.

PROGRAMACION DISTRIBUIDA

UNIVERSIDAD CARLOS III DE MADRID DEPARTAMENTO DE INGENIERÍA TELEMÁTICA. Daniel Díaz Sánchez

I. Introducción a la programación orientada a objetos y al lenguaje JAVA Colegio Reuven Feuerstein Javier Navarro

El lenguaje de programación Java

Pontificia Universidad Católica de Chile Escuela de Ingeniería Departamento de Ciencia de la Computación. IIC1102 Introducción a la Programación

Práctica GESTIÓN Y UTILIZACIÓN DE REDES LOCALES. Curso 2001/2002. TCP/IP: protocolo TCP

Introduciendo datos desde el

Gestor de aplicaciones Java. Esta herramienta es el intérprete de los archivos de clase generados por el javac (compilador).

Repaso de las características más importantes de la programación Java y su adaptación a Android

Desarrollo de Aplicaciones Distribuidas. Sockets. Daniel Avellaneda

Partes de un programa en Java. A. Ejemplo de un Programa en Java /* Programa Ejemplo de Java: Muestra una Ventana Archivo: Ejemplo1.

Aplicaciones Cliente/Servidor en Gambas Prof: Mileti, P.

Práctica 4: Java Remote Method Invocation (RMI)

Programación interactiva. Oscar Bedoya

INTRODUCCIÓN A JAVA. Índice

Programación Orientada a Objetos con Java

JAVA: Applets. Diseño de aplicaciones web.

1 SOCKETS EN JAVA. Sistemas Distribuidos::Sockets en Java EUI-SG/INFOR.UVA.ES 1

Cliente/Servidor en Java

GUÍA DE LABORATORIO 5 ARREGLOS DE UNA DIMENSIÓN

Activación de un Escritorio Remoto

FACULTAD DE INGENIERÍA

19. Packages o paquetes

Laboratorio de Redes de Comunicaciones Programación con Sockets en Java

James Gosling, creador de Java

Manual del Protocolo XML-RPC de Mensajería Negocios

Solución al Examen de Prácticas de Programación (Ingeniería Informática)

Clases Java para comunicaciones en red

Taller de Programación Estructurada en Java Tema 2. Fundamentos de la programación orientada a objetos

Práctica III: Streams, Readers y Writers

Programación Orientada a Objetos. Java: Excepciones

Sensor de Temperatura utilizando el Starter Kit Javelin Stamp. Realizado por: Bertha Palomeque A. Rodrigo Barzola J.

Ayuda para la instalación Componente Firma Digital INDICE. 1 Configuración previa Configuración Internet Explorer para ActiveX...

Problemas de Redes de Computadores. Conjunto de problemas 1

Elementos léxicos del lenguaje de programación Java


ISTP CIDET COMPUTACION E INFORMATICA ARREGLOS EN JAVA

MICQ. Trabajo Práctico Final Seminario de Ingeniería en Informática I Facultad de Ingeniería, UBA. Junio Cátedra: Pablo Cosso

GESTIÓN DE EXCEPCIONES EN JAVA. CAPTURA CON BLOQUES TRY CATCH Y FINALLY. EJEMPLOS RESUELTOS. (CU00927C)

Luego lleve el cliente a otra máquina y ejecute desde ahí usando el nombre de la máquina del servidor.

EL MODELO DE ESTRATIFICACIÓN POR CAPAS DE TCP/IP DE INTERNET

Introducción a la Programación en Java. Page 1

Redes Locales: El protocolo TCP/IP

Figura 7-1 Enlace para instalar el servidor web Apache Jakarta Tomcat

Juan de Dios Murillo Morera Santiago Caamaño Polini INTRODUCCIÓN

Sockets (TCP) Tema 2.- Nivel de aplicación en Internet

1. Visión general de RMI

Tutorial BMS Server Studio UDP

Programación para redes con Java

Módulo 1 El lenguaje Java

DISEÑO DE UNA ARQUITECTURA CLIENTE/SERVIDOR MEDIANTE OBJETOS DISTRIBUIDOS EN JAVA

Conceptronic CFULLHDMA Cómo usar Samba/CIFS y NFS

Introducción a la programación con sockets en C

Programador en Plataforma Java y XML

Objetos y Clases en Java. ELO 329: Diseño y Programación Orientados a Objetos

Sockets. Sockets. 1 Introducción

class Nombre_Clase extends Nombre_SuperClase { cuerpo de la clase extendida }

Aspectos Básicos de Networking

Transcripción:

Programando en Java Raspberry Pi (RPi) 2015/05/08 Juan V. Capella

Contenido Objetivo Introducción Tecnología Java Clases y objetos. Herencia Aplicaciones y Applets Tipos de datos y estructuras Operadores Networking GPIO GUI armpower.blogs.upv.es 2

Objetivo Introducirse en la programación en Java con la Raspberry Pi Aprender a desarrollar aplicaciones distribuidas armpower.blogs.upv.es 3

Introducción Lenguaje de programación desarrollado por Sun Microsystems a principios de los años 90 La motivación principal Java: Write Once, Run Anywhere Proporcionar un lenguaje independiente de la plataforma y un entorno de ejecución ligero y gratuito, para poder implementarlo en cualquier dispositivo Al tener que ser ejecutado mediante la JVM hace que no sea tan rápido como con otras opciones, por ejemplo C/C++. Java es Orientado a Objetos Java es Multi-hilo No hay punteros Recolección de Basura Garbage Collection Responsable de liberar cualquier memoria que pueda ser liberada. Esto se realiza de manera automática durante la vida del programa Java. El programador se libera de la carga de tener que liberar la memoria no utilizada. Seguridad Java fue diseñado para hacer más fácil el desarrollo de código sin bugs armpower.blogs.upv.es 4

Tecnología Java Lenguaje programación (JAVA) Entorno de desarrollo (JDK). Herramientas: Compilador (javac) Intérprete (java) Generador de documentación (javadoc) Una herramienta para empaquetar los.class Etc Entorno en tiempo de ejecución de Java (JRE) formado por una Máquina Virtual de Java (JVM), un conjunto de bibliotecas Java y otros componentes necesarios para que una aplicación escrita en lenguaje Java pueda ser ejecutada armpower.blogs.upv.es 5

Fases Proceso generación Proceso ejecución Código fuente Byte Code Plataforma Windows Fichero.java Compilación Fichero.class Plataforma Linux Resultados Plataforma Java Virtual Machine (JVM) Tarea Escribir el programa Compilar el programa Ejecutar el programa Herramienta a usar Cualquier editor de texto o IDE Compilador Java (javac) Intérprete Java (java) Salida Fichero.java Fichero.class (Java bytecodes) Salida programa armpower.blogs.upv.es 6

Clases y objetos Las clases están compuestas por un conjunto de miembros (datos y funciones) Una clase se usa como el modelo que deben seguir los objetos Un objeto es una instancia de una clase Las clases y objetos son similares a los tipos de datos y a las variables armpower.blogs.upv.es 7

Clases y objetos class Persona { int dni; String nombre; int peso; string profesion; Definición de clase Creación de objeto Persona juan = new Persona(); armpower.blogs.upv.es 8

Herencia Clase base o superclase Vehículo Dos_Ruedas Cuatro_Ruedas Bicicleta Moto Coche Camión Clases derivadas o subclases armpower.blogs.upv.es 9

Una aplicación en Java Toda aplicación java debe estar dentro de una clase Método main() public class HolaMundo { public static void main(string [] args) { System.out.println( Hola Mundo! ); armpower.blogs.upv.es 10

Applets Programa escrito en Java que puede ejecutarse en un navegador web utilizando la Java Virtual Machine (JVM), o en el AppletViewer de Sun. Código fuente Byte Code Fichero.java Compilación Fichero.class <html> <APPLET CODE = miapplet.class width = 100 height = 100> </APPLET> Resultados armpower.blogs.upv.es 11

Un applet en Java import java.awt.*; import applet.applet; public class miapplet extends Applet { public void paint(graphics g) { g.drawstring( Hola Mundo!,50,50); Los Applets no tienen método main() Importación de paquetes armpower.blogs.upv.es 12

Tipos de datos byte, short, int, long float, double boolean armpower.blogs.upv.es 13

La clase String Se usa para almacenar cadenas de caracteres. Se pueden usar para: examinar los caracteres contenidos en un texto, buscar subcadenas, comparar cadenas, etc. armpower.blogs.upv.es 14

Vectores en Java Almacenan valores de un mismo tipo El índice del vector identifica cada elemento int vect[] = {2,7,1; String[] s = { hola, mundo ; armpower.blogs.upv.es 15

Estructuras de control en Java: if if(){ if(){ else{ if(){ else if(){ armpower.blogs.upv.es 16

Estructuras de control en Java: Bucles for(;;){ while(){ do{while(); armpower.blogs.upv.es 17

Estructuras de control en Java: switch-case int a = 2; switch(a){ case 1: a++; break; case 2: a = a + 4; break; default: a = a + 50; armpower.blogs.upv.es 18

Declaración de variables Se pueden declarar variables en cualquier lugar del código Al declarar la variable podemos inicializar el contenido No se permite el uso de variables sin previa inicialización int numcoches, identificador; armpower.blogs.upv.es 19

Alcance y bloques de código Los bloques se definen con { Las variables declaradas en ese bloque solo existen en ese bloque { { int numcoches = 0; numcoches++ Dará error! armpower.blogs.upv.es 20

Conversión de tipos La conversión automática se realiza siempre que el tipo de la expresión a la derecha pueda ser transformado de forma segura al tipo de la expresión a la izquierda Vamos, que no se puede convertir automáticamente un float a un int porque el primero requiere de más espacio de almacenamiento que el segundo, lo que puede resultar en pérdida de información Para forzar la conversión conversión explicita: int v1; float v2=3.47; v1 = (int) v2; armpower.blogs.upv.es 21

Operadores ==!= > < <= >=! && armpower.blogs.upv.es 22

Interfaz de programación en red: Sockets en JAVA Al comunicarse dos procesos siguen un modelo Cliente / Servidor: cliente 1. Petición Internet servidor 2. Respuesta Cliente: Inicia la comunicación Solicita un servicio al servidor Ejemplo: Un cliente web solicita una página Servidor: Espera peticiones Proporciona el servicio solicitado Ejemplo: El servidor web envía la página solicitada por el cliente armpower.blogs.upv.es 23

Interfaz de programación en red: Sockets en JAVA Clientes y servidores utilizan protocolos de transporte Los procesos de las aplicaciones residen en el espacio de usuario FTP HTTP POP3 DNS Los procesos de los protocolos de transporte forman parte del S.O. TCP API UDP Red Enlace de datos Físico Se necesita un mecanismo para ponerlos en contacto API (Application Programming Interface) armpower.blogs.upv.es 24

API socket Permite a las aplicaciones utilizar los protocolos de la pila TCP/IP Define las operaciones permitidas y sus argumentos Parecido a la forma de acceder a los ficheros en Unix Operaciones: open, read, write, close FTP HTTP socket socket socket socket TCP Red Enlace de datos Físico POP3 UDP DNS armpower.blogs.upv.es 25

Socket Es una abstracción del sistema operativo Las aplicaciones los crean, los utilizan y los cierran cuando ya no son necesarios Su funcionamiento está controlado por el sistema operativo Comunicación entre procesos Los procesos envían y reciben mensajes a través de sockets Los mensajes fluyen entre sockets proceso socket Transpor te Red Enlace Físico Internet proceso socket Transpor te Red Enlace Físico

Identificación de los sockets La comunicación en Internet es de socket a socket El proceso que está comunicándose se identifica en Internet por medio de su socket El socket tiene un identificador Identificador = dir. IP del computador + núm. puerto IP:128.1.1.1 Puerto: 1245 cliente socket Transpor te Red Enlace Físico Internet servidor socket Transpor te Red Enlace Físico IP:62.3.3. 3 Puerto: 80

Tipos de sockets Sockets TCP Sockets UDP Las aplicaciones piden al S.O. una comunicación controlada por TCP: Orientada a la conexión Comunicación fiable y ordenada También se denominan sockets de tipo Stream Las aplicaciones piden al S.O. una comunicación controlada por UDP: Transferencia de bloques de datos Sin conexión ni fiabilidad ni entrega ordenada Permite difusiones También se denominan sockets de tipo Datagram cliente socket TCP bytes servidor sock et TCP cliente socket UDP datagramas servidor socket UDP

Los sockets en Java Dentro del paquete java.net existen tres clases de sockets: Socket Cliente TCP ServerSocket Servidor TCP DatagramSocket Cliente/Servidor UDP También hay otras clases auxiliares que facilitan la programación de aplicaciones en red http://java.sun.com

Direcciones IP en Java Clase InetAddress InetAddress es la clase que se utiliza para almacenar direcciones IP Algunos métodos importantes InetAddress getbyname(string nombre) Obtiene la dirección IP asociada a un nombre String gethostaddress() Devuelve la dirección IP en formato "aa.bb.cc.dd" String gethostname() Devuelve el nombre del host

Sockets TCP Cliente: cliente servidor Crea un socket (sclient) y lo conecta con el del servidor sclient cliente sclient = new Socket(...) sserv servidor Transfiere información sclient in.readline() out.print() sserv cliente servidor Cierra el socket y la conexión (a veces lo hace el servidor) sclient sclient.close() sserv Servidor: Ha de estar en ejecución Debe haber creado un socket (sserv) donde recibir a los clientes que conectan con él

Clientes TCP Clase Socket Constructores Socket(InetAddress dirip, int puerto) Socket(String nombre, int puerto) Crea un socket y lo conecta con el servidor indicado Socket(InetAddress dirip, int puerto, InetAddress diriplocal, int puertolocal) Socket(String nombre, int puerto, InetAddress diriplocal, int puertolocal) Crea un socket y lo conecta con el servidor indicado, ligándolo a una dirección IP y puerto locales concretos

Clase Socket Clientes TCP Algunos métodos importantes close(): Cierra el socket InputStream getinputstream() Proporciona un descriptor para leer del socket InputStream proporciona un flujo de bytes Se puede leer un byte: read() O un grupo de bytes: read(byte[] b) OutputStream getoutputstream() Proporciona un descriptor para escribir en el socket OutputStream admite un flujo de bytes Se puede escribir un byte: write(int b) O un grupo de bytes: write(byte[] b)

Gestión de los flujos de entrada InputStreamReader convierte un flujo de bytes en un flujo de caracteres Se puede leer un carácter: read() O un grupo de caracteres: read(char[] text) BufferedReader añade un buffer al flujo caracteres buffer strings Se puede leer una línea de texto: String readline() Ejemplo: BufferedReader entrada=new BufferedReader(new InputStreamReader(s.getInputStream())); entrada.readline()

Gestión de los flujos de salida PrintWriter permite enviar texto (caracteres) Tiene métodos que permiten escribir una línea de texto: print(string s) y println(string s) líneas bytes Ejemplo: PrintWriter salida = new PrintWriter(s.getOutputStream()); salida.print("get / HTTP/1.0" + "\r\n");

Cliente TCP básico import java.net.*; import java.io.*; class ClienteTCP { public static void main(string args[]) throws UnknownHostException, IOException { Socket s=new Socket("zoltar.redes.upv.es",21); BufferedReader entrada=new BufferedReader(new InputStreamReader(s.getInputStream())); System.out.println(entrada.readLine()); s.close(); Este cliente se conecta al servidor FTP (puerto 21) y visualiza la primera línea que recibe del servidor. Después cierra la conexión Genera una salida similar a: 220 (vsftpd 1.2.1)

Segundo cliente TCP import java.net.*; import java.io.*; class ClienteTCP2 { public static void main(string args[]) throws UnknownHostException,IOException { Socket s = new Socket("www.upv.es",80); BufferedReader entrada = new BufferedReader(new InputStreamReader(s.getInputStream())); PrintWriter salida = new PrintWriter(s.getOutputStream()); salida.print("get / HTTP/1.0" + "\r\n"); salida.print("\r\n"); salida.flush(); System.out.println(entrada.readLine()); s.close(); Envía una petición HTTP al servidor www.upv.es Esta es la salida del programa: HTTP/1.1 200 OK

Servidores TCP Cliente: Cuando crea un socket (sclient) establece la conexión con el servidor Servidor: Debe haber creado un socket (sserv1) donde espera a los clientes que conectan con él Cuando un cliente se conecta con un servidor: El servidor crea un nuevo socket (sserv2) para que el proceso servidor se comunique con el cliente De esta forma es posible que un servidor se comunique con varios clientes simultáneamente sserv 1 cliente servidor sclient sserv 2 bytes

Servidores TCP Clase ServerSocket Constructores ServerSocket(int puerto) Abre un socket en el puerto indicado en modo de escucha Si port = 0, entonces se elige cualquier puerto libre ServerSocket(int puerto, int backlog) Abre un socket en el puerto indicado en modo de escucha backlog indica la longitud máxima de la cola de conexiones en espera Cuando llega una solicitud de conexión y la cola está llena, se rechaza la conexión

Servidores TCP Clase ServerSocket Algunos métodos importantes Socket accept() Acepta una conexión de un cliente y devuelve un socket asociado a ella El proceso se bloquea hasta que se realiza una conexión El diálogo con el cliente se hace por el nuevo socket El ServerSocket puede atender nuevas conexiones close() Cierra el socket servidor

Primer servidor TCP import java.net.*; import java.io.*; class ServidorTCP { public static void main(string args[]) throws IOException { ServerSocket ss=new ServerSocket(7777); Socket s=ss.accept(); // espero a que llegue un cliente PrintWriter salida=new PrintWriter(s.getOutputStream(),true); salida.println("bienvenido al servidor de prueba de Redes"); s.close(); ss.close(); El servidor espera un cliente. Cuando éste se conecta, el servidor le envía una cadena de bienvenida y acaba zoltar:~/java> telnet localhost 7777 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Bienvenido al servidor de prueba de Redes Connection closed by foreign host.

Segundo servidor TCP import java.net.*; import java.io.*; class ServidorTCP2 { public static void main(string args[]) throws IOException { ServerSocket ss = new ServerSocket(7777); int cliente=1; while(true) { Socket s = ss.accept(); // espera una conexión de un cliente PrintWriter salida=new PrintWriter(s.getOutputStream(),true); salida.println("usted es el cliente " + cliente); System.out.println("Atendiendo al cliente " + cliente++); s.close(); Servidor iterativo: continúa atendiendo a nuevos clientes A cada uno le envía una cadena con su número de cliente y después cierra el socket

Sockets UDP Con UDP no se establece conexión entre cliente y servidor El emisor indica explícitamente la dirección IP y el puerto del origen y del destino en cada datagrama El receptor ha de extraer del datagrama recibido la dirección IP y el puerto del emisor Los datos transmitidos pueden llegar fuera de orden o incluso perderse

Datagrama UDP Clase DatagramPacket Constructores DatagramPacket(byte buf[ ], int longitud) Crea un datagrama UDP de esa longitud para recibir DatagramPacket(byte buf[ ], int longitud, InetAddress dirip, int puerto) Crea un datagrama UDP con ese buffer y de esa longitud para enviarlo a la dirección IP y puerto que se indican

Datagrama UDP Clase DatagramPacket Algunos métodos importantes se refieren siempre al host remoto getaddress( ) getport( ) getdata( ) getlength( ) setaddress(inetaddress) setport(int) setdata(byte[ ]) setlength(int)

Socket UDP Clase DatagramSocket Constructores DatagramSocket() Crea un socket UDP que escucha en un puerto libre DatagramSocket(int puerto) Crea un socket UDP que escucha en ese puerto

Socket UDP Clase DatagramSocket Algunos métodos importantes send(datagrampacket p) Envía un datagrama El DatagramPacket incluye los datos a enviar, su longitud y la dirección IP y el puerto del destino receive(datagrampacket p) Recibe datagramas. El método es bloqueante Cuando el método retorna, el buffer DatagramPacket contiene los datos recibidos, la dirección IP y el puerto de quien envía el datagrama close()

Cliente UDP import java.net.*; import java.io.*; public class ClienteUDP{ public static void main(string[] args) throws IOException { DatagramSocket s = new DatagramSocket(); InetAddress dir = InetAddress.getByName("zoltar.redes.upv.es"); String msg = "Hola, esto es un mensaje\n"; byte[] buf = new byte[256]; buf = msg.getbytes(); DatagramPacket p = new DatagramPacket(buf, buf.length, dir, 7777); s.send(p); s.receive(p); // se bloquea hasta que recibe un datagrama System.out.write(p.getData()); s.close(); El cliente envía un datagrama a un servidor y muestra la respuesta por pantalla

Servidor UDP import java.net.*; import java.io.*; public class ServidorUDP{ public static void main(string[] args) throws IOException { DatagramSocket s = new DatagramSocket(7777); DatagramPacket p = new DatagramPacket(new byte[256], 256); s.receive(p); // se bloquea hasta que recibe un datagrama p.setaddress(p.getaddress()); p.setport(p.getport()); s.send(p); s.close(); Envía de vuelta el datagrama recibido, sin modificarlo, a la dirección IP y puerto de origen Sólo procesa un cliente y acaba

Servidores concurrentes Normalmente, un servidor debe estar preparado para atender muchos clientes Se puede hacer de dos maneras: Secuencial: un cliente detrás de otro Concurrente: varios clientes al mismo tiempo

Threads en Java En Java, la concurrencia la conseguimos usando hilos de ejecución Clase Thread Se define una clase derivada de Thread Código a ejecutar en cada hilo dentro del método run() Se lanza el hilo con start() Ejemplo de uso: class Hilos extends Thread { int id; public Hilos(int i) {id=i; public void run() { for(int i=0;i<100;i++) { System.out.print(id); try {sleep(100); catch(interruptedexception e) { public static void main(string args[]) { for(int i=0;i<3;i++) new Hilos(i).start();

Servidores concurrentes (II) Diversos hilos de ejecución: En el hilo principal se ejecuta permanentemente el método accept() Espera el establecimiento de nuevas conexiones Para cada cliente que se conecta, se lanza un nuevo hilo de ejecución para gestionar esa conexión Cliente 1 Maestro Cliente 2 Servidor 1 Servidor 2 Cliente 3 Servidor 3

Identificación de los sockets Ahora tenemos varios sockets asociados al mismo puerto Para identificar al socket destino hay que tener en cuenta la dirección (dir. IP + puerto) del socket origen IP:128.1.1.1 Puerto: 1245 cliente 1 socket Transpor te Red IP:62.3.3.3 Puerto: 80 Maestro socket IP:62.3.3.3 Puerto: servidor servidor 1 2 80 socket socket Transpor te Red Enlace Físico cliente 2 socket Transpor te Red IP:152.2.2.2 Puerto: 2115 Enlace Enlace Físico Intern et Físico

Servidor concurrente TCP import java.net.*; import java.io.*; class SCTCP extends Thread { Socket id; public SCTCP(Socket s) {id=s; public void run() { try { PrintWriter salida=new PrintWriter(id.getOutputStream(),true); while(true){ salida.println(system.currenttimemillis()); sleep(100); catch(exception e) { public static void main(string args[]) throws IOException{ ServerSocket ss=new ServerSocket(8888); while(true) { Socket s = ss.accept(); SCTCP t = new SCTCP(s); t.start();

Más ejemplos Micro-servidor web iterativo import java.net.*; import java.util.*; import java.io.*; class ServidorWeb { public static void main(string args[]) throws Exception{ byte[] buffer = new byte[1024]; int bytes; ServerSocket ss=new ServerSocket(7777); while(true) { Socket s=ss.accept(); // espero a que llegue un cliente BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream())); PrintWriter out=new PrintWriter(s.getOutputStream(),true); StringTokenizer tokens = new StringTokenizer(in.readLine()); tokens.nexttoken(); // esto debe ser el "GET" String archivo = "."+tokens.nexttoken(); // esto es el archivo FileInputStream fis = null; boolean existe = true; try {fis = new FileInputStream(archivo); // comprobamos si existe catch (FileNotFoundException e) {existe = false; if (existe && archivo.length()>2) while((bytes = fis.read(buffer))!= -1 ) // enviar archivo solicitado s.getoutputstream().write(buffer, 0, bytes); else out.println("<html><body><h1>404 Not Found</h1></body></html>"); s.close();

Acceso a bajo nivel Framboos Tiene básicamente funciones para la GPIO y comunicaciones (UART) Si necesitas PWM, SPI o I2C Pi4J https://github.com/jkransen/framboos Ejemplo: import framboos.inpin; import framboos.outpin; InPin pulsador = new InPin(8); boolean estapulsado = pulsador.getvalue(); OutPin led = new Outpin(0); led.setvalue(true); //enciendo el led armpower.blogs.upv.es 56

Acceso a bajo nivel Pi4J basado en WiringPi http://pi4j.com/ Instalación: Obtener el paquete. Desde consola de la Raspberry Pi: wget http://pi4j.googlecode.com/files/pi4j-0.0.5.deb Instalar: sudo dpkg -i pi4j-0.0.5.deb Instalará las librerías Pi4J y ejemplos en: /opt/pi4j/lib y /opt/pi4j/examples Al compilar incluir Pi4J lib en el classpath : javac -classpath.:classes:/opt/pi4j/lib/'*'... Al ejecutar el programa incluir Pi4J lib en el classpath : sudo java -classpath.:classes:/opt/pi4j/lib/'*'... armpower.blogs.upv.es 57

Acceso a bajo nivel Ejemplo: import com.pi4j.io.gpio.gpiocontroller; import com.pi4j.io.gpio.gpiopindigitalinput; import com.pi4j.io.gpio.gpiopindigitaloutput; // creamos una instancia del controlador de gpio final GpioController gpio = GpioFactory.getInstance(); // configuramos el pin 2 como entrada con su resistencia interna de pull down habilitada GpioPinDigitalInput mypulsador = gpio.provisiondigitalinputpin(raspipin.gpio_02, // PIN # "MiPulsador", // PIN FRIENDLY NAME (opcional) PinPullResistance.PULL_DOWN); // PIN RESISTANCE (opcional) // configuramos el pin 4 como salida e indicamos que tras la inicialización debe estar a nivel bajo GpioPinDigitalOutput miled = gpio.provisiondigitaloutputpin(raspipin.gpio_04, // PIN # "Mi LED", // PIN FRIENDLY NAME (opcional) PinState.LOW); // PIN STARTUP STATE (opcional) miled.setstate(pinstate.high); miled.low(); miled.high(); miled.toggle(); miled.pulse(1000); PinState estadopulsador = mipulsador.getstate(); boolean estapulsado = mipulsador.ishigh(); armpower.blogs.upv.es 58

Acceso a bajo nivel Obteniendo información de sistema: import java.io.ioexception; import java.text.parseexception; import com.pi4j.system.systeminfo; // Ejemplo obtener informacion de sistema en la Raspberry Pi public class SystemInfoExample { public static void main(string[] args) throws InterruptedException, IOException, ParseException { System.out.println("Serial Number : " + SystemInfo.getSerial()); System.out.println("CPU Revision : " + SystemInfo.getCpuRevision()); System.out.println("CPU Temperature : " + SystemInfo.getCpuTemperature()); System.out.println("CPU Core Voltage : " + SystemInfo.getCpuVoltage()); armpower.blogs.upv.es 59

Un caso práctico: montaje Apagar la RPi, quitar la alimentación, montar con cuidado. armpower.blogs.upv.es 60

Programando GUIs con Java En programas en consola (basados en texto): el programa controla el flujo de la ejecución Los programas con GUI son event-driven la secuencia de eventos controla el flujo de la ejecución Java proporciona las siguientes librerías para la creación de GUIs: Java AWT (Abstract Window Toolkit) Java Foundation Classes (JFC o Swing), a partir de Java2 Pasos para crear una aplicación con GUI usando Tkinter: Importar los paquetes que necesitemos Crear la ventana principal de la aplicación Añadir uno o más elementos gráficos. Crear una instancia de la clase creada armpower.blogs.upv.es 61

Programando GUIs con Java import java.awt.flowlayout; import java.awt.event.actionevent; import java.awt.event.actionlistener; import javax.swing.jbutton; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.jtextfield; import javax.swing.joptionpane; public class EjGUI { //Declaramos los componentes que usaremos: JFrame ventana; JLabel etiqueta; JTextField campo; JButton boton; //constructor de la clase public EjGUI(){ //Instanciamos los componentes que necesitamos: ventana = new JFrame("Ejemplo GUI #3"); etiqueta = new JLabel("Etiqueta de ejemplo #3"); campo = new JTextField(10); boton = new JButton("Botón De Ejemplo #3"); //Configuramos los componentes: //Ponemos una acción de cerrado por default (salir en este caso): ventana.setdefaultcloseoperation(jframe.exit_on_close); //Ponemos el layout: ventana.setlayout(new FlowLayout()); //Añadimos los complentes a la ventana: ventana.add(etiqueta); ventana.add(campo); //10 = Largo del campo ventana.add(boton); //Se llama a pack después de haber agregado componenetes a la ventana ventana.pack(); armpower.blogs.upv.es 62

Programando GUIs con Java //Asociamos manejadores a eventos: boton.addactionlistener(new ActionListener(){ public void actionperformed(actionevent e) { accionesboton(); ); //Mostramos la ventana: ventana.setvisible(true); //del constructor // Método manejador del boton: private void accionesboton(){ JOptionPane.showMessageDialog(null, "Has hecho click en el boton"); public void llenarcampo(string texto){ campo.settext(texto); public static void main(string[] args){ //Llamamos a una nueva instancia de la clase y a un método en la misma: new EjGUI().llenarCampo("Hola a todos!"); armpower.blogs.upv.es 63

IDEs Eclipse NetBeans BlueJ Jdeveloper Etc. armpower.blogs.upv.es 64

sudo shutdown -h now armpower.blogs.upv.es 65