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

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

Zdravím vás u minisérie asi tří Java tutoriálů, ve kterých si ukážeme, jak vytvořit jednoduchou komunikaci Klient/Server. Já budu používat jako IDE Intellij Idea, ale vy můžete používat jakékoliv jiné, jako Eclipse nebo Netbeans. Nebude to nic těžkého, takže nemějte strach.

Co budeme potřebovat?

Budeme si muset vytvořit server, který bude naslouchat nějakému portu a k tomu si vytvoříme klienta, který bude odesílat data na ten určitý port, kterému server naslouchá. Využijeme k tomu TCP protokol. Kromě TCP protokolu existuje ještě UDP protokol, ale ten není tak spolehlivý.

A teď už k samotnému serveru...

Jako první si vytvoříme server. Klienta uděláme v dalším dílu. Vytvoříme si nový projekt, který si můžete pojmenovat podle libosti, já si ho pojmenuji Sockety. V projektu si vytvořte třídu Server s metodou main().

Otevřený strom projektu se Serverem.

Ještě než začneme psát program, tak si do třídy naimportujte tyto balíčky:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

Nejprve si vytvoříme v metodě main() instanci třídy Server jménem server. Pak si naší třídě přidáme privátní atribut jménem serverSocket typu ServerSocket a vytvoříme si konstruktor. V konstruktoru si inicializujeme serverSocket a jako argument mu předáme port, kterému bude server naslouchat, v mém případě to bude port 8080. Za inicializaci si přidáme výpis, že byl server úspěšně spuštěn. Inicializaci obalíme do bloku try – catch.

public Server() {
        try {
                this.serverSocket = new ServerSocket(8080);
                System.out.println("Spuštění serveru proběhlo úspěšně.");
        } catch (IOException e) {
                e.printStackTrace();
        }
}

V tomtéž try- catch bloku si vytvoříme socket pro klienta, jménem clientSocket, zavoláním metody accept() na serverSocketu. Jelikož je metoda accept() blokovací, tak nám zastaví běh programu dokud se nepřipojí klient. Díky tomu si můžeme pod vytvořením clientSocketu nechat vypsat zprávu, že se klient připojil. Ve zprávě si vypíšeme i adresu, ze které se klient připojil. Tu získáme metodou getInnetAdress(), která vrací objekt InnetAdress, ze kterého metodou getHostAdress() získáme adresu klienta.

Socket clientSocket = this.serverSocket.accept();
System.out.println("Klient se připojil z adresy " + clientSocket.getInetAddress().getHostAddress() + ".");

Vytvoříme si BufferedReader s názvem in, kterému předáme vstupní proud ze socketu klienta zavoláním metody getInputStream() na clientSocketu.

BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

Nyní si vytvoříme nekonečný while cyklus. V cyklu si vytvoříme proměnnou typu String s názvem temp, do které uložíme data od klienta zavoláním metody readLine() na BufferedReaderu. Nyní zbývá už jen vypsat zprávu od klienta, které je uložená v proměnné temp.

while (true) {
    String temp = in.readLine();
    System.out.println( temp );
}

Tak a jednoduchý server máme hotový. Konečný zdrojový kód by měl vypadat takto:

package cz.leaf.tutorial.itnetwork.java.sockety;

// import potřebných balíčků
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    // privátní atribut serverSocket
    private ServerSocket serverSocket;

    // konstruktor třídy Server
    public Server() {
        try {
            this.serverSocket = new ServerSocket(8080); // inicializace ServerSocketu
            System.out.println("Spuštění serveru proběhlo úspěšně."); // vypsání hlášky při úspěšném spuštění k serveru
            Socket clientSocket = this.serverSocket.accept(); // vytvoření socketu pro klienta
            System.out.println("Klient se připojil z adresy " + clientSocket.getInetAddress().getHostAddress() + "."); // vypsání zprávy o připojení klienta
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()) ); // vytvoření BufferReaderu, se vstupním proudem se socketu klienta

            // nekonečný while cyklus pro vypisování zpráv od klienta
            while (true) {
                String temp = in.readLine(); // načtení zprávy od klienta do proměnné temp
                System.out.println(temp); // vypsání zprávy klienta z proměnné
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

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

Pokud si ho teď spustíme, tak by se nám měla vypsat hláška, že se úspěšně spustil.

Server pomocí socketů v Javě

Příště si uděláme klienta. Zdrojové kódy, včetně spustitelného *.jar souboru máte ke stažení pod článkem.


 

Stáhnout

Staženo 97x (18.31 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 (11 hlasů) :
4.636364.636364.636364.636364.63636


 


Miniatura
Předchozí článek
Spring - Transakce v Javě
Miniatura
Všechny články v sekci
Java - Pro pokročilé

 

 

Komentáře

Avatar
paja
Člen
Avatar
paja:

Ahoj diky moc za nazorne vysvetleni. Zkousel jsem to v eclipse a jede to skvele :)

Editováno 14.12.2014 20:03
 
Odpovědět 14.12.2014 20:03
Avatar
Mára
Člen
Avatar
Mára:

a co když bych chtěl komunikovat synchronně ?? a předávat zprávy formou XML ? nějak na to nemohu přijít. děkuji za odpověď

 
Odpovědět 25.2.2015 19:50
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 2 zpráv z 2.