www.www.zaachi.com » Blog/Java » Java: Síťová komunikace

Komunikovat mezi dvěma aplikacemi pomocí TCP socketů je v Javě velmi jednoduché a často využívané. V článku si ukážeme základy takové komunikace a vytvoříme si základní příklad, demonstrující aplikaci Klient-Server.
V Javě existují dvě základní možnosti jak mezi aplikacemi komunikovat na IP vrstvě.
Příjemné je, že jejich podpora je přímo součástí standardních knihoven.
Abychom identifikovali aplikaci na daném počítači, ke kterému se chceme připojovat, musíme počítače nějakým způsobem odlišit. V tomto případě je každé spojení charakterizováno IP adresou a portem, na kterém daná aplikace běží (server) nebo ke kterému se snaží připojit (klient).
Dále se nebudeme věnovat nepotvrzovanému UDP, ale pouze potvrzovanému TCP spojení, které je častěji používané.
Po spojení klienta a vytvoření jakési pomyslné cesty mezi serverem a klientem a můžeme mezi oběma aplikacemi komunikovat. Komunikace probíhá pomocí čtení a zápisu mezi datovými proudy.
Vytvořená aplikace se bude rozdělovat na část Server a Klient.
Náš server, který si vytvoříme bude schopen komunikovat, tedy konkrétně bude schopen zobrazit data, která mu bude klient posílat.
Server vytváří novou instanci třídy ServerSocket, na určitém portu, který bude pro komunikaci používat. IP adresa, na kterém server poběží, je IP adresa daného počítače. Pro testování budete používat u klienta Loop-back IP 127.0.0.1 (logická smička, která representuje lokální počítač), na této IP adrese pojede i server, na stejném počítači:
ServerSocket sSocket=new ServerSocket(port);
Port je integer proměnná a representuje číslo portu, na kterém server bude komunikovat (přijímat a odesílat požadavky).
Tímto je vytvořen nový ServerSocket, ke kterému je možné se připojit, ovšem bez dalších funkcí. Pro čekání na připojení klienta využijeme funkci accept, která čeká na spojení s klientem a takovém úspěšném spojení vytváří proměnnou typu Socket, jež representuje konkrétní aktuální spojení s klientem:
Socket socket=sSocket.accept();
V tuto chvíli máme navázáno spojení s klientem a vytvořenou proměnnou typu Socket, reprezentující celé spojení. Ze socket proměnné můžeme lehce číst díky vytvoření InputStreamu, který proměnná může uvolnit:
BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
Proměnná reader, typu BufferedReader, už umožňuje přímo klasické čtení, například pomocí readLine():
while ((request=reader.readLine())!=null){
try {
System.out.println(request);
}
catch (NumberFormatException e) {
return ;
}
}
Proměnná reqeust je typu String a je do ní postupně ukládán řádek dat (textu), které klient odesílá. Celé spojení, a vlastně celý server, ukončíme pomocí metody close()
if (!sSocket.isClosed())
sSocket.close();
Tím je hotová celá serverová část, která je schopna obsloužit pouze jednoho klienta. Abychom mohli obsluhovat klientů více, můžeme celý proces spouštět v nekonečné smyčce.
Zdrojový kód celé serverové částí si můžete stáhnout zde: Server.java.txt
Pokud máme zpracovanou serverovou část, můžeme přejít ke klientské. Klient bude fungovat tak, že se pokusí navázat spojení se serverem na dané IP adrese a portu. Po spojení načte soubor s textem a tyto data odešle na server, který je zpracuje a vypíše.
Klient vytváří instanci třídy Socket, jehož parametry jsou IP adresa a port, na kterém čeká server na spojení (pro Loop-back to bude 127.0.0.1, jak jsem již zmínil u serverové části):
Socket socket = new Socket("127.0.0.1", port);
Další operace fungují podobně jako u serverové části. Proměnnou socket jsme u serverové částí dostali pomocí metody accept, u klientské částí ji máme rovnou ze spojení.
U klientské částí, abychom mohli odesílat, musíme vytvořit PrintWriter, pro odesílání dat:
PrintWriter writer = new PrintWriter(socket.getOutputStream());
Jak bylo napsáno dříve, klient načte soubor s textem a ten odešle, takže dopíšeme otevření a načtení souboru. Data budeme odesílat pomocí vytvořeného PrintWriteru:
writer.println(line); writer.flush();
Celé zpracování a odeslání souboru může vypadat například takto:
BufferedReader reader = new BufferedReader(new InputStreamReader( input));
String line;
//v cyklu odesle data
while ((line = reader.readLine()) != null) {
writer.println(line);
writer.flush();
}
Proměnná input je typu string a representuje cestu a název textového souboru pro odeslání.
Klienta a celé spojení ukončíme pomocí metody close:
writer.close();
Celou klientskou část si můžete prohlídnout zde: Client.java.txt
Toto je základní práce se síťovkou komunikací, kterou můžete v javě používat. Při troše přemýšlení jde tento ukázkový příklad velmi jednoduše předělat na jednoduchou aplikaci pro posílání zpráv mezi dvěma počítači, popřípadě přidělat obsluhu více klientů a obsluhovat je samostatně.
Jednoduché grafické rozhraní, které bylo použito u příkladu si můžete stáhnout zde: GUI.java.txt

Autor: Zaachi
Publikováno: 21.10.2008 00:14:27
Java a základy GUI
Java a základy GUI #2
Java a základy GUI #3
Java a základy GUI #4