Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2013, 02:41   #1
oteccc
Пользователь
 
Регистрация: 13.11.2013
Сообщений: 37
По умолчанию передача файла

передаю картинку ошибок ни каких не вылезает, вот только не знаю как сохранить эту картинку себе на комп или в image1 ее вывести помогите

клиент:


Код:
procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
  var
     l: integer;
     buf: PChar;
     src: TFileStream;


begin

  l:= socket.ReceiveLength;


  GetMem(buf, l+1);

 
  Socket.ReceiveBuf(buf, l);


  src:= TFileStream.Create('asd.jpg', fmOpenReadWrite);

  src.Seek(0, soFromEnd);


  src.WriteBuffer(buf, l);

  image1.Picture.Bitmap.Create.LoadFromStream(src);




  src.Free;

  FreeMem(buf);

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Host:= '127.0.0.1';
ClientSocket1.Open;

end;



сервер:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
   filename: string;
   srcfile: TFileStream;

begin

  srcfile:= TFileStream.Create('C:\Users\Samsung\Desktop\картинка\1.jpg', fmOpenRead);


  ServerSocket1.Socket.SendStream(srcfile);
  srcfile.Free;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Open;
end;


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 10.12.2013 в 09:08.
oteccc вне форума Ответить с цитированием
Старый 10.12.2013, 12:37   #2
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

а картинка не сразу прилетит а постепенно... и каждый кусочек вызовет ClientSocket1Read где этот кусочек нужно аккуратно сложить воедино и только когда все прилетит (а как об этом узнать? - домашнее задание) выводить в image1.Picture.LoadFromStream(src);

ах да это касается неблокирующего режима... в блокирующем, как мне кажется, все проще, особенно для прямолинейно мыслящих новичков
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 10.12.2013 в 12:43.
Slym вне форума Ответить с цитированием
Старый 10.12.2013, 13:02   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
как сохранить эту картинку себе на комп или в image1
Посмотри внимательно пример, который я давал в твоей предидущей теме. Там используется цикл для считывания пакетов, пришедших на сеть, крутящийся пока их можно считать. Socket.ReceiveBuf(buf, l); не считывает полностью все что пришло. Он считывает только часть того что уже успело прийти. Эта проблема склейки пакетов. Частично она решается примерно так: http://delphiworld.narod.ru/_all_articles_.html (раздел Сокеты - [27])

Однако на твоем месте я бы этот компонент не использовал (тем паче что и склейка не всегда дает гарантию полного прихода всех данных). Для передачи файлов по сети удобнее использовать компонент IdFTP из Инди.
Если же всетки ну очень хочется использовать классические сокеты, то нужно много литературы прочитать, чтоб понять как именно они должны правильно работать, а поскольку с предидущей темой ты не разобрался рекомендую прислушаться к моим советам и пересесть на компоненты INDY
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.12.2013, 13:13   #4
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Эта проблема склейки пакетов.
Это проблема прямоты рук на самом деле, в блокирующем режиме этой проблемы нет или она минимальна.
Цитата:
Сообщение от Stilet Посмотреть сообщение
тем паче что и склейка не всегда дает гарантию полного прихода всех данных
не надо наговаривать на компонент! он прост как отвертка - и от него руки устают, инди проще в использовании как шуруповерт
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 10.12.2013, 14:41   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
в блокирующем режиме этой проблемы нет или она минимальна.
К сожалению есть и там )
Цитата:
инди проще в использовании как шуруповерт
Вот потому я и предлагаю его автору. Ему же проще будет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.12.2013, 14:45   #6
oteccc
Пользователь
 
Регистрация: 13.11.2013
Сообщений: 37
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
К сожалению есть и там )

Вот потому я и предлагаю его автору. Ему же проще будет.
можешь скинуть какую-нибудь статью про ftp где все описанно
oteccc вне форума Ответить с цитированием
Старый 10.12.2013, 15:27   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Нет. Могу только кинуть такое:
http://yandex.ua/yandsearch?text=IdF...ammersforum.ru
Плюс пара легких примеров от меня:

Клиент
Код:
  ftp.Host:=Value;
  try
   ftp.Connect;

 if ftp.Connected then 
 try
  ftp.Put('d:\1\файл.bmp','файл.bmp');
  ShowMessage('Передато');
 except
   on e:exception do begin
    ShowMessage(e.Message);
   end;
 end; 

  except
   on e:exception do begin
    ShowMessage(e.Message);
   end;
и сервер (вернее его событие получения файла):
Код:
procedure TForm1.FtpServerStoreFile(ASender: TIdFTPServerContext;
  const AFileName: string; AAppend: Boolean; var VStream: TStream);
begin
// Если сохранить в файл:
 VStream:=TFileStream.Create('d:\файл.bmp',fmCreate);

// Если просто получить поток
 VStream:=TMemoryStream.Create();
 
//Потом загружать VStream в какой нить Image уже его средствами
end;
Для этого на форме должен быть IdFTP на клиенте и IdFTPServer на сервере.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.12.2013, 22:55   #8
oteccc
Пользователь
 
Регистрация: 13.11.2013
Сообщений: 37
По умолчанию

спасибо большое помог с ftp реально быстрее
oteccc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача файла по сокетам grorg Работа с сетью в Delphi 8 23.09.2012 19:41
Передача файла by_Trojan C# (си шарп) 6 03.05.2012 12:26
Передача файла xil C# (си шарп) 0 14.11.2011 19:00
Передача файла.... prizrak1390 Работа с сетью в Delphi 1 23.12.2008 09:58