-2

I want to create a client-server UDP. The problem is that the server can not mopulit picture

type
  TPacket = record
    Image: TJPEGImage;
    student: string;
  end;

var
  Image: TBitmap;
  Desktop: TDesktop;
  by: TBytes;
  Packet: TPacket;

implementation

{$R *.dfm}

procedure TDesktop.Button1Click(Sender: TObject);
var
  can: TCanvas;
begin
  can := TCanvas.Create;
  can.Handle := GetWindowDC(GetDesktopWindow);
  ZeroMemory(by, 0);
  Packet.Image := TJPEGImage.Create;
  Image := TBitmap.Create;
  Image.Width := Screen.Width;
  Image.Height := Screen.Height;
  Image.Canvas.CopyRect(
    Rect(0, 0, Screen.Width, Screen.Height),
    can,
    Rect(0, 0, Screen.Width, Screen.Height)
  );
  Packet.Image.Assign(Image);
  Packet.Image.CompressionQuality := 50;
  Packet.student := 'student';
  IdUDPClient1.BufferSize := SizeOf(packet);
  SetLength(by, sizeof(packet));
  Move(packet, by[0], sizeof(packet));
  IdUDPClient1.SendBuffer('127.0.0.1', 5, by);
  Image.Free;
  Packet.Image.Free;
  ReleaseDC(0, can.Handle);
end;

procedure TDesktop.FormShow(Sender: TObject);
begin
  IdUDPServer1.BufferSize:=SizeOf(packet);
end;

procedure TDesktop.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
  AData: array of Byte; ABinding: TIdSocketHandle);
begin
  Packet.Image := TJPEGImage.Create;
  Move(AData[0], packet, sizeof(AData));
  Caption := Packet.student;
  Packet.Image.SaveToFile('E:\1.jpg');
  Packet.Image.Free;
end;
TLama
  • 75,147
  • 17
  • 214
  • 392
Michael Bosh
  • 13
  • 1
  • 8

1 Answers1

1

Your TPacket contains an object pointer and a dynamically allocated string. You cannot transmit those values as-is to another machine, or even another process on the same machine. You must serialize the values into raw bytes, then transmit and receive the bytes, then deserialize the bytes back into viable data on the receiving end.

Try something more like this:

procedure ScreenshotToJpgStream(Stream: TStream);
var
  R: TRect;
  can: TCanvas;
  dc: HDC;
  Bmp: TBitmap;
  Jpg: TJPEGImage;
begin
  R := Rect(0, 0, Screen.Width, Screen.Height);
  Jpg := TJPEGImage.Create;
  try
    Bmp := TBitmap.Create;
    try
      Bmp.Width := R.Width;
      Bmp.Height := R.Height;
      can := TCanvas.Create;
      try
        dc := GetWindowDC(0);
        can.Handle := dc;
        try
          Bmp.Canvas.CopyRect(R, can, R);
        finally
          can.Handle := 0;
          ReleaseDC(0, dc);
        end;
      finally
        can.Free;
      end;
      Jpg.Assign(Bmp);
    finally
      Bmp.Free;
    end;
    Jpg.CompressionQuality := 50;
    Jpg.SaveToStream(Stream);
  finally
    Jpg.Free;
  end;
end;

procedure TDesktop.Button1Click(Sender: TObject);
var
  ImageStrm: TBytesStream;
  Student: String;
  Packet: TIdBytes;
  Offset, ImageLen, StudentLen: Integer;
begin
  ImageStrm := TBytesStream.Create;
  try
    ScreenshotToJpgStream(ImageStrm);
    ImageLen := ImageStrm.Size;

    Student := 'student';
    StudentLen := TIdTextEncoding.UTF8.GetByteCount(Student);

    SetLength(Packet, (SizeOf(Integer)*2) + ImageLen + StudentLen);
    Offset := 0;

    CopyTIdLongInt(ImageLen, Packet, Offset);
    Inc(Offset, 4);
    CopyTIdByteArray(ImageStrm.Bytes, 0, Packet, Offset, ImageLen);
    Inc(Offset, ImageLen);
    CopyTIdLongInt(StudentLen, Packet, Offset);
    Inc(Offset, 4);
    CopyTIdString(Student, Packet, Offset, -1, TIdTextEncoding.UTF8);
  finally
    ImageStrm.Free;
  end;

  IdUDPClient1.SendBuffer('127.0.0.1', Port, Packet);
end;

procedure TDesktop.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
  AData: array of Byte; ABinding: TIdSocketHandle);
type
  PIdBytes = ^TIdBytes;
var
  ImageStrm: TIdMemoryStream;
  Student: String;
  Offset, Len: Integer;
begin
  Offset := 0;

  Len := BytesToLongInt(PIdBytes(@AData)^, Offset);
  Inc(Offset, 4);

  Assert(Length(AData) >= (Offset+Len));

  ImageStrm := TIdMemoryStream.Create(@AData[Offset], Len);
  try
    Inc(Offset, Len);

    Len := BytesToLongInt(PIdBytes(@AData)^, Offset);
    Inc(Offset, 4);
    Student := BytesToString(PIdBytes(@AData)^, Offset, Len, TIdTextEncoding.U2TF8);

    Caption := Student;
    Jpg := TJPEGImage.Create;
    try
      Jpg.LoadFromStream(ImageStrm);
      Jpg.SaveToFile('E:\1.jpg');
    finally
      Jpg.Free;
    end;
  finally
    ImageStrm.Free;
  end;
end;
Remy Lebeau
  • 555,201
  • 31
  • 458
  • 770