как передать картинку от клиента к серверу по УДП

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Leon2009, 10 Nov 2011.

  1. Leon2009

    Leon2009 New Member

    Joined:
    1 Sep 2009
    Messages:
    44
    Likes Received:
    0
    Reputations:
    0
    Здравствуйте! подскажите как передать картинку от IdUDPClient1 к IdUDPServer1 чтобы на IdUDPServer1 отобразилась в image1.
    Code:
    var
      MemStream  : TMemoryStream;
    begin
      MemStream:= TMemoryStream.Create;
      MemStream.LoadFromFile(Edit1.Text);
      IdUDPClient1.SendBuffer(MemStream.Memory^,MemStream.Size);
      MemStream.Free;
    
    когда передаю *zip или *rar, тхт все нормально, а вот файлы jpg или bmp вылазиет ошибка
    error image
    Спасибо!
     
    #1 Leon2009, 10 Nov 2011
    Last edited: 10 Nov 2011
  2. Steam[777]

    Steam[777] Elder - Старейшина

    Joined:
    27 Sep 2010
    Messages:
    296
    Likes Received:
    43
    Reputations:
    25
    А ты принятый файл для начала сохрани на диск, попробуй открыть каким-либо стандартным вьювером, или просто сравни,чем он от оригинала отличается - думаю, сразу видно будет в чем проблема
     
  3. Leon2009

    Leon2009 New Member

    Joined:
    1 Sep 2009
    Messages:
    44
    Likes Received:
    0
    Reputations:
    0
    image

    другими прогами картинка открываеться acds. через паинт сделал рисунок и попробывал также отправить на bmp ругаться стал, размер не устроил, а на jpg вообще молчит.
    error bmp
     
  4. Steam[777]

    Steam[777] Elder - Старейшина

    Joined:
    27 Sep 2010
    Messages:
    296
    Likes Received:
    43
    Reputations:
    25
    Сравни отправленные и полученные файлы (размеры,содержимое, если надо) и поймешь в чем проблема
     
  5. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    максимальный размер пакета 64 кб. на винде бывают проблемы уже с размером в 16 кб. пробуй методом тыка, какой размер пакета пойдёт.
     
    #5 BrainDeaD, 10 Nov 2011
    Last edited: 10 Nov 2011
  6. Leon2009

    Leon2009 New Member

    Joined:
    1 Sep 2009
    Messages:
    44
    Likes Received:
    0
    Reputations:
    0
    теперь понил, доходит только половина картинки.
    Клиент
    Code:
    procedure TForm1.seti;
    var
      MemStream  : TMemoryStream;
      buf : array[1..40000] of Char;
    begin
    bmp:= TBitmap.Create;
    Jpg:= TJpegImage.Create;
    bmp.Height:=Screen.Height;
    bmp.Width:=Screen.Width;
    DC:=GetDC(0);
    PatBlt(Form1.Canvas.Handle, 0, 0, Form1.ClientWidth, Form1.ClientHeight, WHITENESS);
    bitblt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, DC, 0, 0, SRCCOPY);
      Jpg.Assign(Bmp);
      jpg.CompressionQuality:=8;
      jpg.Compress;
    ReleaseDC(0, DC);
     try
      MemStream:= TMemoryStream.Create;
      jpg.SaveToStream(MemStream);
       For I:=0 to 10 do
      Begin
    MemStream.Position := 0;
    IdUDPClient1.SendBuffer(MemStream.Memory^,MemStream.Size);
    {IdUDPClient1.SendBuffer(MemStream.Memory^, 64512);}
    MemStream.Position:=0;
    Application.ProcessMessages;
    end;
    finally
    MemStream.Free;
    jpg.Free;
    Bmp.Free;
    end;
    end;
    ------------------------------------------
    procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
      var t:string; StrStream: TStringStream;
    begin
    if AData.Size<=8 then
      begin
        StrStream:=TStringStream.Create('');
        StrStream.CopyFrom(AData, AData.Size);
        if StrStream.DataString='otpravka' then  seti;
    end;
    end;
    
    Сервер
    Code:
    procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
    var
    txt1,s,sl:string; t1,jcnt:integer;
    StrStream: TStringStream;
    MemStream: TMemoryStream; jpg: TJpegImage;
    begin  
      if AData.Size<=16 then
      begin
        StrStream:=TStringStream.Create('');
        StrStream.CopyFrom(AData, AData.Size);
        ListBox1.Items.Add(StrStream.DataString);
    t1:=0;
      repeat  
        jcnt:=ListBox1.Items.Count-1;
        repeat
           if (ListBox1.Items[jcnt]=ListBox1.Items[t1]) and
               (jcnt<>t1)
             then begin
             ListBox1.Items.Delete(jcnt);
             ListBox1.Items.Delete(t1);
             end;
           Dec(jcnt)
        until jcnt<=t1;
        Inc(t1)
      until t1>ListBox1.Items.Count-1;
    Application.ProcessMessages;
        StrStream.Free;
      end else 
      if AData.Size > 0 then
      begin       
        jpg :=      TJPEGImage.Create;
        MemStream:= TMemoryStream.Create;
        MemStream.CopyFrom(AData, AData.Size);
        MemStream.Position := 0;
        jpg.LoadFromStream(MemStream);
        Image1.Picture.Graphic := jpg;
        MemStream.Free;                 
        jpg.Free;
      end;end;
    ---------------------------------
    IdUDPClient1.Active:=true;
    try 
    IdUDPClient1.Send('otpravka');
    finally
    IdUDPClient1.Active:=false;
    end;
    как передать кусочками? может кто подскажет?