AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi datei versand client->server->client
Thema durchsuchen
Ansicht
Themen-Optionen

datei versand client->server->client

Ein Thema von ghost007 · begonnen am 15. Jan 2007 · letzter Beitrag vom 18. Jan 2007
Antwort Antwort
Benutzerbild von ghost007
ghost007

Registriert seit: 31. Okt 2005
Ort: München
1.024 Beiträge
 
Delphi 7 Personal
 
#1

datei versand client->server->client

  Alt 15. Jan 2007, 16:45
Hallo,
ich beschäftige mich zur zeit mal wieder mit meinem kleinen chat programm.
Für die kommunikation verwende ich TServerSocket und TClientSocket.
Nun will ich einen datei versand einbaun, der über den server läuft.
D.h. vom client zum server und der leitet die daten dann weiter an den client, am besten ohne die dateien auf dem server zwischen zu speichern.

1. wie versende ich datein mit den obigen komponenten (anscheinend bin ich für die beispiele hier im forum zu dumm )
2. wie leute ich die daten am server um

MfG - Ghost007

[EDIT]
also dateien kann ich nun versenden.
mit folgendem code:
Delphi-Quellcode:
[b]CLIENT:[/b]

procedure TForm1.Button1Click(Sender: TObject);
var
  fs: TFileStream;
begin
  if not OpenDialog1.Execute then exit;
  with IdTCPClient1 do
  begin
    fs := TFileStream.Create(OpenDialog1.FileName, fmOpenRead or fmShareDenyWrite);
    Connect;
    try
      OpenWriteBuffer;
      try
        WriteStream(fs, true, true, 0);
        CloseWriteBuffer;
      except
        CancelWriteBuffer;
        raise;
      end;
    finally
      Disconnect;
      fs.Free;
    end;
  end;
end;

[b]SERVER:[/b]

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  fs: TFileStream;
  SizeOfIncomingStream: integer;
begin
  if not SaveDialog1.Execute then exit;
  fs := TFileStream.Create(SaveDialog1.Filename, fmCreate or fmShareExclusive);
  with AThread.Connection do
    try
      SizeOfIncomingStream := ReadInteger;
      ReadStream(fs, SizeOfIncomingStream);
    finally
      Disconnect;
      fs.Free;
    end;
end;
Wie kann ich nun die datei anstatt auf dem server zu speicher an einen client weiter schicken?
[/EDIT]
Christian
Es gibt möglich Dinge und unmöglich Dinge.
Für unmögliche braucht man lediglich etwas länger.
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: datei versand client->server->client

  Alt 15. Jan 2007, 20:58
Hi,
mal die ganz einfachste Lösung, schau Dir doch mal an was Du schon hast. Du hast hier eine Komponente, die kann Daten an einen beliebigen Adressaten versenden (die nennst Du Client), eine andere Komponente kann Daten empfangen (die nennst Du Server). Was suchst Du? Eine Möglichkeit Daten zu empfangen und zu versenden?! Na ist ja super, hast ja schon alles was Du benötigst.
Anders gesagt, was spricht dagegen, dass ein Client auch ein Server ist? Ich würde mal sagen nicht viel. Du hast natürlich für dein Beispiel zwei verschiedene Klassen (meine nicht 2 Delphi Klassen). Zum einen hast Du den "Endanwender", der sich nur an den zentralen Server wenden kann, zum anderen natürlich den zentralen Server.
Der zentrale Server kann dann z.B. eine Liste aller "Endanwender" verwalten, deren Sichtbarkeit untereinander etc. Kommt jetzt also von Endanwender 1 eine Datei für Endanwender 2 auf dem Server an, so nimmt der Server mit seinem IdHttpServer die Datei an und verschickt die einfach mit seinem IdHttpClient (sorry falls die Namen nicht stimmen, bin zu faul in deinem Code noch mal nachzuschauen, weißt schon was ich meine). Endanwender 1 verschickt in diesem Beispiel nur, benutzt also sein IdHttpClient, Endanwender 2 empfängt nur, benutzt also nur sein IdHttpServer Komponente. Da beide aber vom selben Typ sind, haben also sowohl die Clienten als auch der zentrale Server einfach beide Indys (Server und Client), nur die darauf aufbauende Handlung unterscheidet sich.
Ja, das sollte eigentlich dein Problem lösen, oder?

Gruß Der Unwissende
  Mit Zitat antworten Zitat
Benutzerbild von ghost007
ghost007

Registriert seit: 31. Okt 2005
Ort: München
1.024 Beiträge
 
Delphi 7 Personal
 
#3

Re: datei versand client->server->client

  Alt 15. Jan 2007, 21:46
hi,
was ich vermeiden möchte ist das man den port freigegeben haben muss um dateien zu senden.
Die eigentliche frage die sich somit stellt ist:
kann ich auch vom server zum client daten schicken?
wenn ja, wie?

MfG - Ghost007
Christian
Es gibt möglich Dinge und unmöglich Dinge.
Für unmögliche braucht man lediglich etwas länger.
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#4

Re: datei versand client->server->client

  Alt 16. Jan 2007, 08:27
Zitat von ghost007:
hi,
was ich vermeiden möchte ist das man den port freigegeben haben muss um dateien zu senden.
Die eigentliche frage die sich somit stellt ist:
kann ich auch vom server zum client daten schicken?
wenn ja, wie?
Wie jetzt
Du möchtest Daten verschicken aber ohne Port? Dann ist TCP/IP sicherlich keine Lösung für Dich! Egal ob Du Daten empfängst oder sendest, in beiden Fällen muss dafür ein Port geöffnet werden, darauf basiert gerade das Protokoll.
An sich wird man eher selten versuchen alle Verbindungen unnötig offen zu halten. Natürlich kannst Du ständig die Verbindung jedes Klienten zum Server aufrecht erhalten und über die Verbindung auch wieder antworten verschicken, aber das wäre (imho) Ressourcenverschwendung und wenig praktikabel. In der Regel willst Du bei einem Server nur eine bestimmte Anzahl von gleichzeitigen Verbindungen erlauben, Verbindungen die hier also einfach nur warten ob mal irgendwann ein Paket für sie kommt sind da eher unnütz. Dann käme da auch noch die Timeoutproblematik hinzu, wann hast Du denn bei so einer Verbindung wirklich ein Timeout? Wann wartest Du einfach nur? Usw.
Das eigentliche Problem würdest Du damit aber natürlich auch nicht lösen, denn der Port zum Server bleibt ebenfalls blockiert.

Hier solltest Du lieber ereignisorientiert arbeiten und immer dann eine Verbindung vom Server zu einem Client aufbauen, wenn wirklich etwas übertragen wird (auch nur Informationen). Dabei wird der Port/ die Verbindung nur so lange aufrecht erhalten wie es wirklich nötig ist. Hierbei solltest Du natürlich die Möglichkeit vorsehen, dass der Client bei seiner "Anmeldung" am Server mitteilen können sollte, auf welchem Port er gerne Antworten hätte. Im einfachsten Fall ist es natürlich gleich der Port von dem aus er die Anfragen stellt. Der Benutzer sollte hier einfach nur die Möglichkeit haben diesen Port zu wählen (dann sollten auch Firewalls kein Problem sein).

Gruß Der Unwissende
  Mit Zitat antworten Zitat
Benutzerbild von ghost007
ghost007

Registriert seit: 31. Okt 2005
Ort: München
1.024 Beiträge
 
Delphi 7 Personal
 
#5

Re: datei versand client->server->client

  Alt 16. Jan 2007, 13:01
hi,
also es sieht folgendermasen aus:
1. ich will dateien von a nach b senden ohne das man einen port freigeben muss(wenn man einen router hat, wenn man keinen hat is das ja kein problem).
2. ich habe bis jetzt nur mit der indy tcp komponente was rumprobiert. gibts eine andre die das vll einfacher bewerkstelligen kann?

MfG - Ghost007
Christian
Es gibt möglich Dinge und unmöglich Dinge.
Für unmögliche braucht man lediglich etwas länger.
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#6

Re: datei versand client->server->client

  Alt 16. Jan 2007, 14:13
Um es nochmal zu sagen, das hat nichts mit Indy oder Sockets oder was auch immer zu tun, der Grund dass Du einen Port benötigst liegt im TCP/IP bzw. UPD/IP, was die sogenannten Internetprotokolle sind.
Diese funktionieren so, dass zwei Kommunikationspartner eine eindeutige Adresse haben und über diese miteinander kommunizieren können. Eine Adresse besteht dabei aus der IP-Adresse (die Maschine die erreicht werden soll) und dem Port (der Dienst der angesprochen werden soll). Das ist wichtig, da auf einem Server natürlich mehr als ein Dienst laufen kann. So findest Du i.d.R. einen Webserver (also der Dienst, den z.B. Apache anbietet) auf Port 80. Handelt es sich um einen Linux-Rechner, wirst du mit einer gewissen Wahrscheinlichkeit auch einen SSH-Dienst auf Port 20 (oder war SSH 22?, kann man eh umlegen), finden. Wenn Du jetzt also eine Webseite abrufen möchtest, richtest Du zwar die Anfrage an den selben Rechner, aber möchtest sicherlich nicht beim SSH-Dienst landen (ok, genauer gesagt wird der Admin des Servers das kaum wollen).
Das HTTP (ab 1.1) hier nochmal auf einem Port zwischen den abgerufenen URLs unterscheiden und somit mehr als eine Seite auf dem gleichen Port ausgeben kann ist dann noch eine andere Sache.

Möchtest Du einen Dienst nutzen oder anbieten (Client bzw. Server), dann muss ein Port dafür geöffnet werden. Da führt bei diesen Protokollen (afaik) nichts herum. Wenn Du also nicht über das Internet kommunizieren möchtest, so wirst Du vielleicht ein anderes Protokoll finden, dass hier ohne Port auskommt, aber ob so ein Protokoll durch den Router kommt ist dann wieder eine andere Sache.
Deswegen solltest Du einfach den Port durch den Benutzer wählen lassen können, ICQ, MSN-Messenger, Torrent-Clients und auch der gute Webbrowser müssen auf die gleiche Art und Weise am Router vorbei. Das größte Problem hier ist, dass Du eben aktiv einen Port forwarden musst, wenn Du hier Ereignisorientiert die Verbindung auf- und abbaust. Ein solcher Port (an den dann Daten geschickt werden, die nicht angefragt wurden) wird dann immer an einen festen Rechner im Netz und hier auf einen festen Port (an einen festen Dienst) weitergereicht. Das ist z.B. auch nötig um eine Skype Verbindung von außen mit einem Rechner hinter einem Router herzustellen.
Alternativ dazu kann man (wie bereits gesagt) eine Verbindung zum Server einfach offen halten und hier Antworten versenden. Das löst zwar das Problem mit dem Port-Forwarding, aber nicht das generelle Problem, dass eben auch hier ein Port geöffnet werden muss.
  Mit Zitat antworten Zitat
Benutzerbild von ghost007
ghost007

Registriert seit: 31. Okt 2005
Ort: München
1.024 Beiträge
 
Delphi 7 Personal
 
#7

Re: datei versand client->server->client

  Alt 18. Jan 2007, 18:10
hi,
ok danke für deine ausfürlichen antworten.
Ich werde dann wohl oder übel es über die ports machen.

MfG - Ghost007
Christian
Es gibt möglich Dinge und unmöglich Dinge.
Für unmögliche braucht man lediglich etwas länger.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz