Saludos a todos. Antes de poneros el codigo os cuento un poco de que va esta historia. El objetivo es conseguir una comunicación con el servidor a través del protocolo HTTP, es decir, por el puerto 80.
¿Por que haver esto?...se puede utilizar en millones de casos. Los applets se ejecutan siempre dentro de un marco de seguridad denominado 'sandbox'. Entre otras cosas no permite acceder a los recursos de la máquina cliente que alberga finalmente el applet ni realizar conexiones remotas con una máquina que no sea el servidor desde donde se ha descargado el applet.
Si queremos "saltarnos" estas restricciones de seguridad, estamos obligados a firmar digitalmente el applet y el usuario debe admitir este certificado de seguridad para poder usarlo.
Si por cualquier cuestión necesitamos comunicarnos con un servidor una posibilidad es usar como puente nuestro propio servidor. Un applet unicamente permite comunicarse sin problemas con el servidor desde el cual fue descargado mediante una petición GET o POST por el puerto 80.
Podemos por ejemplo comunicarnos con un servlet en el servidor y este a su vez puede hacer llamadas a servicios web o lo que querais y mandar la respuesta hacia el applet.
Lo realmente bueno que tiene esta técnica es que se pueden intercambiar objetos entre cliente (applet) y servidor (servlet) mediante serializacion. Me voy a centrar en este ejemplo. Es un ejemplo muy basico y no contempla por ejemplo el poder pasar parametros en la peticion al servidor.
Código:
//En el lado del cliente, en el applet
//Supongamos objeto implicito es el applet
URL codeBase = this.getCodeBase(); //Devuelve la URL desde donde se //descargo el applet
//Construimos la URL del servlet que procesara la peticion
String protocol = codeBase.getProtocol();
String server = codeBase.getHost();
int port = codeBase.getPort();
String target = "/pruebaServlet";
URL servlet = new URL(protocol,server, port, target);
/*Creamos la conexion con el servidor*/
URLConnection connection = servlet.openConnection();
connection.setDoInput(true); //Permitimos datos de respuesta
connection.setDoOutput(true); //Vamos a enviar datos de salida
connection.setUseCaches(false); //Desactivamos cache por si realizamos //varias comunicaciones
/*Ahora indicamos en la cabecera de la peticion POST que tipos de datos viajan. Vamos a enviar un objeto al servidor asi que enviamos el nombre de su clase. Para poder enviar objetos, estos tienen que ser serializables, es decir, implementar la interfaz Serializable. Para simplificar el ejemplo usaremos por ejemplo Date que es serializable*/
Object obj = new Date();
connection.setRequestProperty("Content-Type", "java-internal/" + obj.getClass().getName());
/*Enviamos la peticion al servidor. Para eso hay que meter el objeto en el flujo de salida de la conexion */
ObjectOutputStream output;
output = new ObjectOutputStream(connection.getOutputStream());
output.writeObject(obj);
output.flush();
output.close();
/*Ahora recibimos la respuesta en el flujo de entrada. Supongamos que se nos devuleve un String*/
ObjectInputStream input = new ObjectInputStream(connection.getInputStream());
Object response = input.readObject();
String str = (String) response;
Este es el codigo del servlet que procesa la peticion. Lo unico que hace es recoger la fecha que le hemos enviada, pasarla a String y devolvernosla como eco. debe llamarse, como hemos construido en la URL, pruebaServlet
p
Código:
ublic class pruebaServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
//Recogemos los datos de la peticion
ObjectInputStream input = new ObjectInputStream(req.getInputStream());
Object dataInput;
dataInput = input.readObject();
Date inputDate = (Date) dataInput;
String response = dataInput.toString();
Object obj = response;
//Especificamos que la respuesta será un objeto serializado
res.setContentType("java-internal/" + obj.getClass().getName());
ObjectOutputStream output = new ObjectOutputStream(res.getOutputStream());
output.writeObject(obj);
output.flush();
output.close();
}
}
Y eso es todo. Espero que os sea de ayuda