Hálózatkezelés Java-ban
TCP-IP hálózatkezelés Alkalmazási réteg: - alkalmazói programok, kiszolgálók, ügyfelek stb. - Alkalmazás programozható felület (API) OS-Kernel réteg - Transport (átviteli) réteg - Hálózatkezelési réteg - Adatkapcsolati réteg
Szállítási réteg: (TCP Fej+(TCPÜzi:Fej+Üzi)) Alkalmazási réteg: Alkalmazásfüggő protokollok (pl. HTTP) Üzenet+fejrész összeállítása (Fej+Üzi) Szállítási réteg: (TCP Fej+(TCPÜzi:Fej+Üzi)) Két gép közötti kommunikáció Kétféle szolgáltatás (TCP, UDP) Hálózati réteg: (IP Fej+(TCPFej+TcpÜzi)) A csomagok hálózaton keresztüli eljuttatása a célig Routing (üzenet átirányítás) stb. Alsóbb rétegek: Adatkapcsolati réteg Fizikai réteg: bitenkénti átvitel
Hálózati programozás A szállítási rétegben definiált protokollokat implementáljuk DE ENNÉL Egyszerűbb Socket implementálása
SOCKET Foglalat, csatlakozó, lyuk, zokni Absztrakt programozástechnikai fogalom Programok kommunikációját megkönnyítő programozható felület Folyamatok, amelyek kommunikálnak Folyamatok: akár egyazon gépen, akár különböző gépen
SOCKET Kliens-szerver kommunikáció A Socketnek két vége van Kliens oldalon Szerver oldalon Összeköttetés alapú socketek (TCP) Adatfolyam (stream) socket A két fél közötti átviteli csatorna Megbízható kommunikáció Kapcsolatot fel kell építeni A csomagok sorrendje garantált Telefon hálózathoz hasonló Adatfolyam: Dedikált hálózati útvonal Cső, amelyben két irány van, az input és az output
Összeköttetés mentes Socket típusok (UDP) Adatcsomag (datagram socket) Nem eléggé megbízható a szolgáltatás Csomagok elveszhetnek vagy később érkezhetnek Csak szerencse kérdése, hogy egy elküldött csomag megtalálja-e a címzettet Hagyományos levélküldéshez hasonlít
A kommunikáció eszközei Socket (csővezeték) Kommunikáló gépek azonosítása: erre való az IP cím Gépen belül a kommunikáló folyamatok azonosítása: erre való a PORT
PORT 16 bites szám (össz. 65536 db.) „Szabványos” portok (http, ftp) Szabadon használhatók: a 2000 felettiek A hivatkozás módja: IP_CÍM:PORT Pl. 192.168.1.1:13312
Összeköttetés alapú hálózatkezelés A kiszolgáló oldaláról: TCP port lefoglalása Portra rákapcsolódás, üzenetre várakozás Csatlakozás esetén kapcsolat felépítése Üzenetek fogadása és küldése Kapcsolat lebontása Port elengedése
Összeköttetés alapú hálózatkezelés Az ügyfél lépései: Kapcsolódás az kiszolgáló gép adott portjára Ha a szerver aktív, akkor a kommunikációs csatorna felépül Adatküldés, adatfogadás (forgalmazás) Kapcsolat bontása
Összeköttetés mentes hálózatkezelés Kiszolgáló és ügyfél is: Létrehoznak egy UDP kommunikációs portot Ezen keresztül adatcsomagokat küldenek és fogadnak Minden csomagot külön meg kell címezni Lekapcsolódnak a portról
Hálózatkezelés Java-ban Csak összeköttetés alapú hálózatkezeléssel foglalkozunk (de UDP datagramok is vannak…) A java.net csomagban
Kiszolgáló programozása Port definiálása (beolvasandó értékként vagy rögzítetten) Pl. int port=13310; Kiszolgáló foglalat létrehozása: ServerSocket ss; ss=new ServerSocket(port); Ügyfél kapcsolódási kérelmének kezelése: A szerver létrehoz egy összeköttetést (TCP kapcsolatot az ügyféllel) Socket s; while (true) { s=ss.accept(); }
Kiszolgáló programozása A kommunikációs csatorna adatfolyamának lekérése: BufferedReader input=new BufferedReader( new InputStreamReader(s.getInputStream()); PrintWriter output = new PrintWriter (s.getOutputStream); Üzenetváltás a csatornában: request=input.readLine(); output.println(response); output.flush(); Kapcsolatbontás a klienssel s.close(); Hálózatkezeléses üzemmód bontása: ss.close();
Ügyfél programozása A szerver megadása: IP cím: String – névfeloldás automatikus Port: Integer String ipcim=„gamma.ttk.pte.hu” vagy String ipcim=„192.204.13.2” Kapcsolódás a kiszolgálóhoz. Foglalat létrehozása. Socket s=new Socket(ipcim,port);
Ügyfél programozása Elkérjük a kommunikációs csatorna adatfolyamait: BufferedReader input = new BufferedReader( new InputStreamReader(s.getInputStream())); PrintWriter output=new PrintWriter( s.getOutputStream()); Üzenetváltás a csatornában: request=input.readLine(); output.println(response); output.flush(); A kiszolgáló kapcsolat bontása: s.close();
Mi hiányzik még? Hibák kezelése: Kivételkezelés!!!! Megszakad a kapcsolat Foglalt a port Nem létező IP cím Kivételkezelés!!!! A Java megköveteli try-catch-finally szerkezet
Kiszolgáló példa import java.io.*; import java.net.*; public class Szerver { static int port; static ServerSocket ss; static Socket s; static online=1;
public static void main(String args[]){ try{ ss=new ServerSocket(port); }catch(Exception e){} while(online){ try{ s=ss.accept(); kiszolgal();} catch(Exception e){} finally{ try{s.close();} catch(Exception e){} }//while try{ss.close();} catch(Exception e){} }
public static void kiszolgal(){ BufferedReader input= new Bufferedreader( new InputStreamReader( s.getInputStream())); PrintWriter output = new PrintWriter( s.getOutputStream()); /*itt történik a kiszolgálás*/ String be=input.readLine(); output.println(String ki); output.flush(); }
Ügyfél (vázlat) socket s=new Socket(ip_cim,port)… BufferedReader… PrintWriter… input.readLine()… output.println() output.flush()… s.close()…