Hálózatos programok készítése Készítő: Nagy Tibor István
Hálózati kommunikáció Két hálózatra kötött gép a következő rétegeken keresztül kommunikálhat egymással: Alkalmazási réteg http, ftp, telnet, smtp Szállítási réteg TCP, UDP Hálózati réteg IP Adatkapcsolati réteg eszközmeghajtók Forrásgép Alkalmazási réteg HTTP, ftp, telnet, smtp Szállítási réteg TCP, UDP Hálózati réteg IP Adatkapcsolati réteg eszközmeghajtók Célgép
Adatkapcsolati réteg Feladata az adatbitek továbbítása, Átviteli hibák kiszűrése
Hálózati réteg Feladata a hálózatra kötött gépek azonosítása és a köztük történő adatcsere biztosítása A gépeket valamilyen cím alapján azonosítja Ez a réteg nem biztosítja a hibátlan adatátvitelt IP (Internet Protocol)
Szállítási réteg Feladata a megbízható csomagtovábbítás, Illetve egy adott gépen belül a különböző programok azonosítása (port) TCP (Transmission Control Protocol) – összeköttetés-orientált kommunikáció UDP (User Datagram Protocol) – összeköttetés-mentes kommunikáció Nem garantálja a csomagok továbbítását
Alkalmazási réteg Alkalmazás-specifikus protokollok FTP (File Transfer Protocol) HTTP (HyperText Transmission Protocol) SMTP (SendMail Transmission Protocol)
Kliens-szerver architektúra Szerver fogalma: egy hálózatra kötött gépen futó program, amely más – szintén hálózatra kötött – gépek számára biztosít bizonyos szolgáltatásokat Szerver adatai: Hostname : annak a gépnek a hálózati neve, amelyen a szerverprogram fut Port : egy olyan 16 bites szám, amely a futó szervert azonosítja; ezen keresztül fogadja a szerverprogram a kéréseket
Portok A szerverprogram adja meg, hogy melyik porton keresztül hajlandó a kliensektől kéréseket fogadni Van egy szabványos lista, amelyben a már létező szolgáltatások és a hozzájuk rendelt portok találhatók A hozzárendelt portok listája: http://www.iana.org/assignments/port-numbers Pl.: HTTP port = 80 IMAP port = 143
Kliens-szerver architektúra Kliens fogalma: egy hálózatra kötött gépen futó program, amely igénybe veszi egy másik gépen futó szerverprogram szolgáltatásait A kliensnek ismernie kell a szerver hostnevét és portszámát
Kliens-szerver architektúra TCP protokollal Összeköttetés-orientált kommunikáció A kommunikáció kezdeményezésekor létrejön a kapcsolat a szerver és kliens közt A kapcsolat a kommunikáció befejezéséig él Garantált az adatok eljutása a feladótól a címzettig Garantált az adatok helyes sorrendje
Kliens-szerver architektúra TCP protokollal A kommunikáció fájl-streamek segítségével történik Mindkét oldalon van egy-egy bemeneti, ill. egy-egy kimeneti stream A szerver és a kliens oldalon is van egy-egy csatoló (socket); ezt a két csatolót kötik össze a streamek
Kliens-szerver architektúra (TCP) output input Server- Socket Socket Szerver input Kl iens output
Szerverprogram elkészítése (TCP) A következő osztályokat kell használni: ServerSocket – a szerver csatolója Socket – a kliens csatolója Bemeneti és kimeneti adatfolyamok
Szerverprogram elkészítése (TCP) Létre kell hozni a szerver csatolóját: ServerSocket ss = new ServerSocket(port); port = bármilyen portszám. Ha 0, akkor kiválasztja az első szabad portot Várakozni kell egy kliensre: Socket client = ss.accept(); Létrehozni a streameket: … in = client.getInputStream(); … out = client.getOutputStream(); Adatforgalom (readLine(), println() !)
Szerverprogram több klienssel (TCP) Több kliens kéréseinek kiszolgálása: A bejelentkező kliensekkel történő adatcsere egy-egy külön szálban történik Miután az accept() metódussal lekérdeztük a bejelentkezett klienst, kéréseit egy újonnan létrehozott szálban szolgáljuk ki Miközben az új szál foglalkozik a bejelentkezett klienssel, a szerver tovább várja egy újabb kliens jelentkezését
Kliensprogram elkészítése (TCP) Szükséges osztályok: Socket – a kliens csatolója a szerver felé Bemeneti és kimeneti adatfolyamok – a kliens és a szerver közötti adatforgalom lebonyolítására
Kliensprogram elkészítése (TCP) Kliens csatolójának létrehozása: Socket cs = new Socket(hostname, port); Filecsatornák lekérdezése: … in = cs.getInputStream(); … out = cs.getOutputStream(); Adatforgalom (readLine(), println() !)
Kliens-szerver architektúra UDP protokollal Összeköttetés-mentes kommunikáció Nincs állandó összeköttetés a feladó és címzett között Az adatok megérkezése nem garantált a feladótól a címzettig Az adatok helyes sorrendje sem garantált Egymástól független adatcsomagok elküldésére / fogadására alkalmas
Kliens-szerver architektúra (UDP) Datagram- Socket Datagram- Socket Kl iens Szerver
Szerverprogram elkészítése (UDP) A következő osztályokat kell használni: DatagramSocket – a szerver csatolója DatagramPacket – a fogadni, vagy elküldeni kívánt adatcsomag
Szerverprogram elkészítése (UDP) Csatoló létrehozása: DatagramSocket ds=new DatagramSocket(port); Várakozás egy kliens jelentkezésére: DatagramPacket dp; dp=new DatagramPacket(buf,buf.length); ds.receive(dp); Kliens azonosítása: InetAddress ia=dp.getAddress(); int port=dp.getPort(); Válasz küldése a kliensnek: dp=new DatagramPacket(buf, buf.length, ia, port); ds.send(dp);
Kliensprogram elkészítése (UDP) Szükséges osztályok: DatagramSocket – a kliens csatolója DatagramPacket – a fogadni, vagy elküldeni kívánt adatcsomag
Kliens elkészítése (UDP) Csatoló létrehozása: DatagramSocket ds=new DatagramSocket(); Szerver címének megadása: InetAddress ia=InetAddress.getByName(host); Kérés küldése a szervernek: dp=new DatagramPacket(buf, buf.length, ia, port); ds.send(dp); Válasz fogadása a szervertől: dp=new DatagramPacket(buf, buf.length); ds.receive(dp);
Multicast program készítése A multicast szerver nem várakozik egy kliens bejelentkezésére Egy meghatározott csoportcímre, meghatározott porton keresztül küldi a csomagokat A multicast kliens nem jelentkezik be a szerverhez A szerver portját figyelve várja a szervertől érkező üzeneteket
Multicast szerverprogram elkészítése (UDP) Csoportcím megadása: InetAddress ga=InetAddress.getByName(csop); Csomag elküldése a csoport minden tagjának: DatagramPacket dp; dp=new DatagramPacket(buf, buf.length, ga, port); ds.send(dp);
Multicast kliensprogram készítése (UDP) Az üzenetek fogadása MulticastSocket-en keresztül történik: MultiCastSocket ms=new MulticastSocket(port); A csoport címének meghatározása: InetAddress ga=InetAddress.getByName(csop); Csatlakozás a csoporthoz: ms.joinGroup(ga); Adatok olvasása a szervertől ciklusban: ... ds.receive(dp); ... Lecsatlakozás a csoportról: socket.leaveGroup(ga);