Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.05.2011, 00:18
Аватар для Crabber
Crabber Crabber вне форума
Прохожий
 
Регистрация: 14.10.2009
Сообщения: 8
Версия Delphi: 7
Репутация: 10
Восклицание Передача файлов через ServerSocket/ClientSocket

Возникли проблемы при передаче файлов jpg, bmp, mp3, exe от сервера клиенту. Сервер успешно принимает только текстовые файлы. При попытке принять мультимедийные и исполняемые файлы клиент выводит ошибки с несуразным бредом, в следствии чего принятый файл не пригоден для использования. Хотя размер файла при этом не отличается от размера файла который был передан сервером. Может кто подскажет каким образом можно реализовать передачу jpg, bmp, mp3, exe файлов с помощью данных компонетнов?

Тип сервера: stNonBlocking

Код сервера (отправка файла):

Код:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
   ms: TMemoryStream;
begin
  {Если от клиента пришла комманда серверу}
  client_msg:= Socket.ReceiveText;

  if client_msg = 'send' then
  begin
    ms:= TMemoryStream.Create;
  try
    ms.LoadFromFile('D:\1.exe');
    ms.Position:= 0;
    // Добавляем длину данных, чтобы клиент знал, сколько данных будет
    // передано. Добавляем #0 , чтобы можно было определить, где
    // заканчивается информация о размере.
    Socket.SendText(IntToStr(ms.Size) + #0);
    // Посылаем его
    Socket.SendStream(ms);
  except
      // освободить поток, если что-то не так.
      ms.Free;
  end;
end;


Код клиента (приём файла):

Код:
procedure TForm1.Button2Click(Sender: TObject);
begin
// Отправляем команду на сервер для начала передачи файла
ClientSocket1.Socket.SendText('send');
end;


procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
  s, sl: String;
  Data: TMemoryStream;
  DataSize: Integer;
  Reciving: boolean;
begin
    s:= Socket.ReceiveText;
    if not Reciving then
    begin
      // получаем длину потока данных.
      SetLength(sl, StrLen(PChar(s))+1);
      StrLCopy(@sl[1], PChar(s), Length(sl)-1);
      DataSize:= StrToInt(sl);
      Data:= TMemoryStream.Create;
      Delete(s, 1, Length(sl));
      Reciving:= True;
    end;
    try
      Data.Write(s[1], length(s));
    if Data.Size = DataSize then
      begin
        Data.Position:= 0;
        Data.SaveToFile('C:\123.exe');
        Data.Free;
        Reciving:= False;
      end;
  except
     Data.Free;
  end;
end;

Последний раз редактировалось Admin, 23.05.2011 в 09:32.
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:21.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter