Jump to content

Como enviar ficheiros .ini em delphi 9 com ligação cliente servidor utilizando o idtcpclient e idtcpserver


Recommended Posts

Posted

Boa tarde, precisava da vossa ajuda em relação a esta questão, estou a desenvolver um trabalho onde ao fazer uma ligação cliente servidor este tem de enviar sincronizadamente ficheiros .ini para o servidor, ou seja, cada vez que o pc inicia a aplicação tem de se ligar automaticamente e sempre que existirem ficheiros na pasta por enviar ao servidor o terminal tem de os enviar, a conexão entre eles ja esta feita so nao sei como enviar os ficheiros de forma automatica. Agradecia a vossa ajuda. Obrigado

Posted

São sempre ficheiros diferentes, ou pode ser o mesmo com alterações.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

E qual a tua dúvida exactamente:

1º O envio propriamente dito

2º Saber quais enviaste, e quais ainda vais enviar

A propósito. Depois de enviar ficam na pasta de origem, ou são apagados?

Outra:

Que tipo de envio tens planeado? HTTP, FTP, Mail, copia directa, etc.?

Edited by nunopicado

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

Penso que tenho duvida nas duas questões, o envio propriamente dito e também a maneira como verificar a pasta de forma a saber se existem ficheiros por enviar. os ficheiros são apagados na pasta, mas a ideia é criar um log, onde ficará o registo dos ficheiros enviados

copia directa.

Posted

Para gerir os que já foram é simples, especialmente se vão ser eliminados da pasta original.

Usas um TSearchRec para procurar na tal pasta todos os ficheiros que existam com os parametros desejados (por exemplo, com extensão .ini).

Depois, à medida que ele os vai encontrando, vais copiando, e no fim de copiar, elimina da pasta, e adiciona a referencia ao log.

Visto serem ficheiros de texto, e ser copia directa, podes usar para a cópia uma TStringList.

Abres com a list, e gravas novamente na pasta de destino.

Podes usar uma TStringList também para o log.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

Já fiz uma pesquisa na net em relação ao problema, mas nao encontrei muita informação e a que há não é esclarecedora

Presumo que tens acesso, através do Windows, à pasta de destino, a partir do computador onde o programa vai correr, certo?

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

mas para depois gravar no destino vai ter de ser no onexecute do server certo?

Não percebi...

Não disseste que era cópia directa?

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

Para isso, tem de haver um programa que envia, e outro que recebe...

E isso inclui que ambos comuniquem com um protocolo comum.

Também vais ser tua a fazer a parte do servidor, ou essa já existe?

Se já existe (ou vai ser feita por outra pessoa), tens de tentar saber qual o protocolo esperado por ele, para fazeres a tua parte a condizer.

Se vais fazer os dois, tens de escolher um protocolo e aplicar igual nos dois.

O que vai acontecer a nível de comunicação é:

1. A parte cliente envia, numa linguagem predefinida, para o servidor

2. A parte do servidor, quando vir que está a dar entrada uma comunicação na tal linguagem, vai aceitar o ficheiro

3. Quando a comunicação terminar, o servidor envia de volta uma indicação de ter concluído

4. A parte cliente, ao receber essa resposta, elimina o ficheiro da pasta de origem e passa ao seguinte.

Edited by nunopicado

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

Então é assim eu fiz a conexão entre o cliente e o servidor desta forma:

procedure TForm2.IdTCPServer1Connect(AContext: TIdContext);
begin
   listBox1.Items.Add('Conectado: ' + AContext.Connection.Socket.Binding.PeerIP);
end;



procedure TForm2.Button1Click(Sender: TObject);
begin
IdTCPServer1.Active := true;
   IdTCPClient1.Connect;
end;



procedure TForm2.IdTCPServer1Status(ASender: TObject; const AStatus: TIdStatus;
 const AStatusText: string);
begin
 listBox1.Items.Add(AStatusText);
end;

depois criei uma listbox de forma a aceder aos ficheiros da minha pasta:

procedure listarArquivosDir(pasta: string; lista: TStrings);
var
 search_rec: TSearchRec;
begin
 if FindFirst(pasta + '*.*', faAnyFile, search_rec) = 0 then
   begin
     repeat
       if search_rec.Attr <> faDirectory then
         lista.Add(search_rec.Name);
     until FindNext(search_rec) <> 0;

     FindClose(search_rec);
   end;
end;
procedure TForm2.visualizarClick(Sender: TObject);
begin
     listarArquivosDir('c:\SIMconnect\', ListBox2.Items);
end;

end.

Agora quero selecionar esse arquivos e enviar para o servidor. como estou a fazer de momento é um teste para ver se funciona, porque futuramente nao irao existir botoes, a aplicação ira correr sozinha e enviar os ficheiros autonomamente.

A parte do servidor ja existe, eu so tenho de me ligar a ele e enviar os ficheiros

e apenas devo usar as ferramentas indy, idtcpclient e idtcpserver

Se eu usar ftp consigo fazer com que as pastas sejam enviadas sincronizadamente?

Edited by nunopicado
Adicionadas tags GeShi
Posted

Tu podes fazer tudo a usar o tcpclient e o tcpserver, mas cada um no seu programa...

No programa cliente só precisas de abrir o ficheiro, por exemplo para uma TStringList, e depois usar o TidTCPClient para fazer o envio.

Agora, o formato do envio é que pode variar, e tens de saber exactamente como tens o servidor para isso.

A minha sugestão era tratares cada ficheiro como uma string.

Ou seja, abres para uma tstringlist, enviar como uma string para o servidor. Algo tipo:

procedure TForm2.Button2Click(Sender: TObject);
var
   Reply: String;
   lst:TStringList;
begin
    lst:=TStringList.Create;
    lst.LoadFromFile('E:\teste.xml');  // Abre o ficheiro de origem

    Client.Connect;
    try
       Client.IOHandler.Write(Byte($02));
       Client.IOHandler.Write(lst.Text);  // Envia o ficheiro de origem
       Client.IOHandler.Write(Byte($03));

       Client.IOHandler.ReadByte;
       Reply := Client.IOHandler.ReadLn(#03);  // Lê a resposta
    finally
       Client.Disconnect;
       lst.Free;
    end;

    // Se o número de caracteres transmitidos (resposta) for igual ao original, elimina o ficheiro de origem
       if Length(lst.Text)=Reply
          then DeleteFile('E:\teste.xml');
end;

Do lado do servidor, ele receberia o ficheiro, gravava-o, e devolvia a resposta a indicar a finalização:

procedure TForm1.serverExecute(AContext: TIdContext);
var
   lst:TStringList;
begin
    lst:=TStringList.Create;

    AContext.Connection.IOHandler.ReadByte;
    lst.Text := AContext.Connection.IOHandler.ReadLn(#03);  // Recebe o ficheiro

    lst.SaveToFile('d:\teste.xml'); // Grava o ficheiro na pasta do servidor

    AContext.Connection.IOHandler.Write(Byte($02));

    // Responde o número de caracteres recebidos do ficheiro
   if FileExists('d:\teste.xml')
      then AContext.Connection.IOHandler.Write(IntToStr(Length(lst.Text)))
      else AContext.Connection.IOHandler.Write('0');

   AContext.Connection.IOHandler.Write(Byte($03));
end;

Claro que outros testes se podem fazer. Em vez do número de caracteres, se o servidor responder um checksum do ficheiro, é mais seguro.

Mas dá para teres uma ideia.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

Boa tarde mais uma vez, já implementei esta forma mas mesmo assim continua a não enviar os ficheiros para o servidor, perguntei também qual o protocolo que pretendiam que eu usasse ao qual me respoderam que não era necessário, de momento estou sem grandes ideias para realizar a tarefa.

Posted

Boa tarde mais uma vez, já implementei esta forma mas mesmo assim continua a não enviar os ficheiros para o servidor, perguntei também qual o protocolo que pretendiam que eu usasse ao qual me respoderam que não era necessário, de momento estou sem grandes ideias para realizar a tarefa.

Chegaste a criar ambas as aplicações (cliente e servidor)?

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

Sim, separei em programas diferentes, fiz uma para o cliente e um para o servidor, consigo correr o programa mas quando clico no botao de enviar ele da o seguinte erro :socket error 10061 connection refused

Posted

Isso cheira-me a uma de duas coisas:

- Ou não definiste a porta igual nas duas aplicações

- Ou há firewall/anti-virus a bloquear as comunicações

Confirma a porta, e se estiver correcta, testa a comunicação correndo as duas aplicações no mesmo computador...

Se comunicar, há questões externas a resolver!

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

Já confirmei a porta, ambas têm a mesma porta, já corri as duas aplicações no mesmo computador e dá erro na mesma, nao sei mesmo o que possa ser, talvez a firewall?

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.