En el artículo anterior, vimos la arquitectura del sistema; en este vamos a explorar la capa Conexión.
Para comenzar, recordemos que la responsabilidad de esta capa es comunicar al cliente y al servidor mediante la red. La capa conexión que se va a implementar va a ser sobre TCP/IP, pero el diseño permite que se pueda implementar sobre otros protocolos.
Acá va el diagrama de clases (en UML):

Diseño de la capa Conexión
Como se puede ver, el diseño es bastante sencillo. El principal servicio de esta capa, lo provee la clase Conection con el método send(ConnectionPacket p). La clase ConnectionPacket, no es otra cosa que la unidad de trabajo de esta capa. En general, todas las capas van a tener su packet.
Cuando un paquete llega a la clase Connection, esta notifica de la llegada del mismo mediante el evento connectionPacketArrived de la interfaz ConnectionPacketListener. Se da una suerte de patron Observer. Notar que la clase Connection es un Thread, así puede atender y autónomamente los paquetes que llegan.
Acá presentamos el diagrama de secuencia para el envío y llegada de un paquete desde el cliente:

Envío y llegada de un mensaje
En el servidor ocurre algo similar, cuando llega un paquete a la clase Connection, se notifica al ConnectionPacketListener para que procese el mensaje. Si corresponde una respuesta, se enviará de la misma forma que en el cliente. La idea es que la clase Connection sea la misma tanto para el lado del cliente como para el lado del servidor.

Recepción de un mensaje en el servidor
El último caso que queda ver es qué sucede cuando una petición de conexión de un nuevo cliente. Acá es donde entran en juego la clase ServerConnection y la interfaz ConnectionListener.
La clase ServerConnection es responsable de escuchar por conexiones y cuando llega una, notifica mediante el evento newConnection(Connection c) de la interfaz ConnectionListener. Entonces, cuando llega una nueva conexión al servidor, el implementador de newConnection va a crear una nueva Connection para atender al nuevo cliente.
A grandes rasgos, esta es la capa Conexión. A la hora de implementar aparecen algunos detalles de sincronización de threads y manejo de sockets, pero nada del otro mundo.
Es importante comprender el mecanismo del eventos ya que se utiliza en todas las capas del RPC.
En el próximo artículo estaremos analizando la capa Sesión.
