|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Передача файлов через 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. |