mp_1989 Posted February 27, 2014 at 02:24 PM Report #546890 Posted February 27, 2014 at 02:24 PM 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
nunopicado Posted February 27, 2014 at 02:30 PM Report #546892 Posted February 27, 2014 at 02:30 PM 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.
mp_1989 Posted February 27, 2014 at 02:37 PM Author Report #546895 Posted February 27, 2014 at 02:37 PM sempre ficheiros diferentes, ou seja sao varios ficheiros que estao numa pasta que sao enviados para o servidor, sempre que houver ficheiros novos ele volta a enviar
nunopicado Posted February 27, 2014 at 02:40 PM Report #546896 Posted February 27, 2014 at 02:40 PM (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 February 27, 2014 at 02:39 PM 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.
mp_1989 Posted February 27, 2014 at 02:45 PM Author Report #546898 Posted February 27, 2014 at 02:45 PM 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.
nunopicado Posted February 27, 2014 at 02:50 PM Report #546900 Posted February 27, 2014 at 02:50 PM 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.
mp_1989 Posted February 27, 2014 at 02:50 PM Author Report #546901 Posted February 27, 2014 at 02:50 PM Já fiz uma pesquisa na net em relação ao problema, mas nao encontrei muita informação e a que há não é esclarecedora
nunopicado Posted February 27, 2014 at 02:50 PM Report #546902 Posted February 27, 2014 at 02:50 PM 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.
mp_1989 Posted February 27, 2014 at 02:52 PM Author Report #546903 Posted February 27, 2014 at 02:52 PM mas para depois gravar no destino vai ter de ser no onexecute do server certo?
nunopicado Posted February 27, 2014 at 02:53 PM Report #546904 Posted February 27, 2014 at 02:53 PM 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.
mp_1989 Posted February 27, 2014 at 02:53 PM Author Report #546905 Posted February 27, 2014 at 02:53 PM Apenas vou ter acesso a pasta de origem, como cliente, este é que de forma automatica envia para o servidor que sera o destino
nunopicado Posted February 27, 2014 at 03:00 PM Report #546907 Posted February 27, 2014 at 03:00 PM (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 February 27, 2014 at 03:00 PM 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.
mp_1989 Posted February 27, 2014 at 03:13 PM Author Report #546908 Posted February 27, 2014 at 03:13 PM (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 February 27, 2014 at 03:06 PM by nunopicado Adicionadas tags GeShi
nunopicado Posted February 27, 2014 at 06:09 PM Report #546951 Posted February 27, 2014 at 06:09 PM 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.
mp_1989 Posted February 28, 2014 at 09:27 AM Author Report #547037 Posted February 28, 2014 at 09:27 AM Ok obrigado 🙂 vou experimentar e assim que possa darei um feedback
mp_1989 Posted March 3, 2014 at 02:19 PM Author Report #547337 Posted March 3, 2014 at 02:19 PM 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.
nunopicado Posted March 3, 2014 at 02:42 PM Report #547340 Posted March 3, 2014 at 02:42 PM 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.
mp_1989 Posted March 3, 2014 at 02:48 PM Author Report #547342 Posted March 3, 2014 at 02:48 PM 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
nunopicado Posted March 3, 2014 at 03:00 PM Report #547346 Posted March 3, 2014 at 03:00 PM 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.
mp_1989 Posted March 3, 2014 at 03:03 PM Author Report #547347 Posted March 3, 2014 at 03:03 PM 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?
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now