Moin!
Zitat von
Alcatraz:
Gibt es keine Möglichkeit um festzustellen op man nun Text oder Stream empfàngt?
Nein, darum musst du dich in deinem eigenen Protokoll kümmern.
Zitat von
Alcatraz:
Ich habe versucht es so zu lösen:
Code:
Stream:=TMemoryStream.Create;
Socket.ReceiveBuf(Stream,Socket.ReceiveLength);
Received:=socket.ReceiveText;
try
Stream.Seek(0,soFromBeginning);
Image2.Picture.Bitmap.LoadFromStream(Stream);
Image2.Picture.Bitmap.SaveToFile('server_test.bmp');
except
memo1.lines.append(socket.ReceiveText);
end;
Dreifach *Autsch* Der Code ist wirklich böse. Du hast da einen wirklich, wirklich bösen Code geschrieben. Mal kurz durchgehen: Du instanziierst eine Instanz von TMemoryStream. Die Instanzenadresse wird in ihrer Variable abgelegt (4 Byte gross). Dann haust du alle im Buffer des Sockets vorhandenen Daten einfach in die 4 Byte grosse Variable - ok, 4 Byte wären (wenns nicht falsch wäre) noch ok, aber alles andere zerschiesst dir alle nachfolgenden Variablen, etc. Mit dem ReceiveBuf() ist der Socketbuffer leer und trotzdem versuchst du danach noch mit ReceiveText was auszulesen. Da wird immer ein Leerstring zurück kommen - ausser du hast wirklich mal soviel Glück, dass zwischenzeitlich der Socket Thread zugeschlagen hat und den Buffer befüllt hat (unwahrscheinlich). Bei ReceiveBuf() und ReceiveText() verhält es sich gleich: einmal ausgeführt, werden die ausgelesenen Daten aus dem Socketbuffer entfernt.
So, dann das Stream.Seek(), was sehr höchstwahrscheinlich abgestürzt ist, weil die Instanz in Stream durch Daten vom Socket überschrieben wurden, wahrscheinlich auch deshalb mit Try/Except zum Schweigen gebracht, bringt dann auch nix mehr, da keine Daten im Stream sind - bzw. überall, nur nicht dort. Die Instanz vom Stream ist eh verloren.
Und als vorletztes gehst du sofort davon aus, dass bei einem Aufruf von OnClientRead() o.ä. mit einem ReceiveBuf() ein komplettes Bitmap empfangen wurde. Da muss ich dich enttäuschen. Dieser Fall würde nur bei wirklich kleinen Bitmaps eintreten. Im Normalfall müssen mehrere folgende Aufrufe von OnClientRead abgewartet werden, bis man das komplette TBitmap empfangen hat. Aber zu wissen wann dies der Fall ist, hilft dir wiederrum ein Protokoll, wo du vor dem Bitmap die Informationen schicken kannst, wie gross denn das folgende Bitmap ist.
Und als aller letztes versuchst du erneut mit ReceiveText was aus dem Socket zu lesen - was aber mit 200%iger Wahrscheinlichkeit wieder nix ergibt, da der Socket wohl wiederrum noch nix neues empfangen hat. Dü könntest ansatzweise mal die Variable Received ins Memo schreiben - aber wie schon oben vermutet sollte da nix drinne stehen.
Empfehlung: Ein Tutorial über Sockets und deren Komponenten (egal ob nun
Indy oder TClientSocket/TServerSocket).
PS: Zu deiner Signatur: Das "das" vor Leben hat eine bestimmte Bedeutung. Und mal so nebenbei: Substantive werden gross geschrieben...
Muetze1 ist heut wieder bööööse
...