# Nachricht an mehrere Clients schicken



## Guest (7. Jul 2008)

Hab mal einen neuen Thread der übersichtlichkeit halber aufgemacht.


```
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.


----------



## SlaterB (7. Jul 2008)

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


----------



## Guest (7. Jul 2008)

> 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?


----------



## SlaterB (7. Jul 2008)

> 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;
...

}


----------



## Guest (7. Jul 2008)

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?)


----------



## Guest (7. Jul 2008)

```
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;
    }

    
}
```


----------



## SlaterB (7. Jul 2008)

> 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


----------



## Gast (7. Jul 2008)

ach ok dieses mal hatte ich tomaten auf den augen.
soll ich diese streams also alle offen lassen?


----------



## Guest (7. Jul 2008)

```
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;
    }
}
```


----------



## SlaterB (7. Jul 2008)

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


----------



## Gast (7. Jul 2008)

ok danke ich werd es nachher mal versuchen das ganze jetzt umzusetzen.


----------

