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
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á?
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ý,...
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.
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
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");
}
}
}
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?
Sorry, neodskroloval jsem ten zdrojak.
Citace od: Phi 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?
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...
https://stackoverflow.com/questions/39122230/multithreading-echo-server
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).