Porque usamos sockets? En los sockets dos programas establecen conexión y se envían mensajes. Estos mensajes pueden ser cualquier clase java que implemente la interface Serializable En rmi un programa (cliente) le pide al otro (servidor) una instancia remota (objeto remoto) de una clase y luego llama a sus métodos. Los métodos, aunque son llamados en el código del cliente, se ejecutan en el servidor. Los parámetros que se pasan a los métodos y el resultado devuelto deben ser clases que implemente Serializable o tipos primitivos de datos. Ventajas e inconvenientes Codificación: El establecimiento de la conexión es similar en número de líneas de código en ambos casos (un par de líneas). o Los sockets necesitan más código para identificar qué mensaje llega y tratarlo en consecuencia (sentencias switch-case o tantos if como tipos de mensaje distintos). En rmi se hace con llamadas a métodos, por lo que no es necesario ningún tipo de codificación adicional. o En rmi se necesitan una serie de herramientas adicionales, compilar los objetos remotos además de con javac con rmic y finalmente tener lanzado el programa rmiregistry. o En los sockets se envía un mensaje y se debe esperar por la respuesta, que puede llegar o no. Las lecturas de mensajes dejan bloqueado el hilo hasta que llegan. En rmi la llamada queda bloqueada hasta recibir la respuesta. En ambos casos suele ser necesario el uso de hilos si las respuestas pueden tardar. Ancho de banda: En los sockets, por la red sólo se envían los mensajes que nosotros enviamos. En rmi, se envía además todo el protocolo interno de rmi, que suele ser de un tamaño considerable. En general, rmi consume más ancho de banda de nuestro enlace físico que los sockets. Comunicación con otros lenguajes: rmi es puramente java, así que sólo puede integrarse entre dos programas java. Con sockets podemos comunicarnos con cualquier otro programa hecho en cualquier otro lenguaje, aunque tendremos que enviar los mensajes campo a campo para hacerlos compatibles con el otro lenguaje. Mensajes en broadcast. Los sockets permiten enviar mensajes sin destinatario, de forma que cualquiera puede recogerlo. Con rmi la comunicación siempre es punto a punto. Carga dinámica de clases. Rmi permite la carga dinámica de clases, es decir, el servidor puede pasar al cliente clases que este no tenga en su CLASSPATH en tiempo de ejecución y viceversa. Esto hace que ampliar dinámicamente el comportamiento de una aplicación rmi sea más sencillo. Cuándo usar sockets y cuándo usar rmi Si nuestro enlace físico es lento (puerto RS232, modem, etc) es mejor usar sockets. Si tenemos pocos tipos de mensajes y se usan para transmitir muchos datos (por ejemplo, transferencia de ficheros), es mejor sockets. Si el servidor ofrece muchas funcionalidades, es mejor rmi. Si la aplicación servidor va a modificarse con cierta frecuencia y no queremos tener que actualizar todos los clientes uno a uno, la carga dinámica de clases de rmi puede ser una solución.