May 20

Y finalmente, haciendo un servidor de chat (III)

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).

May 13

Tutorial de java ee

Con el tema de JSF, estoy leyendo poco a poco, en las idas y venidas en tren al trabajo, el tutorial de java ee de sun. No, no te asustes, no me estoy leyendo las mil y pico páginas. Sólo el capítulo de JSF.

Las primeras páginas del capítulo me parecieron más o menos bien. No tenía ni idea de JSF y leyendo me he ido enterando. Pero según avanzo en el capítulo, cada vez me gusta menos el tutorial. Me da la impresión de que van repitiendo una y otra vez lo mismo, a base de pinceladas, pero dando en cada repetición alguna pincelada más. Por llevarlo de forma más cómoda, imprimo treinta o cuarenta hojas, sin encuadernar de ninguna forma y voy leyendo. En más de una ocasión me ha dado la impresión de haberme equivocado de hoja al leer, porque lo que leo me suena haberlo leído ya palabra por palabra. Y resulta que no, simplemente vuelven a repetirlo más adelante y le añaden algo más, un poco más de detalle.

En fin, empieza a resultar repetitivo y algo pesado. Creo que voy a ir saltando a aquellas partes que más me interesen o de las que todavía no he leído nada y dedicarme más a jugar con eclipse, tomcat y compañía.

May 07

Jugando con JSF

Desde que ando haciendo páginas web en el curro, estoy tocando bastantes cosas nuevas: Geoserver, Openlayers, jaxmpp2, jQuery…. Y todo ello a base de ensayo y error y poco leer.

Así que me he decidido a bajarme la parte del tutorial de jee que habla de JSF y estoy en ello (el portal que estamos desarrollando va sobre Tomcat y lleva programación con JSP y demás).

La verdad es que me está gustando bastante lo de JSF. Había hecho alguna página con JSP a pelo y estaba bastante cansado de andar mezclando html con java o haciendo salidas html desde clases java. Sabía que las tag libraries de JSP podían ayudar a evitar estas mezclas y los frameworks como structs también, pero siempre me han dado pereza. Todo este tipo de frameworks web me parecen en general complejos y se me hacen muy cuesta arriba las configuraciones complejas con XML.

Y cuando me he puesto a leer JSF y entender más o menos cómo va, he visto que no solo no es complejo, sino que en realidad es incluso bastante más sencillo que no usarlo. Y haciendo algunos ejemplos y jugando un poco, veo que es muy cómodo y productivo, las mismas cosas que antes con JSP y java puro y duro tardaba una día o una tarde entera en hacerlas, puedo hacerlas ahora en cuestión de minutos. Por ejemplo, una tabla web en la que se puedan borrar filas o añadir nuevas con un formulario es una tarea bastante habitual, que en JSP y java puede llevar un rato largo haciendo bucles para la tabla, peleándose con ids de las filas en el html, recogida de parámetros del formulario en los jsp, etc. Sin embargo, con jsf, no te preocupas de nada de eso, ni siquiera de hacer el bucle. Es más, la validación de los campos escritos por el usuario en JSF es casi inmediata, mientras que con JSP a pelo hay que hacerla en el lado del servidor … o usar javascript aparte.

En fin, que sigo aprendiendo JSF y me está gustando bastante, me parece sencillo y elimina en gran parte la "fealdad" del html mezclado con código java o viceversa. Supongo que más adelante tendré que echar un ojo a otras implementaciones como RichFaces, MyFaces, IceFaces,….