 |
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
edsonalves Colaborador


Registrado: Terça-Feira, 27 de Janeiro de 2009 Mensagens: 1938 Localização: Bauru - SP
|
Enviada: Qui Mai 25, 2017 8:36 am Assunto: Websocket ouvindo porta |
|
|
Pessoal, bom dia
Como o delphi esta para websockets, tenho um ip e porta que preciso ficar ouvindo e toda vez que ouvir um pedido e esse server vai disparar um aviso para os clients, procurei na net mas não achei nada, alguem ja fez algo nesse sentido? o Server que precisa ficar ouvindo esta em Node.js _________________ Cria em mim, ó Deus, um coração puro, e renova em mim um espírito reto.
http://twitter.com/edson_alves_
Skype: edson.alvesan
http://www.vacabikers.wordpress.com/ |
|
Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Qui Mai 25, 2017 9:24 am Assunto: Re: Websocket ouvindo porta |
|
|
edsonalves escreveu: | Pessoal, bom dia
Como o delphi esta para websockets, tenho um ip e porta que preciso ficar ouvindo e toda vez que ouvir um pedido e esse server vai disparar um aviso para os clients, procurei na net mas não achei nada, alguem ja fez algo nesse sentido? o Server que precisa ficar ouvindo esta em Node.js |
Você já tem o IP e porta, basta saber o que ler e escrever para o servidor, o componente que pode usar seria o IdTCPClient ou IdUPDClient da Indy ou winsock que é uma biblioteca. _________________ Tudo podemos quando tudo sabemos! |
|
Voltar ao Topo |
|
 |
edsonalves Colaborador


Registrado: Terça-Feira, 27 de Janeiro de 2009 Mensagens: 1938 Localização: Bauru - SP
|
Enviada: Qui Mai 25, 2017 1:02 pm Assunto: Re: Websocket ouvindo porta |
|
|
strak2012 escreveu: | edsonalves escreveu: | Pessoal, bom dia
Como o delphi esta para websockets, tenho um ip e porta que preciso ficar ouvindo e toda vez que ouvir um pedido e esse server vai disparar um aviso para os clients, procurei na net mas não achei nada, alguem ja fez algo nesse sentido? o Server que precisa ficar ouvindo esta em Node.js |
Você já tem o IP e porta, basta saber o que ler e escrever para o servidor, o componente que pode usar seria o IdTCPClient ou IdUPDClient da Indy ou winsock que é uma biblioteca. |
Strack, blz...
Então cara não vou precisar escrever nada na porta, só ouvir mesmo o que esta na porta... sempre que tiver algo ela vai me enviar esta mensagem:
Código: | messages : {"pedido_id": 111,"id_empresa":5} |
Nunca mexi com o indi dessa forma, conheçe algum exemplo? _________________ Cria em mim, ó Deus, um coração puro, e renova em mim um espírito reto.
http://twitter.com/edson_alves_
Skype: edson.alvesan
http://www.vacabikers.wordpress.com/ |
|
Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Qui Mai 25, 2017 1:29 pm Assunto: |
|
|
podes se basear neste exemplo cá:
Chat_Room_Socket_(Delphi)
O evento responsável por ouvir o servidor se chama "ClientSocket1Read"
nele você terá tudo que o servidor estar a enviar
Este exemplo é do component socket que vem com o delphi (requer a instalação manual, mesmo que ainda seja nativo do delphi)
informações da instalação do component socket do delphi
Installing_Socket_Components
Basicamente as coisas (instalação) muda um pouco de versão para versão do delphi, mas a grosso modo é tudo muito similar
Este exemplo tb é bem similar ao do IdTCPCLient.
lembro também que o IdTCPClient trata socket como um camada inferior assim este componente oferece mais recursos alem do sokect propriamente dito. _________________ Tudo podemos quando tudo sabemos! |
|
Voltar ao Topo |
|
 |
edsonalves Colaborador


Registrado: Terça-Feira, 27 de Janeiro de 2009 Mensagens: 1938 Localização: Bauru - SP
|
Enviada: Sex Mai 26, 2017 6:38 pm Assunto: |
|
|
strak2012 escreveu: | podes se basear neste exemplo cá:
Chat_Room_Socket_(Delphi)
O evento responsável por ouvir o servidor se chama "ClientSocket1Read"
nele você terá tudo que o servidor estar a enviar
Este exemplo é do component socket que vem com o delphi (requer a instalação manual, mesmo que ainda seja nativo do delphi)
informações da instalação do component socket do delphi
Installing_Socket_Components
Basicamente as coisas (instalação) muda um pouco de versão para versão do delphi, mas a grosso modo é tudo muito similar
Este exemplo tb é bem similar ao do IdTCPCLient.
lembro também que o IdTCPClient trata socket como um camada inferior assim este componente oferece mais recursos alem do sokect propriamente dito. |
Amigo ta caminhando aqui a coisa...
Conectar na porta já consegui, mas por enquanto ainda não escuto nada...
ai no web o meu esta assim:
Código: | socket.on ('messageSuccess', function (data) {
reloadPedidosAdmin(data.pedido_id);
}); |
Ai no socket aqui do delphi preciso ficar ouvindo esse evento:
Ainda apanhando um pouco com isso, se souber como ouço esse evento já me ajuda... Vlw[/quote] _________________ Cria em mim, ó Deus, um coração puro, e renova em mim um espírito reto.
http://twitter.com/edson_alves_
Skype: edson.alvesan
http://www.vacabikers.wordpress.com/ |
|
Voltar ao Topo |
|
 |
edsonalves Colaborador


Registrado: Terça-Feira, 27 de Janeiro de 2009 Mensagens: 1938 Localização: Bauru - SP
|
|
Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Ter Mai 30, 2017 8:58 am Assunto: |
|
|
Vejamos então seu caso.
Há pelo menos três hipóteses de como descobrir como estar programado o servidor.
1ª hipótese
Se o servidor estiver programado a periodicamente estar a enviar aos seus cliente uma mensagem "dados", então neste caso o cliente só precisa se conectar a porta e ip apenas e fica a escutar o que vem do servidor nada mais do que isso.
2ª hipótese
Se o servidor estiver programado esperar que o cliente lhe solicite uma resposta, neste caso o cliente precisa saber o que enviar ao servidor para que o mesmo lhe responda adequadamente.
3ª hipótese
Se o servidor estiver programado esperar dados de autenticação vinda do cliente, neste caso o servidor não envia nada aos seus clientes até que o mesmos tenham se autenticados.
podendo haver combinações entre as hipótese tal como:
3ª hipótese + 1ª hipótese
ou
3ª hipótese + 2ª hipótese
O trecho que postou não diz muita coisa:
Código: | socket.on ('messageSuccess', function (data) {
reloadPedidosAdmin(data.pedido_id);
}); |
Pelo que me parece é que no socket do servidor quando ocorrem alguma mensagem de "messageSuccess" ele responde com o id do pedido, contudo me parece que o cliente precisa solicitar tal dado enviando-lhe alguma solicitação "mensagem", assim sendo se poder estender um pouco mais o trecho para que possamos avaliar um contexto mais completo código do servidor talvez possamos apontar como fazer esta interação entre os socket do delphi e do websocket.
bom é isso dá uma analisada e depois diz algo. _________________ Tudo podemos quando tudo sabemos! |
|
Voltar ao Topo |
|
 |
edsonalves Colaborador


Registrado: Terça-Feira, 27 de Janeiro de 2009 Mensagens: 1938 Localização: Bauru - SP
|
Enviada: Ter Mai 30, 2017 3:26 pm Assunto: |
|
|
strak2012 escreveu: | Vejamos então seu caso.
Há pelo menos três hipóteses de como descobrir como estar programado o servidor.
1ª hipótese
Se o servidor estiver programado a periodicamente estar a enviar aos seus cliente uma mensagem "dados", então neste caso o cliente só precisa se conectar a porta e ip apenas e fica a escutar o que vem do servidor nada mais do que isso.
2ª hipótese
Se o servidor estiver programado esperar que o cliente lhe solicite uma resposta, neste caso o cliente precisa saber o que enviar ao servidor para que o mesmo lhe responda adequadamente.
3ª hipótese
Se o servidor estiver programado esperar dados de autenticação vinda do cliente, neste caso o servidor não envia nada aos seus clientes até que o mesmos tenham se autenticados.
podendo haver combinações entre as hipótese tal como:
3ª hipótese + 1ª hipótese
ou
3ª hipótese + 2ª hipótese
O trecho que postou não diz muita coisa:
Código: | socket.on ('messageSuccess', function (data) {
reloadPedidosAdmin(data.pedido_id);
}); |
Pelo que me parece é que no socket do servidor quando ocorrem alguma mensagem de "messageSuccess" ele responde com o id do pedido, contudo me parece que o cliente precisa solicitar tal dado enviando-lhe alguma solicitação "mensagem", assim sendo se poder estender um pouco mais o trecho para que possamos avaliar um contexto mais completo código do servidor talvez possamos apontar como fazer esta interação entre os socket do delphi e do websocket.
bom é isso dá uma analisada e depois diz algo. |
Amigo, no caso é a 1ª hipótese... entretando existe o evento "messageSuccess" que preciso ouvir este evento...
Por exemplo seu simplesmente se conectar na porta, blz.. mas não acontece nada, mas ai eu preciso ficar observando o evento messageSuccess ai neste evento é que vem o retorno. Apenas não consegui a ouvir este evento... _________________ Cria em mim, ó Deus, um coração puro, e renova em mim um espírito reto.
http://twitter.com/edson_alves_
Skype: edson.alvesan
http://www.vacabikers.wordpress.com/ |
|
Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Ter Mai 30, 2017 3:41 pm Assunto: |
|
|
Toda vez que o servidor enviar qualquer coisa ao seu clientes é disparado no cliente o evento ClientSocket1Read é onde podes ouvir o que enviou o servidor.
Código: | procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var Data : String;
begin
Data := ClientSocket1.socket.ReceiveText; // recebo do servidor qualquer coisa que ele envie e passo para uma string
{trabalho com a tal string (Data) aqui }
memo1.lines.add(Data); // caso queira exibir o que estou ouvindo do servidor num Tmemo.
end; |
Se mesmo assim não chega nada ao cliente, possivelmente seu caso não se trata apenas da 1ª hipótese _________________ Tudo podemos quando tudo sabemos! |
|
Voltar ao Topo |
|
 |
edsonalves Colaborador


Registrado: Terça-Feira, 27 de Janeiro de 2009 Mensagens: 1938 Localização: Bauru - SP
|
Enviada: Ter Mai 30, 2017 7:11 pm Assunto: |
|
|
strak2012 escreveu: | Toda vez que o servidor enviar qualquer coisa ao seu clientes é disparado no cliente o evento ClientSocket1Read é onde podes ouvir o que enviou o servidor.
Código: | procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var Data : String;
begin
Data := ClientSocket1.socket.ReceiveText; // recebo do servidor qualquer coisa que ele envie e passo para uma string
{trabalho com a tal string (Data) aqui }
memo1.lines.add(Data); // caso queira exibir o que estou ouvindo do servidor num Tmemo.
end; |
Se mesmo assim não chega nada ao cliente, possivelmente seu caso não se trata apenas da 1ª hipótese |
Então amigo, faço exatamente dessa forma, mas não existe nenhuma mensagem... Porem o retorno esta no evento: messageSuccess... tem um plugin do chrome chamado Socket.io Tester neste plugin coloco o ip e porta e ele fica ouvindo, mas para funcionar preciso adicionar o evento: messageSucess... vou colocar um print pra vc ver...
Observe o campo sublinhado de laranja é o evento que preciso ouvir se eu não colocar nada ali, fica igual fica no delphi, sem ouvir nada, mas quando coloco o messageSuccess e tem algum pedido no servidor ele retorna este objeto que esta ao lado...
 _________________ Cria em mim, ó Deus, um coração puro, e renova em mim um espírito reto.
http://twitter.com/edson_alves_
Skype: edson.alvesan
http://www.vacabikers.wordpress.com/ |
|
Voltar ao Topo |
|
 |
edsonalves Colaborador


Registrado: Terça-Feira, 27 de Janeiro de 2009 Mensagens: 1938 Localização: Bauru - SP
|
|
Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Qui Jun 01, 2017 9:34 am Assunto: |
|
|
pelo que me parece o websocket possui um protocolo a ser respeitado:
Troca de Quadros de Dados
O cliente ou o servidor pode optar por enviar uma mensagem a qualquer momento - essa é a magia do WebSockets. No entanto, extrair informações desses chamados "quadros" de dados é uma experiência não tão mágica. Embora todos os quadros sigam o mesmo formato específico , os dados que vão do cliente para o servidor são mascarados usando criptografia XOR (com uma chave de 32 bits). A seção 5 da especificação descreve isso em detalhes.
Formato
Cada quadro de dados (do cliente para o servidor ou vice-versa) segue o mesmo formato:
Código: | Frame format:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Extended payload length |
|I|S|S|S| (4) |A| (7) | (16/64) |
|N|V|V|V| |S| | (if payload len==126/127) |
| |1|2|3| |K| | |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
| Extended payload length continued, if payload len == 127 |
+ - - - - - - - - - - - - - - - +-------------------------------+
| |Masking-key, if MASK set to 1 |
+-------------------------------+-------------------------------+
| Masking-key (continued) | Payload Data |
+-------------------------------- - - - - - - - - - - - - - - - +
: Payload Data continued ... :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Payload Data continued ... |
+---------------------------------------------------------------+ |
O bit MASK simplesmente diz se a mensagem está codificada. As mensagens do cliente devem ser mascaradas, então o servidor deve esperar que isso seja 1. (Na verdade, a seção 5.1 da especificação diz que o servidor deve desconectar de um cliente se esse cliente envia uma mensagem sem máscara). Ao enviar uma moldura de volta Para o cliente, não o mascarar e não definir o bit de máscara. Vamos explicar mascaramento mais tarde. Nota: Você deve mascarar as mensagens mesmo quando usar um soquete seguro. RSV1-3 pode ser ignorado, eles são para extensões.
O campo opcode define como interpretar os dados de carga útil: 0x0 para continuação, para texto (que é sempre codificado em UTF-8), para binário e outros chamados "códigos de controle" que serão discutidos mais tarde. Nesta versão do WebSockets, para e para não ter nenhum significado . 0x10x20x30x70xB0xF
O bit FIN diz se esta é a última mensagem de uma série. Se for 0, o servidor continuará ouvindo mais partes da mensagem; Caso contrário, o servidor deve considerar a mensagem entregue. Mais sobre isso mais tarde.
Decodificação Payload Length
Para ler os dados da carga útil, você deve saber quando parar de ler. É por isso que o comprimento da carga útil é importante saber. Infelizmente, isso é um pouco complicado. Para lê-lo, siga estas etapas:
Leia os bits 9-15 (inclusive) e interprete isso como um inteiro sem sinal. Se for 125 ou menos, então esse é o comprimento; Você está pronto . Se for 126, vá para a etapa 2. Se for 127, vá para a etapa 3.
Leia os próximos 16 bits e interprete esses como um inteiro sem sinal. Você terminou .
Leia os próximos 64 bits e interprete esses como um inteiro não assinado (O bit mais significativo DEVE ser 0). Você terminou .
Ler e desmascarar os dados
Se o bit MASK foi definido (e deve ser, para mensagens de cliente para servidor), ler os próximos 4 octetos (32 bits); Esta é a chave de máscara. Uma vez que o comprimento da carga útil e a tecla de máscara são decodificados, você pode seguir em frente e ler esse número de bytes do soquete. Vamos chamar os dados CODIFICADOS e a chave MASK . Para obter DECODED , faça um loop pelos octetos (bytes aka caracteres para dados de texto) de CODIFICADO e XOR o octeto com o octeto (i modulo 4) da MÁSCARA. Em pseudo-código (que acontece de ser válido em JavaScript):
Código: | var DECODED = "";
for (var i = 0; i < ENCODED.length; i++) {
DECODED[i] = ENCODED[i] ^ MASK[i % 4];
} |
informações extraída de:
https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers
Em todos os caso vou estar a tentar realizar testes cá e tão logo eu tenha algum resultado post em seguida. _________________ Tudo podemos quando tudo sabemos! |
|
Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Qui Jun 01, 2017 9:50 am Assunto: |
|
|
Seguindo a logica da decodificação da mensagem ficaria algo do tipo:
Código: | function decodificaDados(mask, dados:string):string;
begin
result:=Dados;
for i:=1 to length(result) do
result[i]:=chr(ord(result[i]) xor ord(mask[i mod 4 + 1])); // + 1 string em delphi possui index inicial em 1.
end; |
_________________ Tudo podemos quando tudo sabemos! |
|
Voltar ao Topo |
|
 |
edsonalves Colaborador


Registrado: Terça-Feira, 27 de Janeiro de 2009 Mensagens: 1938 Localização: Bauru - SP
|
Enviada: Dom Jun 04, 2017 10:32 am Assunto: |
|
|
strak2012 escreveu: | Seguindo a logica da decodificação da mensagem ficaria algo do tipo:
Código: | function decodificaDados(mask, dados:string):string;
begin
result:=Dados;
for i:=1 to length(result) do
result[i]:=chr(ord(result[i]) xor ord(mask[i mod 4 + 1])); // + 1 string em delphi possui index inicial em 1.
end; |
|
Amigo, até ai tranquilo, mas como decodificar uma mensagem que vc não recebe..rsrs a grande coisa ta ai....  _________________ Cria em mim, ó Deus, um coração puro, e renova em mim um espírito reto.
http://twitter.com/edson_alves_
Skype: edson.alvesan
http://www.vacabikers.wordpress.com/ |
|
Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Seg Jun 05, 2017 2:42 am Assunto: |
|
|
Fiz um pequeno exemplo da comunicação do Delphi e o socket.Io com o componente mencionado acima (Socket nativo do delphi):
Segue o link do exemplo compilado + fontes: download aqui
Visto também a forma pelo qual foi feito é possível implementar a comunicação entre o Delphi e Socket.Io no android por meio do IdTCPClient
Quando tiver mais tempo vou ver se posto outros exemplos com os dois componentes mencionados Socket Nativo e IdTCPClient
Não consegui resolver um pequeno problema neste exemplo que se trata da geração Sec-WebSocket-Key, mesmo não sabendo gerar o exemplo funciona bem, contudo ele acaba por criar duas sessões no servidor por conta disso.
Se alguém souber de mais informação e quiser partilhar sinta-se a vontade em deixar seus comentários.
Dos meus testes
Para já é isso _________________ Tudo podemos quando tudo sabemos! |
|
Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|