:DSalve!! Estou com uma dúvida sobre sockets, podem me ajudar? Bem, sabemos que para estabelecer conexão entre dois computadores usando socket é preciso que um faça o lado cliente e outro faça o lado servidor. Testei e estou usando um no meu sistema algumas classes socket(cliente e servidor) e funciona bem em uma rede. Mas como faço para rodar na internet?
Se um cliente decide acessar um recurso de um servidor ( por exemplo: o site www.servidorcomrecursosocket.com.br) na internet beleza, funciona bem.
Imaginem agora que, esse servidor deseja, depois de fechada a conexão, enviar uma mensagem para o cliente.
:? Mas pra que alguem em sã consciencia usaria isso? Já vou explicar.
Tenho um sistema em que, por cima, um usuário se loga no site da empresa e tem acesso a planta da sua casa. Então, ao clicar em alguma lampada, ventilador, chuveiro ou qualquer coisa que sua imaginação permitir, é enviada uma mensagem via socket ao computador do cliente(essa string será usada para controlar os componentes eletrônicos).
Como eu disse, em uma rede interna funciona bem.
Como acho o ip da casa do fulano?
R: eu estou usando um robozinho na casa dele que monitora o IP e manda ( via socket) pro meu banco no servidor.
De posse do IP, como mandar determinada string pro cliente?
R: via socket. Contudo, quando eu “pego” o ip no computador do cliente que contém a placa que controla os disositivos eletrônicos, ele pega o ip da rede interna. Isso não serve de nada na internet. Já sei como pegar o IP da rede externa ( um método no serversocket faz isso).
De posse do IP da rede externa, como mandar determinada string pro cliente?
R: ainda não consegui responder a essa pergunta. Tendo o IP real do cliente, ou seja aquele com que ele se conecta na net, tenho o IP do router e não do computador. Enviar a string pro router não adianta se não tiver a máscara de sub-rede que especifique qual computador deve receber o pacote.Infelizmente não posso ( ainda) testar o sistema na internet. Como faço para especificar um computador dentro da rede para receber minha string? E se eu não especificar, ele descarta o pacote(acho mais provável) ou envia para todos os pcs?
dei uma olhada na documentação, e a única coisa que encontrei sobre sub-rede é:
getNetworkPrefixLength
public short getNetworkPrefixLength()Returns the network prefix length for this address. This is also known as the subnet mask in the context of IPv4 addresses. Typical IPv4 values would be 8 (255.0.0.0), 16 (255.255.0.0) or 24 (255.255.255.0).
Typical IPv6 values would be 128 (::1/128) or 10 (fe80::203:baff:fe27:1243/10)
Returns:
a short representing the prefix length for the subnet of that address.
Ok, de todo caso eu teria que instalar na casa do cliente o hardware que desenvolvemos, uma configuração a mais não será problema. Nesse caso, deveria haver uma porta específica para cada cliente certo? E o router redirecionaria. Então dária na mesma, ao invez de passar pelo socket a máscara ( eu ainda invento um método que faça isso e faço o favor pra sun de disponibilizar ele!!) eu passo dentro da string a porta correspondente a aquele computador.
Ex: conecto ao socket o com o ip 192.168.156.2 e porta 8080;
a string seria: IPEXTERNOCLIENTE$PORTAQUEDAACESSOAOCLIENTE$USUARIO$SENHA
corri-ja me se eu estiver errado. Em todo caso, obrigado pela ajuda!!!
Não entendi o que vc quis dizer. Voce pode estabelecer um padrao, se cada cliente possuirá soh 1 maquina que vc queira acessar no router vc coloca, sei la, porta 27000 apontando para o IP local da maquina do cliente.
Bom, ai depende do router, da uma olhada no site do www.abusar.org que ele tem varios tutoriais para quase, se nao todas, as marcas de routers/modems
A lógica seria: 200.123.123.123:27000(ipinternet:porta) -> 10.1.1.2 (ip local)
Cara desculpe se viagei nas coisas que vc falou mas o IP da casa (fixo) tem que estar devidamente disponibilizado na rede. Capiturar o IP assim “na boa” acho que não rola por causa da segurança, deve ter um montão de coisas dinamicas no meio.
Se onde vc trabalha tiver uma equipe que monta e configura redes, sistema operacionais etc… fala com eles acho que vão te dar um toque.
A lógica seria: 200.123.123.123:27000(ipinternet:porta) -> 10.1.1.2 (ip local)
[/quote]
Obrigado pela ajuda!!! Bom, como no socket é IP, PORTA a sintaxe, eu vou tentar IP:Máscara, porta pra ver se funciona.
Caso contrário faço como sugeriu, se tiver uma máquina só ponho um ip específico. Valew
[quote=fantomas]Cara desculpe se viagei nas coisas que vc falou mas o IP da casa (fixo) tem que estar devidamente disponibilizado na rede. Capiturar o IP assim “na boa” acho que não rola por causa da segurança, deve ter um montão de coisas dinamicas no meio.
[/quote]
Eu seria um crimonoso procurado se forçásse cada cliente meu ter um ip fixo na na web. Imagine 40.000 clientes?! 40000 novos ips fixos? Eu ia falir com a internet ^^. Meu raciocício é que se o router já tem um ip disponibilizádo, posso acessar sua rede interna a partir dele.(veja os métodos discutidos neste tópico).