Realtime komunikace Java appletů přes firewall – teoretický rozbor

Realtime komunikace Java appletů přes firewall – teoretický rozbor

0

TCP sockety v Javě se často využívají pro obousměrnou komunikaci mezi klientem a serverem, neboť protokol HTTP funguje pouze jednosměrně. Realtime komunikace je nezbytná u serverů, kde je potřeba okamžitá odezva na změny na serveru, například herní, chatové či finanční servery. Problém však nastane při použití firewallu, což se dnes stává stále častěji. Existuje však elegantní řešení, jak naprogramovat realtime komunikaci appletů pomocí HTTP protokolu.

Modelová situace

Pokud v Java appletu či aplikaci použijete TCP/IP socketové spojení, můžete komunikovat se serverem v reálném čase, v němž posílá klient zprávy serveru i server klientovi. Pokud se klient octne za firewallem, nastává problém. Komunikace je znemožněna, protože firewall obvykle propustí pouze HTTP protokol. Ten však neumožňuje obousměrnou komunikaci, server nemůže poslat klientu zprávu, pokud ho k tomu klient sám nevyzve HTTP dotazem.

Pokud chcete služby svého webu umožnit všem uživatelům, musíte nějakým způsobem problém řešit a požadovanou komunikaci zajistit. V komunikaci směrem od klienta k serveru není problém. Když chce klient poslat informaci k serveru vyvolá HTTP dotaz, jako jeho součást (parametr) předá patřičná data, odpověď není důležitá. Jak ale zajistit komunikaci opačným směrem?

Naivní řešení

Nejjednodušší řešení komunikace od serveru ke klientovi lze implementovat tak, že se klient v určitých intervalech (například každých pět sekund) ptá serveru, zda pro něj nemá nějakou novou zprávu.

Tento způsob však degradují dvě vážné nevýhody. První je časová prodleva, ke které nutně dochází, takže se nabízí otázka, zda lze vůbec mluvit o reálném čase. Druhou nevýhodou je zbytečné zatěžování serveru a komunikačních linek v případě, že komunikace neprobíhá. Je zřejmé, že čím menší bude časová prodleva, tím větší bude zatížení serveru a naopak.

Lepší řešení

Naše řešení tyto nevýhody odstraňuje. Server může být implementován například v Javě, C++ nebo PHP, klient bude Java applet. Princip komunikace od klienta k serveru je následující:

1) Klient pošle na server prázdný HTTP dotaz.
2) Server tento dotaz přijme.
3) Pokud je pro klienta přítomna nějaká zpráva, předá mu ji jako odpověď na tento HTTP dotaz.
4) Pokud žádná zpráva není k dispozici, server vyčkává, zda se neobjeví.
5-a) Pokud se objeví, pošle ji (jako v bodě 3).
5-b) Pokud se během delší doby (např. 3 min.) neobjeví, dá klientu vědět, že není k dispozici žádná zpráva (buď tím, že zruší spojení, nebo speciální odpovědí na dotaz).
6) Klient, ať už dostal zprávu nebo ne, posílá okamžitě serveru další HTTP dotaz (viz bod 1).

Na následujícím obrázku vidíte průběh komunikace (čas běží dolů):

Z bodů 3, 5 a 7 je patrné, že nedochází k žádné časové prodlevě (kromě doby nezbytné pro přenos dat). Přitom není server zbytečně zatěžován častými dotazy (timeout z bodu 5b může být nastaven na několik minut, což server rozhodně nepřetíží).

Ještě to popíšeme jinými slovy: Pokud se zprávy generují každé 2 sekundy, jsou touto rychlostí také doručovány na server, pokud se však 2 minuty žádná zpráva neobjeví, 2 minuty žádná komunikace neprobíhá.

Příklad řešení

Řešení, které jsme si dnes popsali, si ukážeme na jednoduchém chatovacím serveru. Server bude naprogramován pomocí PHP a MySQL, klient samozřejmě v Javě. Jelikož se však jedná o rozsáhlý příklad, bude publikován v samostatném článku.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět