Creador y propietario de AdictosAlTrabajo.com, Director General de Autentia S.L., Ingeniero Técnico de Telecomunicaciones y Executive MBA por el Instituto de Empresa 2007.
Twitter: Follow @rcanalesmora
Autor de los Libros: Planifica tu éxito: de aprendiz a empresario y Informática profesional, las reglas no escritas para triunfar en la empresa
Puedes consultar mi CV y alguna de mis primeras aplicaciones (de los 90) aquí
Fecha de publicación del tutorial: 2003-11-06
Comunicación entre Applets y Servlets
Nos ha realizado muchas consultas sobre la comunicación entre applets y servlets.
Un applet y un servlet se pueden comunicar de muchos modos (sockets, RMI, corba, etc) aunque el modo más sencillo de hacerlo es a través de peticiones HTTP.
Preparación
Primero, vamos a crear un applet básico. Este applet lo hemos creado a través de NetBeans por lo que podéis encontrar algunas partes del código o comentarios en inglés.
|
/* |
Como podéis observar, en depuración, el código anterior lo único que hace es mostrar un pequeña ventana donde al introducir un texto en la parte superior y pulsar el botón, muestra un texto en la parte de inferior y un mensaje en la barra de estado.

Para poder probar nuestro programa de un modo efectivo, debemos crear una página HTML y colgarla de un servidor Web.
| <html> <body> <p align="left"> <applet width="400" height="300" code="roberto.appletsimple.class" codebase="./">Applet que se comunica con servlet</applet> </p> </body> </html> |
El aspecto de nuestra página en el navegador es:

Ahora, vamos a crear el servlet que se ejecutará en el servidor. Este servlet solamente se encarga de recoger los parámetro que recibe en la petición Get o Post y genera una página de respuesta mostrándolos.
| /* * servletsimple.java * * Created on November 5, 2003, 11:38 PM */ import java.io.*; import java.net.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; /** * * @author Roberto Canales * @version */ public class servletsimple extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Servlet</title>"); out.println("</head>"); out.println("<body>"); Enumeration e = request.getParameterNames(); while(e.hasMoreElements()) { String s_clave = e.nextElement().toString(); String s_aux = request.getParameter(s_clave); out.println("<br>El parámetro: <B>" + s_clave + "</B> vale: <B>" + s_aux + "</B>"); } out.println("</body>"); out.println("</html>"); out.close(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } } |
Podemos ver la petición y la respuesta en la siguiente pantalla.

Insertar código comunicaciones
Ahora lo único que nos queda en modificar el código del applet para hacer la petición HTTP al servidor. Esta versión del código os muestra como hacerlo a través de POST pero podéis ver que también está dentro del código la gunción para hacerlo a través del comando GET.
peticionPost(s_textoaenviar)
Vamos a comentar las funciones más significativas (por ejemplo con la fucnión GET):
Primero, recuperamos el Host del que descargamos el Applet
String host = this.getCodeBase().getHost();
Posteriormente, debemos codificar los caracteres especiales al juego compatible con HTTP ()
String peticion = "/servlet/servletsimple?param1=" + URLEncoder.encode(mensaje);
Generamos la URL que representa el recurso a recuperar (en este caso el servlet)
miurl = new URL(getCodeBase(),peticion);
Ahora conectamos con el recurso
InputStream buffer = miurl.openStream();
|
/* |
Y el resultado es

Sencillo verdad .....
Serialización de comunicaciones
Una vez que sabemos hacer esto, podemos utilizar una petición POST de un modo un poquito especial .....
serializando la llamada entre el cliente y el servidor y de este modo, enviar y recibir objetos completos.
Hacemos un pequeño cambio, primero en el Applet, donde vamos a enviar un array
| // enviamos la peticion por post String peticionPost(String mensaje) { URL miurl = null; String cadenaaux = null; String cadenaretorno = ""; String consulta = "param1=" + URLEncoder.encode(mensaje); try { String host = this.getCodeBase().getHost(); String peticion = "/servlet/servletsimple"; miurl = new URL(getCodeBase(),peticion); URLConnection conexion = miurl.openConnection(); conexion.setDoOutput(true); ObjectOutputStream buffersalida = new ObjectOutputStream(conexion.getOutputStream()); //buffersalida.write(consulta); int array[] = new int[10]; for(int i=0;i<array.length;i++) { array[i] = i*3; } buffersalida.writeObject(array); buffersalida.flush(); BufferedReader bufferentrada = new BufferedReader(new InputStreamReader(conexion.getInputStream())); String linea = null; while ((linea = bufferentrada.readLine()) != null) { cadenaretorno += linea; } buffersalida.close(); bufferentrada.close(); } catch (Exception e) { return "Error al generar url " + e.getMessage(); } return cadenaretorno; } |
Y ahora cambiamos el servlet
| protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Servlet</title>"); out.println("</head>"); out.println("<body>"); /* Enumeration e = request.getParameterNames(); while(e.hasMoreElements()) { String s_clave = e.nextElement().toString(); String s_aux = request.getParameter(s_clave); out.println("<br>El parámetro: <B>" + s_clave + "</B> vale: <B>" + s_aux + "</B>"); } */ try { ObjectInputStream bufferentrada = new ObjectInputStream(request.getInputStream()); int[] arrayRecuperado = (int[])bufferentrada.readObject(); for(int i=0;i<arrayRecuperado.length;i++) { out.println("El valor recuperado del elemento " + i + " es " + arrayRecuperado[i]); } } catch(Exception e) { out.println("Error al recuperar datos"); } out.println("</body>"); out.println("</html>"); out.close(); } |
Y en el sentido contrario..... es exactamente lo mismo ........
Esto es impresionante..... imaginaos lo rápido que es el desarrollo. Además, cuando nos cuentan sobre nuevas tecnologías de interacción Web, como Web Services ...... tampoco nos asusta tanto
Proxys y autentificación
Por cierto, si tenéis proxy ..... hay que establecer unas propiedades
| System.setProperty("proxyHost",
"host");
System.setProperty("proxyPort", "puerto"); |
Y si tenéis seguridad (autentificación simple) en el servidor, debéis añadir unas líneas a vuestro objeto URLConnection :
| conexion.setRequestProperty( "Authorization","BASIC
" + passwordencriptadaenbase64); conexion.setRequestProperty("content-type", "text/html"); |
De todos modos, debéis tener en cuenta donde usar los applets .... Yo os recomendaría restringirlos a Intranets.
A continuación puedes evaluarlo:
Fecha publicación: 2009-05-04-07:41:59
Autor:
Fecha publicación: 2009-04-28-07:22:09
Autor:
Fecha publicación: 2009-04-09-05:15:31
Autor:
Fecha publicación: 2009-04-07-06:02:50
Autor:
Fecha publicación: 2006-10-17-11:25:00
Autor:
Fecha publicación: 2006-09-26-09:40:55
Autor:
Fecha publicación: 2006-08-11-08:52:00
Autor:
Fecha publicación: 2006-06-07-08:05:08
Autor:











