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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2009, 13:06   #1
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию Передача файлов по сети

Ребят помогите пожалуйста. Необходимо каждую допустим минуту отправлять файл на другой компьютер как это сделать?
Мои наработки:
сервер:
Код:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,Registry,ShellAPI,IniFiles,ScktComp;
type
  TForm_Client_sec = class(TForm)
    ServerSocket1: TServerSocket;
    procedure FormCreate(Sender: TObject);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form_Client_sec: TForm_Client_sec;
implementation
{$R *.dfm}
procedure TForm_Client_sec.FormCreate(Sender: TObject);
var
  i:integer;
  reg:Tregistry;
  f:Tinifile; //файл config.ini
  my_path:string;
  my_time:string;
  p_time:integer;
begin
{
                            работа с ini-файлом
}
  f:=TiniFile.Create(extractfilepath(Application.ExeName)+'config.ini');
  my_path:=f.ReadString('conf','path','D:\MyWork\WinSec\client_sec');
  my_time:=f.ReadString('conf','time','2000');
{
                            добавление в реестр
}
try
  reg:=TRegistry.Create;
  reg.RootKey:=HKEY_LOCAL_MACHINE;
  reg.OpenKey('SoftWare\Microsoft\Windows\CurrentVersion\Run',false);
  if not reg.ValueExists('Client_sec') then
    begin
    reg.WriteString('Client_sec',application.ExeName);
    reg.CloseKey;
  end;
finally
  reg.Free;
{
                            вызов bat-файла
}
  i:=0;
  while i=0 do
  begin
    p_time:=StrToInt(my_time);
    sleep(p_time);
    ShellExecute(self.Handle,nil,'client_con.bat',nil,nil,SW_RESTORE);
//так понимаю здесь надо начать отпправку но как
end;
end;
end;

procedure TForm_Client_sec.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
Var
  fs: TFileStream;
  Data: TMemoryStream;
begin
  if Socket.ReceiveText = 's' then
begin
  fs:=TFileStream.Create('1.txt', fmOpenRead);
try
  fs.Position:= 0;
  Socket.SendText('Size:'+IntToStr(fs.Size)+ #0);
  Socket.SendStream(fs);
Finally
end;
end;

end;
end.
Клиент:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,IniFiles,ShellAPI,Registry,ScktComp;

type
  TForm_Server_sec = class(TForm)
    ClientSocket1: TClientSocket;
    procedure FormCreate(Sender: TObject);
    procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private declarations }

  public
    { Public declarations }
        fs: TFileStream;
    Reciving:Boolean;
    DataSize: integer;
  end;

var
  Form_Server_sec: TForm_Server_sec;

implementation

{$R *.dfm}

procedure TForm_Server_sec.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Socket.SendText('s');
end;

procedure TForm_Server_sec.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
Var
  s, sl: String;
Begin
  s:= Socket.ReceiveText;
  if Reciving then
  Begin
    fs.Write(s[1],length(s));
    if fs.Size=DataSize then
    Begin
      fs.Free;
      Reciving:=False;
      Application.MessageBox('Поздравляю, Фаил принят', 'Внимание!!!');
    End;
    //Exit;
  End;
  if copy(s, 1, 5)='Size:' then
  Begin
    sl:=copy(s, 6, Pos(#0, s)-6);
    DataSize:=StrToInt(sl);
    Delete(s, 1, Pos(#0, s));
    Reciving:=True;
    fs:=TFileStream.Create('1.txt',fmCreate);
    fs.Write(s[1], length(s));
End;
End;


procedure TForm_Server_sec.FormCreate(Sender: TObject);
var
  i:integer;
  reg:Tregistry;
  f:Tinifile; //файл config.ini
  my_path:string;
  my_time:string;
  p_time:integer;
begin
{
                            работа с ini-файлом
}
  f:=TiniFile.Create(extractfilepath(Application.ExeName)+'config.ini');
  my_path:=f.ReadString('conf','path','D:\MyWork\WinSec\');
  my_time:=f.ReadString('conf','time','2001');
{
                            добавление в реестр
}
try
  reg:=TRegistry.Create;
  reg.RootKey:=HKEY_LOCAL_MACHINE;
  reg.OpenKey('SoftWare\Microsoft\Windows\CurrentVersion\Run',false);
  if not reg.ValueExists('Server_sec') then
    begin
    reg.WriteString('Server_sec',my_path+'Server_sec.exe');
    reg.CloseKey;
  end;
finally
  reg.Free;
{
                            вызов bat-файла
}
  i:=0;
  while i=0 do
  begin
    p_time:=StrToInt(my_time);
    sleep(p_time);
    ShellExecute(self.Handle,nil,'server_con.bat',nil,nil,SW_RESTORE);
//так понимаю здесь надо начать отпправку но как
  end;
end;
end;

end.
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 31.10.2009, 13:52   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
Необходимо каждую допустим минуту отправлять файл на другой компьютер как это сделать? Мои наработки
...что конкретно не работает? Socket.SendStream(fs) ?

...еще как альтернативный вариант: обязательно-ли это делать через сокеты? ведь можно просто скопировать на удаленный расшаренный ресурс и обойтись 1 программой (...даже в батнике пару строк xcopy).
или доступ закрыт? критику принимаю, мож условия у вас не позволяют
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 31.10.2009 в 13:55.
raxp вне форума Ответить с цитированием
Старый 31.10.2009, 14:20   #3
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

я немного подправила теперь файл передается 1 раз, как сделать так чтобы он передовался через определенное время
Сервер:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,Registry,ShellAPI,IniFiles,ScktComp;

type
  TForm_Client_sec = class(TForm)
    ServerSocket1: TServerSocket;
    procedure FormCreate(Sender: TObject);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
      fs: TFileStream;
  end;

var
  Form_Client_sec: TForm_Client_sec;

implementation

{$R *.dfm}

procedure TForm_Client_sec.FormCreate(Sender: TObject);
var
  i:integer;
  reg:Tregistry;
  f:Tinifile; //файл config.ini
  my_path:string;
  my_time:string;
  p_time:integer;
begin
{---------------------------------------------------------------------
                            работа с ini-файлом
----------------------------------------------------------------------}
  f:=TiniFile.Create(extractfilepath(Application.ExeName)+'config.ini');
  my_path:=f.ReadString('conf','path','D:\MyWork\WinSec\client_sec');
  my_time:=f.ReadString('conf','time','2000');
{---------------------------------------------------------------------
                            добавление в реестр
----------------------------------------------------------------------}
try
  reg:=TRegistry.Create;
  reg.RootKey:=HKEY_LOCAL_MACHINE;
  reg.OpenKey('SoftWare\Microsoft\Windows\CurrentVersion\Run',false);
  if not reg.ValueExists('Client_sec') then
    begin
    reg.WriteString('Client_sec',application.ExeName);
    reg.CloseKey;
  end;
finally
  reg.Free;
{---------------------------------------------------------------------
                            вызов bat-файла
----------------------------------------------------------------------}
end;
end;

procedure TForm_Client_sec.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
Var

  Data: TMemoryStream;
begin
  if Socket.ReceiveText = 's' then
begin
  ShellExecute(self.Handle,nil,'client_con.bat',nil,nil,SW_RESTORE);
  fs:=TFileStream.Create('1.txt', fmOpenRead);
try
  fs.Position:= 0;
  Socket.SendText('Size:'+IntToStr(fs.Size)+ #0);
  Socket.SendStream(fs);
Finally
end;
end;

end;
end.
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 31.10.2009, 14:21   #4
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

клиент:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,IniFiles,ShellAPI,Registry,ScktComp;

type
  TForm_Server_sec = class(TForm)
    ClientSocket1: TClientSocket;
    procedure FormCreate(Sender: TObject);
    procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private declarations }

  public
    { Public declarations }
        fs: TFileStream;
    Reciving:Boolean;
    DataSize: integer;
  end;

var
  Form_Server_sec: TForm_Server_sec;

implementation

{$R *.dfm}

procedure TForm_Server_sec.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Socket.SendText('s');
end;

procedure TForm_Server_sec.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
Var
  s, sl: String;
Begin
  s:= Socket.ReceiveText;
  if Reciving then
  Begin
    fs.Write(s[1],length(s));
    if fs.Size=DataSize then
    Begin
      fs.Free;
      Reciving:=False;
      Application.MessageBox('Поздравляю, Фаил принят', 'Внимание!!!');
    End;
    Exit;
  End;
  if copy(s, 1, 5)='Size:' then
  Begin
    sl:=copy(s, 6, Pos(#0, s)-6);
    DataSize:=StrToInt(sl);
    Delete(s, 1, Pos(#0, s));
    Reciving:=True;
    fs:=TFileStream.Create('1.txt',fmCreate);
    fs.Write(s[1], length(s));
End;
End;


procedure TForm_Server_sec.FormCreate(Sender: TObject);
var
  i:integer;
  reg:Tregistry;
  f:Tinifile; //файл config.ini
  my_path:string;
  my_time:string;
  p_time:integer;
begin
{---------------------------------------------------------------------
                            работа с ini-файлом
----------------------------------------------------------------------}
  f:=TiniFile.Create(extractfilepath(Application.ExeName)+'config.ini');
  my_path:=f.ReadString('conf','path','D:\MyWork\WinSec\');
  my_time:=f.ReadString('conf','time','2001');
{---------------------------------------------------------------------
                            добавление в реестр
----------------------------------------------------------------------}
try
  reg:=TRegistry.Create;
  reg.RootKey:=HKEY_LOCAL_MACHINE;
  reg.OpenKey('SoftWare\Microsoft\Windows\CurrentVersion\Run',false);
  if not reg.ValueExists('Server_sec') then
    begin
    reg.WriteString('Server_sec',my_path+'Server_sec.exe');
    reg.CloseKey;
  end;
finally
  reg.Free;
{---------------------------------------------------------------------
                            вызов bat-файла
----------------------------------------------------------------------}
  i:=0;
//нужно что бы как-то в этом цикле происходил вызов сервера и файл передавался не один раз а пока приложение не будет закрыто
  while i=0 do
  begin
    p_time:=StrToInt(my_time);

    ClientSocket1.Active:=true;
    sleep(6000);
    ShellExecute(self.Handle,nil,'server_con.bat',nil,nil,SW_RESTORE);
  end;
end;
end;

end.
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 31.10.2009, 19:12   #5
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

Ребят я запуталась. Вообщем мне необходимо чтобы раз в в час данные при помощи бат-файла данные сохранялись затем передавалась на сервер, по протоколу tcp/ip. Одновременно к серверу может быть подключено несколько клиентов.
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 31.10.2009, 19:34   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
Вообщем мне необходимо чтобы раз в в час данные при помощи бат-файла данные сохранялись
во-первых - непонятна фраза что значит сохранялись при помощи батника?
во-вторых - уберите вызов батника из create и сделайте его в потоке с проверкой веремени (раз в час)...пример простейшего потока - это обычный таймер
в-третьих - единственная процедура передачи файла присутствует у вас в сервере, а сохранение (прием) файла в клиенте, что противоречит вашему
Цитата:
анные сохранялись затем передавалась на сервер, по протоколу tcp/ip
так что меняйте местами...
и 4: что там батник делает такого, что нельзя сделать из вашей программы?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача данных по локальной сети zzzzz Работа с сетью в Delphi 2 02.07.2011 19:24
Потоки, передача файлов по сети SeЯgey Работа с сетью в Delphi 3 02.04.2011 23:51
Передача данных по сети. ROD Общие вопросы C/C++ 3 18.06.2009 09:41
Передача файлов по локальной сети(Indy) Biowulf86 Помощь студентам 1 08.05.2008 13:08
передача звука по сети и вэб Банзай Работа с сетью в Delphi 2 07.01.2008 22:21