Sítové programování v Javě

Lanwicki

Sítové programování v Javě
« kdy: 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


Phi

Re:Sítové programování v Javě
« Odpověď #1 kdy: 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á?

Pix

Re:Sítové programování v Javě
« Odpověď #2 kdy: 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ý,...

David

Re:Sítové programování v Javě
« Odpověď #3 kdy: 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.

Lanwicki

Re:Sítové programování v Javě
« Odpověď #4 kdy: 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");
    }
}
}


Phi

Re:Sítové programování v Javě
« Odpověď #5 kdy: 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?

Phi

Re:Sítové programování v Javě
« Odpověď #6 kdy: 09. 11. 2018, 14:39:20 »
Sorry, neodskroloval jsem ten zdrojak.

Lanwicki

Re:Sítové programování v Javě
« Odpověď #7 kdy: 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...


Petr

Re:Sítové programování v Javě
« Odpověď #9 kdy: 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).