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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.08.2009, 21:43   #1
D_E_N
Форумчанин
 
Регистрация: 04.05.2009
Сообщений: 149
По умолчанию Клиент файл принимает но не сохраняет

Привет всем. вообщем соеденяется файл вроде принимает но не сохраняет в чем проблема?

Код:
program clienttt;
{$APPTYPE CONSOLE}

uses
  Windows,
  SysUtils,
  Classes,
  ScktComp;

type
clnSock=class
cln:TClientSocket;
procedure ClientRead_2(Sender: TObject;Socket: TCustomWinSocket);
procedure Writing(Text: string);
public
constructor Create;
destructor Destroy; override;
end;

{clnSock}

  constructor clnSock.Create;
  var
  Receive: boolean; // Режим клиента
  Begin
    inherited Create;
      cln:=TclientSocket.Create(nil);
      cln.clientType:=ctNonBlocking;

      cln.Address:='192.168.1.2';
      cln.Port:=8080;
      cln.OnRead:=ClientRead_2;

       Receive := false;
       cln.Active:=true;  // Режим клиента - приём команд
  End;

      destructor clnSock.Destroy;
  Begin
    cln.Free;
    inherited Destroy;
  End;





procedure clnsock.Writing(Text: string);
var
Name: string; // Имя файла
Size: integer; // Размер файла
Receive: boolean; // Режим клиента
MS: TMemoryStream; // Буфер для файла
begin
writeln('save');
if MS.Size < Size then // Если принято байт меньше размера файла, то...
MS.Write(Text[1], Length(Text)); // Записываем в буфер
// Выводим прогресс закачки файла

if MS.Size = Size then // Если файл принят, то...
begin
Receive := false; // Переводим клиента в нормальный режим
MS.Position := 0; // Переводим каретку в начало буфера

MS.SaveToFile(Name); // Сохраняем файл
cln.Socket.SendText('end'); // Посылаем команду "end", то есть файл принят
MS.Free; // Убиваем буфер

end;
end;


procedure clnSock.ClientRead_2(Sender: TObject;
Socket: TCustomWinSocket);
var
Name: string;
Receive: boolean;
MS: TMemoryStream;
Rtext: string; // Принятый текст
Size: integer;
begin

Rtext := Socket.ReceiveText;
if Receive then // Если клиент в режиме приёма файла, то...
Writing(RText) // Записываем данные в буфер
else // Если клиент не в режиме приёма файла, то...
if Copy(Rtext, 0, Pos('#', Rtext) -1) = 'file' then // Если это файл, то...
begin MS := TMemoryStream.Create; // Создаём буфер для файла
Delete(Rtext, 1, Pos('#', Rtext)); // Определяем имя файла
Name := Copy(Rtext, 0, Pos('#', Rtext) -1); // Определяем имя файла
Delete(Rtext, 1, Pos('#', Rtext)); // Определяем размер файла
Size := StrToInt(Copy(Rtext, 0, Pos('#', Rtext) -1)); // Определяем размер файла
Delete(Rtext, 1, Pos('#', Rtext)); // Удаляем последний разделительйла
writeln(size);
Receive := true; // Переводим сервер в режим приёма файла
Writing(RText); // Записываем данные в буфер

end;
end;




var
  Client1:clnsock;
  Msg:TMsg;


  begin
   client1 := clnSock.Create;
   try
    while GetMessage(MSG, 0, 0, 0) do
      begin
        TranslateMessage(msg);
        DispatchMessage(msg);
      end;
  finally
  readln;
  Client1.Free;
  end;
  readln;
end.
D_E_N вне форума Ответить с цитированием
Старый 05.08.2009, 22:23   #2
bill_gates
Ненависник Windows
Пользователь
 
Аватар для bill_gates
 
Регистрация: 04.07.2009
Сообщений: 82
По умолчанию

Цитата:
procedure clnsock.Writing(Text: string);
var
Name: string; // Имя файла

...

procedure clnSock.ClientRead_2(Sender: TObject;
Socket: TCustomWinSocket);
var
Name: string;
Чтото мне кажется, что он и не будет работать. Может стоит Name занести в глобальные переменные?

Код:
...
constructor Create;
destructor Destroy; override;
end;

var Name:String;

{clnSock}

  constructor clnSock.Create;
  var
  Receive: boolean; // Режим клиента
  Begin
...
if Вопрос.Возник then begin if Google.Поиск=false then begin СоздатьТопик; end; end;

if ДругойЮзер.Помог then begin НажатьНаВесы end;
bill_gates вне форума Ответить с цитированием
Старый 05.08.2009, 22:54   #3
D_E_N
Форумчанин
 
Регистрация: 04.05.2009
Сообщений: 149
По умолчанию

спасибо за помощь.
D_E_N вне форума Ответить с цитированием
Старый 06.08.2009, 00:10   #4
D_E_N
Форумчанин
 
Регистрация: 04.05.2009
Сообщений: 149
По умолчанию

а как сохранить файл рядом с программой? ато сервак передает полный путь например D:\123\123.exe
D_E_N вне форума Ответить с цитированием
Старый 06.08.2009, 00:18   #5
bill_gates
Ненависник Windows
Пользователь
 
Аватар для bill_gates
 
Регистрация: 04.07.2009
Сообщений: 82
По умолчанию

юзай ExtractFilePath(Application.Exename );

Возвращает путь проги
if Вопрос.Возник then begin if Google.Поиск=false then begin СоздатьТопик; end; end;

if ДругойЮзер.Помог then begin НажатьНаВесы end;
bill_gates вне форума Ответить с цитированием
Старый 06.08.2009, 07:21   #6
D_E_N
Форумчанин
 
Регистрация: 04.05.2009
Сообщений: 149
По умолчанию

вот тока не пойму как её туда прицепить. не подскажешь?

Код:
begin
Receive := false; // Переводим клиента в нормальный режим
MS.Position := 0; // Переводим каретку в начало буфера

MS.SaveToFile(Name); // Сохраняем файл
cln.Socket.SendText('end'); // Посылаем команду "end", то есть файл принят
MS.Free; // Убиваем буфер

end;
D_E_N вне форума Ответить с цитированием
Старый 06.08.2009, 08:14   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
MS.SaveToFile(ExtractFilePath(Application.Exename )+Name);
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.08.2009, 09:37   #8
D_E_N
Форумчанин
 
Регистрация: 04.05.2009
Сообщений: 149
По умолчанию

не получается. пробовал даже extractfilepath(paramstr(0)) а толку нет получается он добовляет имя файла туда ещё D:\123\*D:\123\123.exe по этому пути он хочет сохранить файл. а можно как нить подредактировать имя передаваемое сервером или даже на сервере убрать лишнее и оставить тока имя файла и расширение?

Последний раз редактировалось D_E_N; 06.08.2009 в 09:44.
D_E_N вне форума Ответить с цитированием
Старый 06.08.2009, 10:29   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
не получается
Ну и что мешает узнать что в name содержится и скорректировать верно?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.08.2009, 10:53   #10
D_E_N
Форумчанин
 
Регистрация: 04.05.2009
Сообщений: 149
По умолчанию

мои маленькие познания в delphi. пробовал воттак тока вместо rtext ставил name но не получается подскажи как надо?

Код:
Delete(Rtext, 1, Pos('#', Rtext)); // Определяем имя файла
Name := Copy(Rtext, 0, Pos('#', Rtext) -1); // Определяем имя файла
Delete(Rtext, 1, Pos('#', Rtext)); // Определяем размер файла
Size := StrToInt(Copy(Rtext, 0, Pos('#', Rtext) -1)); // Определяем размер файла
Delete(Rtext, 1, Pos('#', Rtext)); // Удаляем последний разделительйла
D_E_N вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Инди не принимает куки schnaps Работа с сетью в Delphi 2 14.07.2009 16:18
Возможно-ли Клиент-серверное приложение типа Клиент(Pascal) а сервер(CGI)? Demol Работа с сетью в Delphi 1 21.04.2009 16:18
SaveDialog не сохраняет правильно Shouldercannon Общие вопросы Delphi 7 16.06.2008 02:14
Дельфи не принимает лицензию... Dj_smart Свободное общение 5 09.05.2008 11:16