Nedávno jsem do školy na předmět počítačové sítě (Y36PSI) měl za úkol vytvořit program, který umožní přenos souboru. Jak klientskou část tak i serverovou. Nu a jelikož by to mělo běhat obecně pod jakýmkoliv systému, rozhodl jsem se to naprogramovat v Javě. Zde zdrojové kódy serveru a clienta.
Pro práci s Javou vřele doporučuju NetBeans. Pojďme se podívat jak jsem se s tím popral.
je celkem jednoduchý. Připoji se na danou IP adresu a Port , které dostane z přikazové řádky jako argument, spolu se souborem který má být přenesen. Nu po připojení odešle název souboru a jeho velikost v bytech, který bude přenášet. Vyčká zda-li to server, schválí, tj. odpoví OK. Pak začne s přenosem dat a po přenesení dat se ukončí.
Po rozbaleni zdrojových kódu naleznete 4 soubory.
zde se celkem nic neděje, jen prostě načteme z přikazové řádky port, ip adresu serveru na který se chceme přípojit a dále cestu k souboru který chceme přenest. Poté vytvoříme nového klienta, kterému předáme ony informace.
to je srdíčko našeho programu klienta. Jak vidíte implementuje (dědí) z Runnable , tudíž musí obsahovat metodu public void run() Jak tedy vidíme, klient si vytvoří v konstruktoru vlastní thread a jakousi instanci třídy TransferReader, která ma zaučel načítat data ze souboru a vracet jako pole bytu, podrobněji se tím budeme zabývat později.
Nejdůležitejsí pro nás je teda metoda run , v ní nejprve zkontrolujeme soubor, zda-li se ho povedlo otevřít, poté si incializujeme promenně které budeme potřebovat, jako např. Socket ke připojení k serveru, BufferedReader pro čtení a BufferedWriter pro zápis do socketu(odesílání a příjmaní ). Nu odešleme název souboru a jeho délku. Pak následuje nekonečná smyčka v které je jedna větev pro čtení zda-li server akceptuje náš požadavek a druhá pro vlastní odesíláni dat ze souboru.
Na závěr po sobě vše uklidime a ukonči se thread.
dědí z TransferBase, která je stejná jak pro Server tak pro klient. Pomocí této třidy se prostě jen načítají data ze souboru,který dostane v konstructoru. Případně se detekujou chyby.
Je základní třída, která drží data o souboru, jeho délky a aktualní pozice, v souboru. Nic víc to celkem neumí.
je o něco složitejší, ale jen nepatrně. Server po spuštění nastartuje a poslouchá na daném portu. Jakmile se k němu připojí klient, vytvoří pro něj thread a sám pokračuje v poslouchání na případné další klienty. No pro každého klienta se pak v onom threadu (vláknu) čeká až klient pošle zprávu obsahující informace o nazvu souboru a jeho velikosti. Server toto následně potvrdí zprávou obsahující OK. Nu a pak ukládá daná dana od klienta, až do velikosti kterou obdržel, nebo pokud se klient neodpojí. Následně ukončuje spojení s klientem, uzavíra socket atd.
Soubory a jejich naprogramování vysvětlím později.