Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

richard1994x

Comando com Sockets

Recommended Posts

Pessoal criei um programa mais ou menos assim:

Através do Form que eu criei para o Cliente, a pessoa pode abrir um programa do outro computador, no outro Form do Server ta um ServerSocket para receber o comando, por enquanto ta assim:

 

No ClienteSocket:

ClientSocket1.Socket.SendText('abrirmsn') ;

No ServerSocket:

if Comando='abrirprograma' then begin
WinExec(C:\Arquivos de programas\Windows Live\Messenger\msnger.exe', SW_SHOW);
end;

Acontece que o comando já vem pré-destinado ou seja ele já abre o programa (msn), isso que ta me incomodando, eu queria saber se tem como eu criar uma "Edit" e nele colocar o nome do programa e abrir no outro computador, tipo assim:

 

A pessoa no programa Cliente escreve na Unit,

C:\Arquivos de Programa\Firefox.exe

e ao inves de abrir o msn abrir o firefox, ou seja substituir essa partizinha "C:\Arquivos de programas\Windows Live\Messenger\msnger.exe"

Compartilhar este post


Link para o post
Compartilhar em outros sites

claro que tem, você pode fazer assim:

 

if (FileExists(ComandoRecebido)) then
	ShellExecute(Self.Handle, 'open', PChar(ComandoRecebido), nil, nil, SW_NORMAL); //Acho melhor utilizar ShellExecute no Windows.

Nota: Para utilizar ShellExecute declare "ShellAPI" nas uses da sua unit.

 

:D

Compartilhar este post


Link para o post
Compartilhar em outros sites

mais tipo como eu faço isso?

ficaria assim?

if Socket.ReceiveText='abrirmsn' then begin
if (FileExists(ComandoRecebido)) then
ShellExecute(Self.Handle, 'open', PChar(ComandoRecebido), nil, nil, SW_NORMAL);
end;

no caso eu queria poder escrever o arquivo a ser aberto, em um edit ou qualquer coisa, e ele substituir.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro deixa eu corrigir o código que você fez:

 

var
	ComandoRecebido: AnsiString;
begin
// if Socket.ReceiveText='abrirmsn' then begin; //o msn não nos intereça, depois você pode simplismente enviar o comando com o caminho dele e ele abre
ComandoRecebido := Socket.ReceiveText;
//if (FileExists(ComandoRecebido)) then; // por enquando deixa sem esta linha também, caso não exista o shellexecute não retorna erro
ShellExecute(Self.Handle, 'open', PChar(ComandoRecebido), nil, nil, SW_NORMAL);

end;

agora la no programa aonde você envia o comando, no evento onCLick do botão que envia o comando:

 

ClientSocket1.Socket.SendText(PChar(Edit1.Text));

agora você coloca no seu edit um comando como por exemplo: "c:\arquivos de programas\Windows Live Messenger\msgmssgr.exe".

Agora clique no botão para enviar o comando.

 

a aplicação servidor vai receber um comando e vai então executá-lo atraves da função ShellExecute.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Raficcha, deu certo só não entendi uma coisa, qual a diferença de:

ComandoRecebido: AnsiString;

 

Para:

ComandoRecebido: String;

 

Ahhh aproveitando a pergunta queria saber também se tem como usar a função citado pelo amigo acima para uma pasta?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hehe, a diferença entre AnsiString e string, na pratica, é que AnsiString é uma string gigantesca, ou seja, enquanto tiver memória você coloca caracteres. Ja o tipo string so aceita 255 caracteres.

 

Técnicamente, String é um tipo nativo do Delphi, ja AnsiString é uma emulação de string do C++.

 

Nota: Se não for necessário muito caracteres, utilize "String" mesmo.

 

==========================================================

 

para abrir pastas, tente fazer assim ShellExecute(Self.Handle, 'open', 'Explorer.exe', PChar(ComandoRecebido), nil, 0);

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Raficcha,

Não to conseguindo criar uma pasta, tipo eu substitui o código para abrir um programa por esse que você me passou, e não ta dando certo, olha ta assim:

 

No SocketCliente:

ClientSocket1.Socket.SendText(PChar(Edit1.Text));

 

No SocketServer:

ShellExecute(Self.Handle, 'open', 'Explorer.exe', PChar(ComandoRecebido), nil, 0);

 

Pq po?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bah, descupa, erro meu, eu li na corrida e achei que o que você queria era abrir um pasta.

 

Bom, agora acho que esta na hora de deixar isso um pouco mais complexo. Como você so envia um comando e não diz o que fazer, fica dificil ir muito alem. Uma sugestão que eu t dou é utilizar o primeiro caractere do comando para informar o que deve ser feito.

 

exemplo:

 

temp := Socket.ReceiveText;
Acao:= temp[1];
ComandoRecebido := Copye(Temp, 2, Length(Temp)-1);


if (Acao = '1') then //se acao for '1', ComandoRecebido é um comando do windows e deve ser executado
 ShellExecute(Self.Handle, 'open', PChar(ComandoRecebido), nil, nil, SW_NORMAL);
else if (Acao = '2') then //se acao = '2', então ComandoRecebido contem o nome da pasta que deve ser criada
 CreateDir(PChar(ComandoRecebido));

Compartilhar este post


Link para o post
Compartilhar em outros sites

Heheh.

 

Bom, vamos por partes intom

 

Até então você estava enviando um comando de um cliente para o servidor. O comando se tratava de uma string simples e, partindo do pré suposto de que esta string era um comando do windows, executava-a incondicionalmente. Nenhum teste era feito ja que a função ShellExecute não retornava erro. Era uma comunicação bem simples.

Assim como esta comunicação era tão simples, permitia apenas a tranferência de comandos, outros dados não poderiam ser enviados pois seriam tratados como tais. Para que possamos ir além disso, devemos informar que tipo de dado estamos transferindo, ou seja, informar ao servidor se o dado que ele esta recebendo é um comando do Windows, um comando da aplicação, uma mensagem de erro, ou outro tipo de dado.

Para informar qual é o tipo de dado que está sendo enviado, eu sugeri que você utiliza-se o primeiro caractere da string como indicador de tipo. Então a sua string que antes era assim:

 

'meu comando'

 

passa a ser assim

 

'ameu comando'

 

Note que ao começo eu adicionei um 'a'. Neste exemplo, eu defini que o caractere 'a' indica que o resto da string é um comando.

 

Então antes de mais nada, você deve definir quais serão os tipos de dados que você vai transferir e definir um caractere para representa-los. Ex.:

 

tabela de tipos de dados

a = comando do windows

b = mensagem de erro

c = comando da aplicação

 

partindo desta tabela, quando você quiser enviar um comando para o seu programa abrir o Exeplorer, por exemplo, você faria assim:

 

ClientSocket1.Socket.SendText('aExplorer.exe'); //note o 'a' no inicio da string indicando, conforme a tabela, que o que está sendo tranferido é um comando

para mostrar uma mensagem de erro na tela você faria assim:

 

ClientSocket1.Socket.SendText('bExibir esta mensagem de erro'); //note que neste comando temos um 'b' no inicio, que de acordo com a tabela acima, envia uma mensagem de erro

e para enviar um comando para a sua aplicação (pode considerar isso como IPC , Inter Process Comunication na sigla em inglês), você faria assim:

 

ClientSocket1.Socket.SendText('cEsconder');

Agora, na sua Aplicação Servidor você interpretaria isto da seguinte forma:

var
	recebido: AnsiString;
	TipoDeDado: char;
	Dado: AnsiString;
begin
	recebido := Socket.ReceiveText; //aqui, "recebido" recebe a string que veio do cliente, incluindo o primeiro caractere, que define o tipo de dado
	TipoDeDado := recebdio[1]; //aqui eu pega-se o primeiro caractere, que diz que tipo de dado esta no resto da string
	Dado := Copy(recebido, 2, Length(Recebido)-1);//aqui eu pego o resto da string. Este "dado" será tratado de acordo com o que estiver em "TipoDeDado".
	
	//aqui tratamos os dados de acordo com o "TipoDeDado";
	
	if (TipoDeDado = 'a') then //Lembra da tabela? o caractere 'a' define que o dado é um comando do Widnows
	begin
		ShellExecute(Self.Handle, 'open', PChar(Dado), nil, nil, SW_NORMAL);
	end
	else if (TipoDeDado = 'b') then //Exibir uma mensagem de erro
	begin
		MessageBox(0, PCHar(Dado), 'Erro', MB_OK+MB_ICONERROR);	
	end
	else if (TipoDeDado = 'c') then //comando para a aplicação
	begin
		if (Dado = 'Minimizar') then
			Application.Minimize
		else if (Dado = 'Fechar') then
			Application.Terminate
		else if (Dado = 'Esconder') then
			Form1.Hide;	
	end;
end;

Bom, na tabela la de cima eu coloquei três comandos, mas você pode criar os seus, ou mesmo refazer toda a tabela.

 

Espero que entenda. Qualquer coisa a mais, é só postar ai.

 

:D

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.