Nachricht an mehrere Clients schicken

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hab mal einen neuen Thread der übersichtlichkeit halber aufgemacht.

Code:
import java.net.*;
import java.io.*;
import java.util.List;


public class Server extends Thread {

    Boolean isStarted = false;
    ServerSocket server;
    Socket client;
    DataOutputStream out;
    DataInputStream in;
    List<Socket> list;
    
    
    
    @Override
    public synchronized void run() {
        try {
            server = new ServerSocket(4000);
        } catch (IOException ex) {
            System.out.println("Probleme mit Socket");
        }
        while (isStarted) {
            try {
                client = server.accept();
                list.add(client);
                in = new DataInputStream(client.getInputStream());
                out = new DataOutputStream(client.getOutputStream());

                String chatNachricht = in.readUTF();
                System.out.println(chatNachricht);
                out.writeUTF(chatNachricht);
                out.flush();
                in.close();
                out.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        try {
            server.close();
            client.close();
        } catch (IOException ex) {
            System.out.println("put");
        }

    }

    
    public List getClients() {
        return list;
    }
    
    public void removeClient(Socket client) {
        list.remove(client);
    }
    
    public void setOffline() {
        isStarted = false;
    }

    public void setOnline() {
        isStarted = true;
    }
}

das ist mein ansatz.
wie kann ich denn jetzt definieren, dass an alle clients aus der liste eine meldung geshcickt wird.
 
zunächst doch ganz simple

writeToAll(String x) {
for (Socket s : list) {
s.send(x);
}
}

du solltest aber nicht den Socket speichern und dann in den Output direkt schreiben während an anderer Stelle vielleicht ein DataOutputStream darauf besteht,
speichere lieber höhere Objekte mit Socket, in, out usw.

-----

wenn du die Verbindung zum Client oder zumindest die entsprechenen Streams wenige Millisekunden nach dem Zustandekommen schließt (Zeile 36/37),
dann bringt es dir nichts, diese in einer Liste zu sammeln 😉
 
wenn du die Verbindung zum Client oder zumindest die entsprechenen Streams wenige Millisekunden nach dem Zustandekommen schließt (Zeile 36/37),
dann bringt es dir nichts, diese in einer Liste zu sammeln 😉

hmmm aber die werden doch nur geshclossen, sofern die while schleife false ergit... und das ist der fall, wenn der server beendet wird.


writeToAll(String x) {
for (Socket s : list) {
s.send(x);
}
}

ok... 🙂



du solltest aber nicht den Socket speichern und dann in den Output direkt schreiben während an anderer Stelle vielleicht ein DataOutputStream darauf besteht,
speichere lieber höhere Objekte mit Socket, in, out usw.

das wiederrum verstehe ich leider nicht ganz. ich habe doch eine liste mit sockets, welch höheres element soll ich dnen nehmen?
 
> hmmm aber die werden doch nur geshclossen, sofern die while schleife false ergit

ich glaube diesmal habe ich genau genug hingeschaut,
ich schrieb extra die Zeilennummern dazugeschrieben, da steht eindeutig close(),
die Verbindung mag dann noch offen sein, aber in einen geschlossenen Stream kannst du nichts mehr reinschreiben

> welch höheres element soll ich dnen nehmen?

public class ClientData {

private Socket socket;
private DataOutputStream out;
...

}
 
SlaterB hat gesagt.:
> hmmm aber die werden doch nur geshclossen, sofern die while schleife false ergit

ich glaube diesmal habe ich genau genug hingeschaut,
ich schrieb extra die Zeilennummern dazugeschrieben, da steht eindeutig close(),
die Verbindung mag dann noch offen sein, aber in einen geschlossenen Stream kannst du nichts mehr reinschreiben

aber zu dem zeitpunkt wo die geschlossen sind soll doch auch nichts mehr reingeschrieben werden?!
naja ich mach mich mal daran eine neue klasse für die sockets zu erstellen (man nentn sowas bean oder?)
 
Code:
import java.io.DataOutputStream;
import java.net.Socket;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */


/**
 *
 * @author bmr
 */
public class ClientData {

private Socket socket; 
private DataOutputStream out; 


    public ClientData(Socket socket, DataOutputStream out) {
        this.socket = socket;
        this.out = out;
    }

    
}
 
> aber zu dem zeitpunkt wo die geschlossen sind soll doch auch nichts mehr reingeschrieben werden?!

wie gesagt ist dieser Zeitpunkt aber schon 3 ms nachdem die Verbindung überhaut erstellt wurde,
ich rede immer noch von Zeile 36/37, du denkst wahrscheinlich an 43/44
 
ach ok dieses mal hatte ich tomaten auf den augen.
soll ich diese streams also alle offen lassen?
 
Code:
import java.net.*;
import java.io.*;
import java.util.List;


public class Server extends Thread {

    Boolean isStarted = false;
    ServerSocket server;
    Socket client;
    DataOutputStream out;
    DataInputStream in;
    List<ClientData> list;
    
    
    
    @Override
    public synchronized void run() {
        try {
            server = new ServerSocket(4000);
        } catch (IOException ex) {
            System.out.println("Probleme mit Socket");
        }
        while (isStarted) {
            try {
                client = server.accept();
                in = new DataInputStream(client.getInputStream());
                out = new DataOutputStream(client.getOutputStream());
                String chatNachricht = in.readUTF();
                out.writeUTF(chatNachricht);
                out.flush();
                list.add(new ClientData(client, out));
                System.out.println(chatNachricht);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        try { 
            server.close();
            client.close();
        } catch (IOException ex) {
            System.out.println("put");
        }

    }

    
    public void writeToAll(String x) {
         for (ClientData d : list) {
             
         }
    }
    
    public List getClients() {
        return list;
    }
    
      
    public void removeClient(Socket client) {
        list.remove(client);
    }
    
    public void setOffline() {
        isStarted = false;
    }

    public void setOnline() {
        isStarted = true;
    }
}
 
offen klingt besser, ja

die Liste kannst du übrigens nun nutzen, um am Ende alle Clients zu schließen,
nicht nur den (letzten) in der Exemplarvariable client
 
ok danke ich werd es nachher mal versuchen das ganze jetzt umzusetzen.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben