Al final no conseguí resolver totalmente los problemas de conexiones de mi cliente de chat. En ocasiones, sin saber muy bien el motivo, al entrar en la página web la conexión no se establecía. Y al dejar la página, google chrome capturaba bien el evento onUnload y desconectaba correctamente, pero internet explorer hacía cosas raras. Aparentemente capturaba el evento y mandaba la desconexión… pero el servidor openfire mantenía la conexión durante un minuto más. En ese tiempo, si intentaba reconectarme con el mismo navegador pero otro usuario, tenía el problema asegurado. Leí en algún sitio que internet explorer abre conexiones permanentes de justo 1 minuto de time out. Suficiente coincidencia como para pensar que mis problemas pueden ir por ahí.
Así que decidí dejar de pelearme con ello (casi una semana) y hacerme yo mismo mi servidor de Chat (sencillo y a medida) usando GWT. De paso paso aprendería a hacer la parte del servidor desde GWT y reaprovecharía el cliente de Chat que ya tenía en GWT, quitando las conexiones con jaxmpp2.
Dicho y hecho, en cuestión de una mañana tenía mi propio chat (sencillo y a medida) funcionando. Me queda pendiente revisar el tema del polling. Ahora mismo mi cliente pregunta una vez por segundo al servidor si hay mensajes nuevos que mostrar. Este mecanismo ya no se usa en los chats porque no es eficiente. En mi caso puede valer porque es un chat limitado a 10 ó 15 usuarios máximo.
Actualmente, en los chats se utiliza algo que se llama BOSH. Básicamente consiste en que el cliente pide datos al servidor y el servidor le deja bloqueada la llamada hasta que haya datos disponibles. Si pasado un tiempo (unos minutos), no hay datos disponibles, salta un timeout que el mismo cliente captura para volver a hacer la petición y quedarse colgado otra vez en espera de datos. Esto no deja de ser un polling, pero con mucho menos tráfico, ya que no es como en mi caso cada segundo, sino que de alguna forma es cada vez que salta el timeout (minutos) o cuando realmente hay datos.
También obliga a abrir dos conexiones. El cliente abre la que hemos comentado para pedir novedades, y abre una segunda cada vez que quiera enviar algo al servidor. En el caso del chat, sería para enviar un texto que ha escrito el usuario o la desconexión. El servidor no devolverá nada en estas peticiones, pero sí lo hará a través de la otra conexión, la de consulta.
GWT lleva algo "raro" parecido a eso, ya que de alguna forma el cliente pide datos pero recupera el control inmediatamente. El resultado le llega a través de un evento que provoca GWT. No he mirado con detalle el mecanismo que hay por debajo y por tanto no lo tengo claro del todo, pero lo apunto para investigar y ver si puedo hacer algo parecido al mecanismo BOSH con GWT.
Y también me gustaría repetir el ciente chat con una librería javascript reconocida (jaxmpp2 para gwt me parece un poco caótica y no sé si se usa mucho), para ver realmente el tema de conexiones y desconexiones con un servidor xmpp de verdad (openfire o ejabberd).