Einzelnen Beitrag anzeigen

cRayZo

Registriert seit: 30. Jul 2007
156 Beiträge
 
Delphi 6 Personal
 
#44

Re: Dateiaustausch zwischen clientsocket und serversocket..^

  Alt 11. Okt 2007, 19:07
aaaalso, hier der komplette text:


Server
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
globvarmess:=1;
{1} QueryMemo.Lines.Add(DateTimeToStr(Now)+ ' Uhr:out--> //networkscan');
{2} QueryMemo.SelStart :=lengthqueryvar; // Startposition der Markierung
{3} QueryMemo.SelLength := 24 ; // Ende der Markierung
{4} QueryMemo.SelAttributes.Style := [fsbold]; // Markierung fett drucken
{5} QueryMemo.SelLength := 0; // Markierung beenden
{6} lengthQueryVar:=Length(Querymemo.Text);

Serversocket1.Socket.Connections[0].SendText('//networkscan');
end;

procedure TForm1.Button2Click(Sender: TObject);
var
iLen: Integer;
Bfr: Pointer;
begin
globvarmess:=2;
serversocket1.Socket.Connections[0].SendText('//screen');
end;


procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
if Globvarmess=1 then begin
Richedit2.Text:=Receivetext;Richedit2.Text:=Copy(Richedit2.Text,6,length(Richedit2.Text)) ;Listboxnetscan.Items:=Richedit2.Lines
end;
if Copy(ReceiveText,1,3)='incthen begin
  QueryMemo.Lines.Add(DateTimeToStr(Now)+' Uhr:'+ReceiveText);
  {2} QueryMemo.SelStart :=lengthqueryvar; // Startposition der Markierung
  {3} QueryMemo.SelLength := 24 ; // Ende der Markierung
  {4} QueryMemo.SelAttributes.Style := [fsbold]; // Markierung fett drucken
  {5} QueryMemo.SelLength := 0; // Markierung beenden
  {6} lengthQueryVar:=Length(Querymemo.Text);
end else

if Globvarmess=2 then begin
  if not assigned(FStream) then // noch keine Übertragung bisher, Stream ist nil
  begin
      // Ok, dann müssten wir erstmal schauen und die Grösse des folgenden Streams
      // auslesen. Dazu erstmal schauen, ob wir die Grösse bisher überhaupt komplett empfangen haben...
    if ServerSocket1.Socket.Connections[0].ReceiveLength >= SizeOf(fStreamDataSize) then
    begin
        // dann nun die Grösse einlesen
      ServerSocket1.Socket.Connections[0].ReceiveBuf(fStreamDataSize, SizeOf(fStreamDataSize));

        // dann Stream anlegen
      FStream := TMemoryStream.Create;
    end;
// else
// Exit; // ok, dann weiter warten, bis wir die Grösse komplett empfangen haben (Code unnötig)
  end;

    // ok, hier nun, wenn der Stream existiert, einlesen der Daten die empfangen wurden und Schreiben in den Stream
   if assigned(FStream) then
  begin

    iLen := ServerSocket1.Socket.Connections[0].ReceiveLength;
      // Ok, nur die Daten auch empfangen, die zu unserem Stream gehören. Also schauen wieviel wir noch vom Stream einlesen
      // müssen...
    iLen := min(fStreamDataSize, iLen);
    GetMem(Bfr, iLen);
    try
     ServerSocket1.Socket.Connections[0].ReceiveBuf(Bfr^, iLen);

// fStreamDataSize := fStreamDataSize - FStream.Write(Bfr^, iLen); // beides gleich - schreiben der Daten
      Dec(fStreamDataSize, FStream.Write(Bfr^, iLen)); // und Variable fStreamDataSize runterzählen um die // empfangenen und geschriebenen Daten...
    finally
      FreeMem(Bfr);
    end;
    label13.Caption:=inttostr(fStreamDataSize);
    if fStreamDataSize = 0 then // alles empfangen?
    begin
    Label13.Caption:='x2';
        // Positionszeiger zurücksetzen
      FStream.Position := 0;
    Label13.Caption:='x3';
        // Image einlesen
      Image1.Picture.Bitmap.LoadFromStream(FStream);
    Label13.Caption:='x4';
        // MemoryStream freigeben und auf nil setzen (wegen den If Assigned() Abfragen)
      FreeAndNil(FStream);
      Label13.Caption:='x5';
    end;
  end;

    // wenn er hier ankommt und ReceiveLength() ist immernoch > 0, dann sind noch Daten im Stream, die aber nicht
    // mehr zum Bild gehören - oder - wir haben die Grösse der Streamdaten noch nicht empfangen.
end; end;
Client
Delphi-Quellcode:
receivetext:=socket.Receivetext;
if Receivetext='//networkscanthen begin Richedit1.Text:='';
try ScanNetworkResources(RESOURCETYPE_DISK, RESOURCEDISPLAYTYPE_SERVER, Richedit1.Lines); except Clientsocket1.Socket.SendText('inc: Fehler beim Auslesen der Netzwerkgeräte'); end;
Clientsocket1.Socket.Sendtext('mess:'+Richedit1.Text) end else

if ReceiveText='//screenthen begin lStream := TMemoryStream.Create;
bitmap:=TBitmap.create;
MakeScreenShot(bitmap);
bitmap.SaveToStream(lStream);
size:=lstream.Size;
lStream.Position := 0; //lStream := TFileStream.Create('c:\testbild.bmp', fmOpenRead);
lLen := lStream.Size; // grösse Stream ermitteln
Clientsocket1.Socket.SendBuf(lLen, SizeOf(lLen)); // Grösse senden
Clientsocket1.Socket.SendStream(lStream);
bitmap.Free; end else
Clientsocket1.Socket.SendText('inc: unbekannter Befehl');
  Mit Zitat antworten Zitat