Как передать картинку по сети через ServerSocket?

Материал из DRKB


Со стороны, откуда посылаем (у нас это клиент), пишем:

var
  st: TStream;
begin
  st := TFileStream.Create('M:\\MyFile.jpg', fmOpenRead);
  // ИЛИ, если мы работаем без сохранения (тогда не создается файл)
  st := TMemoryStream.Create();
  try
    st.Position := 0;
    Image1.Picture.Bitmap.SaveToStream(st);
    // и, наконец, шлем на сервер битмап
    st.Position := 0;
    ClientSocket1.Socket.SendStream(st);
  finally
    st.Free();
  end;
end;


Обратите внимание, не забывайте перед каждой операцией с потоком устанавливать позицию в 0!!! Иначе получим не то, что хотелось бы Ну а со стороны приема (у нас это, соответственно, серверсокет), в событии приема пишем:

var
  ibLen: Integer;
  buf: AnsiString;
  st: TStream;
begin
  ibLen := ServerSocket1.Socket.ReceiveLength();
  if ibLen > 0 then
  begin
    SetLength(buf, ibLen + 1);
    st := TMemoryStream.Create();
    try
      st.Position := 0;
      ServerSocket1.Socket.ReceiveBuf(buf[1], ibLen);
      st.WriteBuffer(buf[1], ibLen);
      st.Position := 0;
      Image1.Picture.Bitmap.LoadFromStream(st);
      // или
      st.SaveToFile('M:\\MyFile.jpg');
    finally
      st.Free();
    end;
  end;
end;


Author: TwoK
Source: Vingrad.ru http://forum.vingrad.ru
ID: 03545