DatenServer-DatenClient problem

mrno

Erfahrenes Mitglied
Hi,
ich bin gerade dabei für eine Lan party oder für das I-net ein Client-Server Programm zu schreiben. Da oft irgendjemand Probleme mit samba oder mit der windows netzwerkfreigabe hat bin ich gerade dabei einen Server zu schreiben der die updates für games anbietet. Mein Problem liegt gerade darin. Wenn ich eine Socket-Verbindung über einen Port aufgebaut habe ist dieser belegt bis die dateien vollständig übertragen wurden. Wie kann ich jetzt z.B. Auch von anderen clients daten empfangen? Ich kann max 2 Ports benutzen der Rest wird von der Firewall geblockt. Wie machen das z.B. http-Server oder ftp-Server. Bei denen ist doch meistens nur 1 port freigegeben?
 
Wie machen das z.B. http-Server oder ftp-Server.
Sie starten für jeden Clienten einfach einen neuen Thread bzw. sie "forken" sich für jeden Clienten neu (oder eine Mischung - wie Apache - alle sagen wir 10 Clienten forken sich einen Prozess, dieser Prozess verwaltet 10 Threads mit jeweils einen Clienten.. oder obs genau 10 sind weiss ich nich, aber dieses Prinzip halt, so ist eine gute Performance und eine gute stabilität gewährleistet ;) ).

Du machst das einfach folgenderweise:

Java:
for(;;)
{
    //hier wartest du auf einen Clienten, der auf einem bestimmten Port versucht,
    //eine Verbindung zu erstellen
    
    
    //und hier erstellst du einen neuen Thread für den Client, damit diese Schliefe weitergeht, und
    //das Programm auf den nächsten Clienten warten kann
    new Thread().Start(this.clientSendFile(clientStream)); 
            //so gehts in C# weiss grad nich wie
            //in Java, sorry
}

void clientSendFile(object ClientStream)
{
  Stream clientStream = (Stream) (objClientStream);
  //hier sendest du dem Clienten das File
  //hier die Verbindung wieder Schließen
}
 
Zuletzt bearbeitet:
Das Problem ist wenn ich auch einen thread mache sagt er mir das der Port schon belegt sei. Wie löse ich dieses Problem? Ist mit Stream eine Socket verbindung gemeint? Oder nur der OutputStream?
 
Moin!
Wie FTP das handhabt, hab ich dir ja schonmal erklärt. Dazu auch: Du hast zu diesem und ähnlichem Thema ja schon ein paar Threads gestartet. Wäre doch nett wenn du den Leuten die dir helfen auch mal ein Wort des Dankes sagen würdest und den Thread dann als erledigt markierst, wenn du ihn schon nicht weiter benutzt!

Zu deiner Frage:
Du hast auf deinem Server einen Serversocket, welcher auf einem Port X auf eingehende Verbindungen lauscht. Wenn du mit einem Client mit Socket von Port Y eine Verbindung zu dem Serversocket aufbaust, erstellt der Serversocket ebenfalls einen neuen Socket auf dem zufälligen Port Z.
D.h. die eigentliche Datenverbindung läuft nun auf den beiden Sockets mit Port Y und Z, währrend Port X wieder frei ist.
Wie yan1 schon sagte, willst du mehrere Verbindungen aufbauen, musst du jeden vom ServerSocket erstellten Socket in einem neuen Thread laufen lassen, da diese dir sonst blockieren. Wieso du da einen Fehler bekommst, kann ich dir wegen Fehlen deines Quelltexts nicht sagen.
Vielleicht hilft es dir ja, aber Sun hat in seinen Tutorials über Sockets, wo u.a. auch ein simpler Multi-Threaded Server vorgestellt wird. Würde dir empfehlen, auch das mal anzuschauen..
Hier der Link dazu: http://java.sun.com/developer/onlineTraining/Programming/BasicJava2/socket.html
*grüssle*
MeinerEiner
 
Zuletzt bearbeitet von einem Moderator:
Nein, du legst zuerst einen Listener an, den du auf einen bestimmten Port bindest.
Dann gehst du in ne Schleife rein, und wartest da drinnen auf Cleints.
Wenn ein Client kommt, einen neuen Thread für diesen Clienten aufmachen
(Sorry, du wirst wohl mehr brauchen als nur den Stream, zB überprüfen ob beim
connecten alles geklappt hat etc. das hab ich in meinem vorherigen Beispiel
nicht berücksichtigt, also übergibst du dem Thread natürlich eine Socket Verbindung)
Und dann weitergehen in den nächsten Schelifendurchlauf, und auf den zweiten warten.
Du darfst natürlich kein zweites mal einen TcpListener anlegen und ihn mit dem selben Port binden, das machst du alles mit dem selben Listener. Sobald sich jemand connected hat ist ja der Port komplett egal, den braucht man ja nur zum Verbinden. Wenn du es so machst wie in meinem obrigen Beispiel müsste alles klappen ;)

Lg, Yanick
 
Zurück