![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как отправить файл по сети? [D6, D7, Win95/98, WinME, NT4, Win2k, WinXP]
13-th Warrior © (2004-03-20 19:28:00)Может здесь кто нибуть поможет? Плиззз!
Как отправить файл по сети?
Александр1 (2004-03-24 20:20:00) [1]Удалено модератором
Примечание: Оффтоп...
(2004-03-24 00:57:00) [2]Удалено модератором
Yermek (2004-03-23 23:00:00) [3]Держи, ссылку не нашел так что...
99,9% работает
серверная часть
procedure SentFile;
var
P: ^Byte;
MS:TMemoryStrim
j:Integer;
ac:Integer;
begin
// Создаём буфер клиента для файла
MS := TMemoryStream.Create;
// Загружаем файл в буфер
MS.LoadFromFile('путь+имя файла');
ServerSocket1.Socket.Connections[j].SendText('file#' + name + '#'+IntToStr(MS.Size)+'#');
// Переводим каретку в начало файла
MS.Position := 0;
// Загружаем в переменную "P" файл
P := MS.Memory;
// Посылаем файл клиету
ServerSocket1.Socket.Connections[0].SendBuf(P^, MS.Size);
// записываем в журнал
end;
клиентская часть
...
private
Name: string; // Имя файла
Size: integer; // Размер файла
Receive: boolean; // Режим клиента
MS: TMemoryStream; // Буфер для файла
{ процедура сохраняет принятые данные из сети в файл }
procedure Writing(Text: string);
begin
// Если принято байт меньше размера файла, то записываем в буфер
if MS.Size < Size then MS.Write(Text[1], Length(Text));
// Выводим прогресс закачки файла
Gauge1.Progress :=MS.Size;// MS.Size*100 div Size;
//StatusBar1.SimpleText := 'Принято '+IntToStr(MS.Size)+' из '+IntToStr(Size);
// Если файл принят, то...
if MS.Size = Size then
begin
Receive := false; // Переводим клиента в нормальный режим
MS.Position := 0; // Переводим каретку в начало буфера
MS.SaveToFile(name); // Сохраняем файл
ClientSocket1.Socket.SendText('end'); // Посылаем команду "end", то есть файл принят
MS.Free; // Убиваем буфер
//StatusBar1.SimpleText := 'Файл принят';
Panel3.Visible:=false;
end;
end;
procedure TfmSelectTest.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
sr_text: string; // Принятый текст
begin
sr_text := Socket.ReceiveText;
// Если клиент в режиме приёма файла, то...
if Receive then
// Записываем данные в буфер
Writing(sr_text)
// Если клиент не в режиме приёма файла, то...
else
begin
// если сервер посылает файл то...
if Copy(sr_text,0,Pos('#',sr_text)-1)='file' then // Если это файл, то...
begin
// Создаём буфер для файла
MS :=TMemoryStream.Create;
// Определяем имя файла
Delete(sr_text,1,Pos('#',sr_text));
// Определяем имя файла
Name :=Copy(sr_text,0,Pos('#',sr_text)-1);
// Определяем размер файла
Delete(sr_text, 1, Pos('#', sr_text));
// Определяем размер файла
Size := StrToInt(Copy(sr_text, 0, Pos('#', sr_text) -1));
Panel3.Visible:=True;
// Удаляем последний разделитель
Delete(sr_text, 1, Pos('#', sr_text));
// Выводим размер файла
Label1.Caption := 'Размер файла: '+IntToStr(Size)+' байт';
// Выводим имя файла
Label2.Caption := 'Имя файла: '+Name;
// Переводим сервер в режим приёма файла
Receive := true;
// Записываем данные в буфер
Writing(sr_text);
end;
end;
end;
13-th Warrior (2004-03-21 18:32:00) [4]Любым, лишь бы полегче
Rezya (2004-03-21 17:11:00) [5]Смотря каким образом ты хочешь это сделать.
ClientSocket or ServerSocket или WinApi Socket или какм либо другим способом?