AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Dateiversand über Sockets
Thema durchsuchen
Ansicht
Themen-Optionen

Dateiversand über Sockets

Ein Thema von hyype · begonnen am 24. Nov 2008 · letzter Beitrag vom 26. Nov 2008
Antwort Antwort
hyype

Registriert seit: 5. Nov 2008
97 Beiträge
 
Delphi XE2 Professional
 
#1

Dateiversand über Sockets

  Alt 24. Nov 2008, 12:39
Hallo!
Ich versuche, zunächst eine einzelne Datei von a nach b zu schicken.
Dazu habe ich die Komponenten ServerSocket und ClientSocket verwendet (die man nach meiner Recherche wohl nicht mehr verwenden sollte...)
Ich habe bei der ClientSocket-Komponente unter Socket die Funktion SendStream gefunden, die ich dafür benutzen wollte.
Der Server sollte dann den Stream empfangen und die Datei irgendwohin speichern. Problem ist: Der ServerSocket hat gar keine Funktion ReceiveStream.
Das wundert mich, weil zu SendText und SendBuf gibt es die äquivalenten Funktionen ReceiveText und ReceiveBuf.
Kann mir jmd sagen, wie ich das realisieren kann?
Oder muss ich doch andere Steuerelemente wie IdTCPClient und IdTCPServer verwenden? Und falls ja, kann mir einer kurz erklären, wie das geht oder mir nen Link posten, wo das steht? Weil SendStream oder ReceiveStream hab ich da so auf Anhieb nicht gefunden..
  Mit Zitat antworten Zitat
hyype

Registriert seit: 5. Nov 2008
97 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Dateiversand über Sockets

  Alt 24. Nov 2008, 14:42
Versenden:
(bringt keinen Fehler)
Delphi-Quellcode:
procedure TForm2.Button3Click(Sender: TObject);
var
  ms:TMemoryStream;
  strFolder:string;
  strFileName:string;
begin
  strFolder:='H:\Src\';
  strFileName:='blub.doc';
  ms:=TMemoryStream.create;
  ms.LoadFromFile(strFolder+strFileName);
  ClientSocket1.Socket.SendStream(ms);
end;
Empfangen:
(bringt Windows-Socket-Fehler:
Eine bestehende Verbindung wurde softwaregesteuert durch den Hostcomputer abgebrochen (10053), bei API 'recv'
Delphi-Quellcode:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  msg:string;
  ms:TMemoryStream;
  strFolder:string;
  strFileName:string;
  zeiger:Pointer;
  bufferlänge:integer;
begin
  strFolder:='H:\Ziel\';
  strFileName:='blub.doc';
  ms:=TMemoryStream.Create;
  bufferlänge:=socket.ReceiveLength;
  Socket.ReceiveBuf(zeiger^,bufferlänge);
  ms.Write(zeiger^,bufferlänge);
// ms.SaveToFile(strFolder+strFileName);
end;
Ich hatte auch schonmal dastehen
Socket.ReceiveBuf(ms,socket.ReceiveLength); da kam aber der gleiche Fehler.
Ich muss zugeben, dass ich zum einen keine Ahnung habe, was ich genau bei ReceivedBuf als 1. Parameter angeben soll, zum anderen weiß ich nicht, wie man den stream zerlegt, den nach und nach schickt und dann irgendwann damit aufhört. Ein _nützliches_ Tutorial habe ich dazu auch nicht gefunden, ich google die ganze Zeit rum, finde aber nur Beiträge von Leuten, die es auch nicht wissen und Anwtworten von Leuten , die nicht bereit sind, es mal zu erklären.
  Mit Zitat antworten Zitat
hyype

Registriert seit: 5. Nov 2008
97 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Dateiversand über Sockets

  Alt 24. Nov 2008, 15:29
getmem(zeiger,bufferlänge);
hat gefehlt

noch eine Frage:
bei vielen Beiträgen von Leuten, die genau wie ich erst wenig Erfahrung haben, steht zu diesem Thema immer was von einem Protokoll.
Wozu dient ein solches Protokoll?
Um zu erkennen, wann der Stream vollständig übertragen wurde?
Das kann man doch auch daran erkennen, dass die Größe der übertragenen Daten kleiner als 8192B ist.
Oder um Problemen vorzubeugen, die evtl durch gleichzeitige Übertragung entstehen können?
  Mit Zitat antworten Zitat
hyype

Registriert seit: 5. Nov 2008
97 Beiträge
 
Delphi XE2 Professional
 
#4

Re: Dateiversand über Sockets

  Alt 26. Nov 2008, 07:31
So, ich benutze nun die indy-Komponenten dafür, da sie in der Tat besser geeignet sind. ^^
Dazu mal eine Frage:
Wenn die Server-Komponente am empfangen ist, ist sie blockiert, oder?
Ich habe eben mal 2 Clients je 10 Datenströme hinschicken lassen und von diesen insgesamt 20 Datenströmen hat er nur 4 erhalten.
Ich habe ja gehofft, er erstellt evtl von selber nen Thread, wenn nen Client sich connectet, damit ich mich nicht mit dem Thema auseinandersetzen muss, da Threads doch schon ein umfangreicheres Themengebiet sind. ^^
Wer mir bei dem Thread-Problem helfen kann, kann dies gern tun, ich weiß z.bsp. nicht, ob es reicht (und wie man es realisiert), dass er bei eingehenden Verbindungen einen neuen Thread aufmacht, oder ob die Server-Komponente evtl selbst in nem Thread sein muss etc.
Habe 2 Tutorials zum Thema Threads gelesen, aber nur Bahnhof verstanden.

Edit:
Ich frag mal gezielter:
Wenn sich ein Client zum Server connectet, wird doch sicherlich ein neuer Socket erzeugt, über den die Verbindung dann läuft (so ist es zumindest bei der TServerSocket-Komponente, kA wie's bei TidTCPServer ist)
Diesen Socket müsste ich meinem Thread ja auf jeden Fall übergeben.
Weiß einer, wie ich an den rankomme (damit ich ihn übergeben kann) und von welchem Typ der ist?
  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 05:03 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