# Hilfe bei multiplen Clients



## Hutmacher (25. Jul 2009)

Ich schreibe gerade an einem Programm, mit dessen Hilfe ich Dateien von einem PC an einen anderen PC übermitteln kann. 

Hierzu habe ich als aller erstes einen Server. Wenn dieser eine Verbindung zu einem Client aufbaut, hält er ihn erst mal so lange, bis ich dem Server gesagt habe, welche Datei er senden soll.

```
...
public Server()
{
    while ( true )
    {
        Socket client = accept(); //Beschafft den Client
        
        //Warten, bis ein Befehl gegeben wurde
        while ( nochKeinBefehlGegeben )
        {
            Thread.sleep(1);
        }
           
        //Dem Client die Datei uebermitteln (per PrintWriter)
        ...
    }
}
```
Jetzt hat der Client die Datei und schreibt sie auf den Desktop. Thema beendet.

Nun möchte ich es aber so einrichten, dass der User aus einer Liste von verbundenen Clients auswählen kann, _wem_ er die Datei sendet. 
Es ergibt sich also ein Problem: Wenn der eine Client noch gehalten wird, kann der andere nicht connecten. 
Außerdem, wie soll ich dem Server sagen, dass er die Datei an einen bestimmten Socket weiterleiten soll?

Ich habe überlegt, dass ich es mit dem Senden vielleicht so machen kann:
Ich überprüfe, ob er aktuelle Socket dieselbe IP-Adresse wie der ausgewählte User hat; hat er sie, wird die Datei versandt, checkt er die anderen durch.
Irgendwie aber kommt mir diese Lösung auch nicht optimal vor, zumal ich dabei immer wieder connectete Sockets verliere.

Habt ihr einen besseren Vorschlag und könnt mir sagen, wie ich das multithreaden kann?

*Anhang:*
Darüber hinaus habe ich mit mal mit DCC (Direct Client-to-Client) beschäftigt, aber dafür gibt es leider keine Java-APIs.


----------



## Paddelpirat (25. Jul 2009)

Du solltest dich mal über "multithreaded (Java-) Server" informieren (google, bing, etc helfen weiter). Du musst jede Socket-Verbindung, die du in deinem Server akzeptierst in einem eigenen Thread laufen lassen, bis sie halt beendet wird.

Eine Client - Client Verbindung ist eigentlich wieder eine normale Client-Server Verbindung, nur dass dein Client gleichzeitig als Server fungiert.


----------



## Hutmacher (26. Jul 2009)

Ok, danke. Habe auch schon gute Lektuere gefunden.
Aber wie loese ich das andere Problem?


----------



## sparrow (26. Jul 2009)

Ich sag es mal so: bitte spezifizieren Sie ihr Problem


----------



## Hutmacher (26. Jul 2009)

sparrow hat gesagt.:


> Ich sag es mal so: bitte spezifizieren Sie ihr Problem



Steht doch im ersten Post ^^  
Dass ich aus ein er Liste auswaehle, wem ich die Datei sende.
Habe mir jetzt Folgendes ueberlegt:
Wenn der Client connectet, wird sein Socket mit dem Username  (outputstream!) in einer HashMap gespeichert. Will man etwas senden, so wird ein Thread gestartet, der die Daten in den jeweiligen Stream schreibt.

Geht das denn,  20 Sockets offen zu haben? 
Bessere Loesungsmoeglichkeiten?


----------



## sparrow (26. Jul 2009)

Ne, passt!

Clients in eine Liste und den entsprechenden raussuchen, senden, gut ist.

20 offene Sockets sind kein Problem.


----------



## Hutmacher (26. Jul 2009)

sparrow hat gesagt.:


> Ne, passt!
> 
> Clients in eine Liste und den entsprechenden raussuchen, senden, gut ist.
> 
> 20 offene Sockets sind kein Problem.


Top 
Habe nämlich (weil bei den Bsp-Servern immer nur einer da sein kann und der dann auch wieder geschlossen wird) gedacht, dass das nicht ginge.

Danke ;D


----------



## sparrow (26. Jul 2009)

Hutmacher hat gesagt.:


> Top
> Habe nämlich (weil bei den Bsp-Servern immer nur einer da sein kann und der dann auch wieder geschlossen wird) gedacht, dass das nicht ginge.
> 
> Danke ;D



Einfach den Socket der von ServerSocket.accept() zurück kommt in einen neuen Thread überführen.
Hier gibt es einen Beispielcode für einen Webserver: Handbuch der Java-Programmierung - Google Bücher
Ansosnsten gbt es das Buch (aus dem Link) "Handbuch der Java Programmierung" unter www.javabuch.de - Das Handbuch der Java-Programmierung kostenlos als HTML-Version als Download.
Du musst dann quasi die Threads in einer Liste führe.


----------

