Einzelnen Beitrag anzeigen

Muetze1
(Gast)

n/a Beiträge
 
#7

Re: Dateiaustausch zwischen clientsocket und serversocket..^

  Alt 6. Okt 2007, 19:22
Zitat von cRayZo:
also dann sowas in der art oder wie?
Ja, aber ich dachte da nun nur noch an Code, der funktioniert . Aber schauen wir mal, was du gemacht hast...

Delphi-Quellcode:
procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
  Stream : TMemoryStream;
begin
  Stream := TMemoryStream.Create;
  clientsocket1.Socket.ReceiveBuf(stream,sizeof(stream));
  image1.Picture.Bitmap.LoadFromStream(stream);
end;
Das wird zu Problemen führen, weil die OnClientRead() Funktion mehrfach aufgerufen wird (werden kann), bis du die gesamten Daten empfangen hast. Somit musst du den Memorystream woanders erzeugen (so das du wirklich nur eine Instanz davon hast) und damit du mit jedem OnClientRead die neu empfangenen Teile direkt hinten an den MemoryStream anhängen kannst. Wenn du dann alle Daten empfangen hast, dann kannst du aus dem MemoryStream die Daten auslesen.

Folgende Fehler in deiner Routine:
1. Du erzeugst jedes mal eine neue Instanz von TMemoryStream - du brauchst nur eine
2. Du gibst die Instanz bei ReceiveBuf() an, aber der will einen Zwischenpuffer haben. Du kannst die Instanz niemals bei dieser Funktion direkt angeben.
3. Instanzen sind intern nur Zeiger auf das Objekt im Speicher - siehe mein Beitrag zuvor. Was für das Senden gilt, gilt hier genauso für das Empfangen, schliesslich sind es jedesmal Instanzen.
4. Nach dem Schreiben von Daten in den Stream, wird der Dateizeiger (Delphi-Referenz durchsuchenTStream.Position) auch um die jeweilige Byteanzahl weiter gesetzt und LoadFromStream() liest aber der aktuellen Dateiposition. Damit würde LoadFromStream() immer fehlschlagen, da er immer am Ende der Daten steht.
5. Du gibst nirgendwo den Stream wieder frei.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Stream : TMemoryStream;
  bitmap:Tbitmap;
begin
  Stream := TMemoryStream.Create;
  MakeScreenShot(bitmap);
  bitmap.SaveToStream(Stream);
  Stream.Position := 0;
  Stream.Free;
  Serversocket1.Socket.Connections[0].SendStream(Stream);
end;
1. Wenn du den Stream mit .Free wieder freigibst (und er somit weg ist), was soll er denn bei dem Aufruf danach noch versenden? Datenmüll? Naja, das macht er bestenfalls sogar.
2. Den Stream grundsätzlich nicht freigeben, weil SendStream() übernimmt diesen Part für dich (siehe Delphi-Referenz durchsuchenTCustomWinSocket.SendStream(), da nur SendStream weiss, wann er alles gesendet hat. SendStream macht dies im Hintergrund.
3. Du gibst nirgendwo das Bitmap wieder frei.

Am besten mal die Senderoutine aufräumen, da biste wohl am schnellsten bei einer funktionierenden Lösung...
  Mit Zitat antworten Zitat