Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Lanwicki 08. 11. 2018, 15:06:57

Název: Sítové programování v Javě
Přispěvatel: Lanwicki 08. 11. 2018, 15:06:57
Zdravím,
jsem začátečník v sítovém programování, ale rád bych docílil následující věci v java fx:

Aplikace na typu icqu - klient se logne -> tím pádem se vytvoří nové vlákno a a zavolá se server.accept(). Ale jakým způsobem docílím toho, aby mohl na tom serveru si psát libovolný klient s jiným klientem už na tom jednom serveru + v Javě FX?

Děkuji
Název: Re:Sítové programování v Javě
Přispěvatel: Phi 08. 11. 2018, 16:27:05
A co je za problém?
Jestli se ptáte jak to udělat obecně - na serveru si udržujte frontu zpráv [kdo, komu, timestamp, text zprávy ] a klienti si jen periodicky zjistí, jestli tam mají zprávu a když tak si ji stáhnou. Až tohle naivní řešení bude fungovat, můžete začít optimalizovat.
Jestli se ptáte na nějaký konkrétní problém, napište čeho se týká?
Název: Re:Sítové programování v Javě
Přispěvatel: Pix 08. 11. 2018, 17:08:31
Co třeba mrknout na nějaký tutorial? Zadat do Googlu něco ve smyslu "java websocket chat"? Dá se toho vymyslet spousta, začít klientem v javafx, přidat webový,...
Název: Re:Sítové programování v Javě
Přispěvatel: David 09. 11. 2018, 08:35:05
Možná byste mohl použít RabbitMQ a máte zprávy vyřešené. Ale je otázka, jestli se chcete učit sockety nebo tak.
Název: Re:Sítové programování v Javě
Přispěvatel: Lanwicki 09. 11. 2018, 13:24:19
Díky za odpovědi.
Upřímně - absolutně začínám se sockety, ale chtěl jsem si dát nějaký cíl, k čemu chci dojít. Nicméně jsem si zkoušel do konzole nějaké věci a nemůžu přijít na jednu záležitost.

Jednoduchý program - Client pošle zprávu, server si ji přečte a kontaktuje VŠECHNY připojené klienty. Má domněka byla, že si třídu Echoer uložím do kolekce a poté budu přistupovat k socketům -> outputstream -> poslat zprávu všem přes for cyklus. Ale bohužel ta zpráva dojde jen k jednomu. Mohl bych poprosit, co je na tom špatně a jak to opravit, aby to dělalo to, co jsem popisoval? Děkuji mnohokrát

Kód: [Vybrat]
public class Main{

public static List<Echoer> echoerList = new ArrayList<>();

public static void main(String[] args) {
    try (ServerSocket serverSocket = new ServerSocket(5000)) {
        while(true){
            Echoer echoer = new Echoer(serverSocket.accept());
            echoerList.add(echoer);
            echoer.start();
            System.out.println("Client connected...");
        }
    } catch (Exception e) {
        System.out.println("SERVER EXCEPTION " + e);
    }
}
}

public class Echoer extends Thread {

private Socket socket;

public Echoer(Socket socket){
    this.socket = socket;
}

public void run(){
    try {
        BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter output;

        while(true){
            String echoString = input.readLine();
            System.out.println("RECEIVED FROM CLIENT " + echoString);

            if(echoString != null){
                System.out.println("SIZE " + Main.echoerList.size());
                for(Echoer e : Main.echoerList){
                    output = new PrintWriter(e.getSocket().getOutputStream(), true);

                    output.println("HELLO!!!!!");
                }
            }
        }
    } catch(Exception e){
        System.out.println("EXCEPTION IN THREAD");
    } finally {
        try {
            socket.close();
        } catch(IOException e){
            System.out.println("EXCEPTION DURING CLOSING!!!");
        }
    }
}

public Socket getSocket(){
    return this.socket;
}
}

public class Client{

public static void main(String[] args) {

    try(Socket socket = new Socket("localhost", 5000)){

        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter stringToEcho = new PrintWriter(socket.getOutputStream(), true);

        Scanner sc = new Scanner(System.in);
        String echoString;
        String response;

        do {
            System.out.println("Enter string to be deechoed");
            echoString = sc.nextLine();

            stringToEcho.println(echoString);

            if(!echoString.equals("exit")){
                response = bufferedReader.readLine();
                System.out.println(response);
            }

        } while(!echoString.equals("exit"));

    } catch(IOException e){
        System.out.println("CLIENT EXC");
    }
}
}
Název: Re:Sítové programování v Javě
Přispěvatel: Phi 09. 11. 2018, 14:38:09
Takže vytvoříte Echoer se Socket jako parametrem. Co ten Echoer s tím dělá dál?  To je vlastní implementace nebo je to odněkud půjčené (nejsou vidět importy).
A jak vypadá client?
Název: Re:Sítové programování v Javě
Přispěvatel: Phi 09. 11. 2018, 14:39:20
Sorry, neodskroloval jsem ten zdrojak.
Název: Re:Sítové programování v Javě
Přispěvatel: Lanwicki 09. 11. 2018, 15:33:10
Takže vytvoříte Echoer se Socket jako parametrem. Co ten Echoer s tím dělá dál?  To je vlastní implementace nebo je to odněkud půjčené (nejsou vidět importy).
A jak vypadá client?

Ano, vlastní implementace. Echoer by měl jen přečíst tu zprávu serveru a rozeslat všem připojeným klientům zprávu. Což se mi nedaří, pošle jen jednomu od koho dostal tu zprávu...
Název: Re:Sítové programování v Javě
Přispěvatel: Pix 09. 11. 2018, 16:46:07
https://stackoverflow.com/questions/39122230/multithreading-echo-server
Název: Re:Sítové programování v Javě
Přispěvatel: Petr 09. 11. 2018, 16:47:50
Ahoj,
Problem nebude v tom, ze by ta serverova cast nic neodeslala, problem bude spise v tom, ze <p>echoString = sc.nextLine();</p> je blokujici volani, takze tokud nezadas vstupni text pro volani teto metody, tak se nedostanes k te casti kodu, kde to nacita ze socketu data. Mozne reseni je prvne zkontrolovat, zda-li jsou k dispozici nejake data ke cteni pred zavolanim zminene metody (napr. InputStream ma metodu available).