Komunikace Klient/Server - 2. díl - Klient

Java Pro pokročilé Komunikace Klient/Server - 2. díl - Klient

Zdravím u druhého dílu minisérie o socketech v Javě. V tomto dílu si vytvoříme klienta pro náš server, který jsme udělali v minulém díle.

A ted už k programování...

Takže si otevřeme náš projekt, ve kterém jsme dělali minule server a vytvoříme si v něm druhou třídu, opět s metodou main(), jménem Client.

Třída klient v Javě

Než začneme programovat klienta, tak si zas naimportujeme potřebné balíčky.

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

V metodě main() si vytvoříme instanci naší třídy Client, kterou pojmenujeme client.

public static void main(String[] args) {
        Client client = new Client();
}

Naší třídě přidáme dva privátní atributy. První se bude jmenovat clientSocket a bude typu Socket, druhý pojmenujeme in s typem Scanner pro načítání zpráv od uživatele.

private Socket clientSocket;
private Scanner in;

Vytvoříme si konstruktor třídy Client, ve kterém si inicializujeme clientSocket. Jako první argument mu při inicializaci předáme adresu, na které běží náš server, v našem případě to je localhost a druhý argument je port, na kterém bude běžet, tedy 8080. Inicializaci obalíme do bloku try – catch – catch.

try {
        this.clientSocket = new Socket("localhost", 8080 );
} catch (UnknownHostException e) {
        e.printStackTrace();
} catch (IOException e) {
        e.printStackTrace();
}

Pod inicializací si necháme vypsat zprávu o úspěšném spuštění klienta a poté si inicializujeme náš Scanner pro načítání dat od uživatele.

System.out.println("Spuštění klienta proběhlo úspěšně.");
this.in = new Scanner( System.in );

Mimo blok try – catch – catch si vytvoříme BufferedWriter, jménem out, pro zapisování dat na server, a jako argument mu předáme výstupní proud z clientSocketu, který získáme zavoláním metody getOutputStream(). A vytvoření BufferedWriteru opět obalíme do bloku try – catch.

try {
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter( this.clientSocket.getOutputStream()));
} catch (IOException e) {
        e.printStackTrace();
}

Vytvoříme si nekonečný while cyklus, který nám bude odesílat data na server. V cyklu si vytvoříme proměnnou temp, do které se budou ukládat zprávy od uživatele načtené metodou nextLine().

while (true) {
        String temp = in.nextLine();
}

Pod načtení zprávy do proměnné vložíme zprávu do BufferedWriteru metodou write() a pak ji jednoduše odešleme metodou flush(). Nakonec si necháme vypsat zprávu o úspěšném odeslání.

out.write(temp + "\r\n");
out.flush();
System.out.println("Zpráva: \"" + temp + "\" byla odeslána.");

Konečný zdrojový kód by měl vypadat takto:

// import potřebných balíčků
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client {

    private Socket clientSocket; // socket pro klients
    private Scanner in; // scanner pro načítání dat od uživatele

    //konstruktor třídy Client
    public Client() {
        try {
            this.clientSocket = new Socket("localhost", 8080); // inicializace client socketu
            System.out.println("Spuštění klienta proběhlo úspěšně."); // zpráva o úspěšném spuštění
            this.in = new Scanner(System.in); // inicializace Scanneru
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter( this.clientSocket.getOutputStream())); //vytvoření BufferedWriteru

            while (true) {
                String temp = in.nextLine(); // proměnná pro ukládání zpráv uživatele
                out.write(temp + "\r\n"); // zapsání zprávy do BufferedWriteru
                out.flush(); // odeslání zprávy
                System.out.println("Zpráva: \"" + temp + "\" byla odeslána."); // oznámení o úspěšném odeslání
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static void main( String[] args ) {
        Client client = new Client(); // vytvoření instance třídy server
    }
}

Když budeme chtít spustit celou naši komunikaci, tak musíme postupně spustit jako první server, a pak až klienta, jinak by to nefungovalo.

Klient a server v Javě

V příští, poslední části, si náš server upravíme tak, aby se na něj mohlo připojit více klientů, než jen jeden.


 

Stáhnout

Staženo 80x (29.28 kB)
Aplikace je včetně zdrojových kódů v jazyce java

 

  Aktivity (1)

Článek pro vás napsal Filip Stryk
Avatar

Jak se ti líbí článek?
Celkem (7 hlasů) :
55555


 



 

 

Komentáře

Avatar
Norislav Brečkay:

Kedy bude 3.Díl ?? :)

 
Odpovědět 17.11.2015 20:47
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na Norislav Brečkay
pocitac770:

Nevím jak ty, ale já vidím hned za tímto 3. díl (úprava serveru)... Kdepak je problém? :-?

Editováno 18.11.2015 0:59
 
Odpovědět 18.11.2015 0:58
Avatar
Bertram
Člen
Avatar
Bertram:

Nevíte jak zde vyřešit diakritiku? Nejen, že se správně nezobrazí, ale při odesílání se to chová nestandartně.

 
Odpovědět 18. srpna 8:35
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na Bertram
pocitac770:

Můžeš odesílat celý text jako posloupnost UNICODE kódů, na ty si jednotlivé znaky převedeš na straně serveru, a u klienta si je převedeš zase zpět na znaky

 
Odpovědět 18. srpna 12:12
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.