Возникли проблемы при передаче файлов
jpg, bmp, mp3, exe от сервера клиенту. Сервер успешно принимает только
текстовые файлы. При попытке принять
мультимедийные и и
сполняемые файлы клиент выводит ошибки с несуразным бредом, в следствии чего принятый файл
не пригоден для использования. Хотя размер файла при этом не отличается от размера файла который был передан сервером. Может кто подскажет каким образом можно реализовать передачу j
pg, 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;