[Resolvido]Java e redes avançada?

10 respostas
D

Estou desenvolvendo um aplicativo em Java SE do tipo servidor de mensagens.
Existe o aplicativo Servidor e o cliente.
O servidor é responsável por gerenciar logins, status de usuários etc
e o a cliente é para visualizar status e enviar mensagens.

Este aplicativo está funcionando em redes internas normalmente, mas não tenho certeza se vai funcionar em redes externas por que quando
o aplicativo cliente A envia uma mensagem para o cliente B é direto, ou seja, o servidor não fica como intermediário nesta mensagem, a mensagem é enviada
diretamente do A pro B.

Alguém pode me dizer se este aplicativo pode funcionar em redes externas, por exemplo:
Se o cliente A estiver na Espanha e o cliente B estiver no Japão.

Agradeço desde já!

10 Respostas

C

Eu fiz um gerenciador de redes completo, estou criando a versao 2.0 dele, só com RMI
abaixo tem um link d um codigo fonte chat com rmi tbm… pegai…

http://javaaberto.blogspot.com.br/search/label/Codigo%20Fonte%20SE

D

charleston10:
Eu fiz um gerenciador de redes completo, estou criando a versao 2.0 dele, só com RMI
abaixo tem um link d um codigo fonte chat com rmi tbm… pegai…

http://javaaberto.blogspot.com.br/search/label/Codigo%20Fonte%20SE

Obrigado por passar este link!

Parece que o código deste Chat RMI usa da seguinte forma para envio de mensagens:
usuário A enviando uma mensagem para usuário B.

Como o aplicativo funciona:
o aplicativo do usuário A envia a mensagem para o servidor, o servidor armazena esta mensagem na memória até que o usuário B faça download dela, o aplicativo do
usuário B fica verificando de tempos em tempos no servidor se há mensagens para ele, no caso existe uma mensagem do usuário A, então
usuário B pede para o servidor esta mensagem.

É assim mesmo?

C

Não, não é assim que funciona o rmi nesse caso, da ate pra fazer isso q vc comentou, mas o programa funciona assim…
Tem um servidor central onde os clientes conectam nele, ok…

Apos isso, as pessoas podem conversar nessa sala, mas nao há nenhum tipo de espera para o outro usuario receber a mensagem,
pq n existe verificaçao, ele envia de acordo q o outro cliente estiver conectado.
Pra isso vc usa Listener, listener é um ouvinte que sabe automaticamente que algo mudou sabendo disso ele faz algo.

Aconselho vc estudar RMI, Sockets e Listener pois vai ajudar…

;]

V

diego.psw:
Estou desenvolvendo um aplicativo em Java SE do tipo servidor de mensagens.
Existe o aplicativo Servidor e o cliente.
O servidor é responsável por gerenciar logins, status de usuários etc
e o a cliente é para visualizar status e enviar mensagens.

Este aplicativo está funcionando em redes internas normalmente, mas não tenho certeza se vai funcionar em redes externas por que quando
o aplicativo cliente A envia uma mensagem para o cliente B é direto, ou seja, o servidor não fica como intermediário nesta mensagem, a mensagem é enviada
diretamente do A pro B.

Alguém pode me dizer se este aplicativo pode funcionar em redes externas, por exemplo:
Se o cliente A estiver na Espanha e o cliente B estiver no Japão.

Agradeço desde já!

Se pelo menos um dos endereços tiver um IP público, vai funcionar. Entretanto, quem tem o IP privado deverá iniciar a conexão.

Se os dois estiverem atrás de um NAT, aí ferrou. Você só resolveria com um servidor publico, como faz qualquer servidor de messaging.

D

charleston10:
Não, não é assim que funciona o rmi nesse caso, da ate pra fazer isso q vc comentou, mas o programa funciona assim…
Tem um servidor central onde os clientes conectam nele, ok…

Apos isso, as pessoas podem conversar nessa sala, mas nao há nenhum tipo de espera para o outro usuario receber a mensagem,
pq n existe verificaçao, ele envia de acordo q o outro cliente estiver conectado.
Pra isso vc usa Listener, listener é um ouvinte que sabe automaticamente que algo mudou sabendo disso ele faz algo.

Aconselho vc estudar RMI, Sockets e Listener pois vai ajudar…

;]

Uma hora ou outra eu vou estudar estes recursos mesmo, no caso de Socket já tenho algum conhecimento,
e até consegui criar um aplicativo simples utilizando Sockets,
mas agora eu preciso de entender melhor como é possível a comunicação ser realizada em baixo nível!
Usando pacotes (Datagrams).
No aplicativo que estou desenvolvendo utilizo somente DatagramPacket para fazer a comunicação e preciso saber se é possível
fazer a comunicação entre um usuário e outro diretamente por DatagramPacket.
No caso o usuário A abre uma porta onde possibilite que o usuário B envie uma mensagem para ele.
Em redes internas isto está funcionando, mas não tenho certeza se este aplicativo pode funcionar em redes externas, já que o usuário A abre uma porta
na sua máquina mas como o aplicativo do usuário A poderia abrir uma porta no roteador via código?
Existe outra solução que não abrir porta no roteador?

D

[quote=diego.psw]

charleston10:
Não, não é assim que funciona o rmi nesse caso, da ate pra fazer isso q vc comentou, mas o programa funciona assim…
Tem um servidor central onde os clientes conectam nele, ok…

Apos isso, as pessoas podem conversar nessa sala, mas nao há nenhum tipo de espera para o outro usuario receber a mensagem,
pq n existe verificaçao, ele envia de acordo q o outro cliente estiver conectado.
Pra isso vc usa Listener, listener é um ouvinte que sabe automaticamente que algo mudou sabendo disso ele faz algo.

Aconselho vc estudar RMI, Sockets e Listener pois vai ajudar…

;]

Uma hora ou outra eu vou estudar estes recursos mesmo, no caso de Socket já tenho algum conhecimento,
e até consegui criar um aplicativo simples utilizando Sockets,
mas agora eu preciso de entender melhor como é possível a comunicação ser realizada em baixo nível!
Usando pacotes (Datagrams).
No aplicativo que estou desenvolvendo utilizo somente DatagramPacket para fazer a comunicação e preciso saber se é possível
fazer a comunicação entre um usuário e outro diretamente por DatagramPacket.
No caso o usuário A abre uma porta onde possibilite que o usuário B envie uma mensagem para ele.
Em redes internas isto está funcionando, mas não tenho certeza se este aplicativo pode funcionar em redes externas, já que o usuário A abre uma porta
na sua máquina mas como o aplicativo do usuário A poderia abrir uma porta no roteador via código?
Existe outra solução que não abrir porta no roteador?
Ou como é possível o usuário B enviar um pacote para o usuário A sendo que não há uma porta aberta no roteador(do usuário A) vinculada com a máquina que roda o aplicativo
do usuário A?

D

ViniGodoy:
diego.psw:
Estou desenvolvendo um aplicativo em Java SE do tipo servidor de mensagens.
Existe o aplicativo Servidor e o cliente.
O servidor é responsável por gerenciar logins, status de usuários etc
e o a cliente é para visualizar status e enviar mensagens.

Este aplicativo está funcionando em redes internas normalmente, mas não tenho certeza se vai funcionar em redes externas por que quando
o aplicativo cliente A envia uma mensagem para o cliente B é direto, ou seja, o servidor não fica como intermediário nesta mensagem, a mensagem é enviada
diretamente do A pro B.

Alguém pode me dizer se este aplicativo pode funcionar em redes externas, por exemplo:
Se o cliente A estiver na Espanha e o cliente B estiver no Japão.

Agradeço desde já!

Se pelo menos um dos endereços tiver um IP público, vai funcionar. Entretanto, quem tem o IP privado deverá iniciar a conexão.

Se os dois estiverem atrás de um NAT, aí ferrou. Você só resolveria com um servidor publico, como faz qualquer servidor de messaging.

Mas este servidor atuaria como intermediário entre as mensagens?
Se sim, então teria que haver comunicação através de conexões ( Socket e ServerSocket ) em vez de pacotes simples(DatagramPacket DatagramSocket)?
se deve usar conexão ( Socket e ServerSocket ) e o computador que roda cliente está atrás de um NAT fala para o roteador o seguinte quando a conexão é iniciada:
O roteador, abre uma porta aí temporariamente(enquanto a conexão estiver aberta, mas não permita pacotes intrusos), para que o servidor comunique comigo sem que eu precise enviar um pacote para ele antes, ou seja, o servidor determina a hora certa que o cliente deve atualizar alguma coisa?

Se tudo que eu falei acima é verdadeiro, então não é possível fazer uma comunicação completa somente por DatagramPacket e DatagramSocket, porque é preciso
que a comunicação seja feita numa camada de alto nível da suíte de protocolos TCP/IP onde o computador e o com ip privado possa pedir para o roteador abrir uma porta
temporariamente e não permitir pacote intrusos( esta seria a conexão protegida! )?

Quando digo que o computador com ip privado pede para o roteador abrir uma porta para que a conexão seja estabelecida, quero dizer que o computador e o roteador
devem trabalhar na mesma camada da suíte TCP/IP! Agora não sei se é desta forma! imagino que seja assim!

Mas minhas conclusões atuais dizem que não é possível o servidor notificar o cliente se os dois trabalham na camada (DatagramPacket e DatagramSocket)

A questão é que quero entender como este processo funciona, porque a utilização já entendi!

D

diego.psw:
ViniGodoy:
diego.psw:
Estou desenvolvendo um aplicativo em Java SE do tipo servidor de mensagens.
Existe o aplicativo Servidor e o cliente.
O servidor é responsável por gerenciar logins, status de usuários etc
e o a cliente é para visualizar status e enviar mensagens.

Este aplicativo está funcionando em redes internas normalmente, mas não tenho certeza se vai funcionar em redes externas por que quando
o aplicativo cliente A envia uma mensagem para o cliente B é direto, ou seja, o servidor não fica como intermediário nesta mensagem, a mensagem é enviada
diretamente do A pro B.

Alguém pode me dizer se este aplicativo pode funcionar em redes externas, por exemplo:
Se o cliente A estiver na Espanha e o cliente B estiver no Japão.

Agradeço desde já!

Se pelo menos um dos endereços tiver um IP público, vai funcionar. Entretanto, quem tem o IP privado deverá iniciar a conexão.

Se os dois estiverem atrás de um NAT, aí ferrou. Você só resolveria com um servidor publico, como faz qualquer servidor de messaging.

Mas este servidor atuaria como intermediário entre as mensagens?
Se sim, então teria que haver comunicação através de conexões ( Socket e ServerSocket para evitar que o cliente faça verificações periódicas no servidor ) em vez de pacotes simples(DatagramPacket DatagramSocket)?
se deve usar conexão ( Socket e ServerSocket ) e o computador que roda cliente está atrás de um NAT fala para o roteador o seguinte quando a conexão é iniciada:
O roteador, abre uma PORTA AÍ TEMPORARIAMENTE(enquanto a conexão estiver aberta, mas não permita pacotes intrusos), para que o servidor comunique comigo sem que eu precise enviar um pacote para ele antes, ou seja, o servidor determina a hora certa que o cliente deve atualizar alguma coisa?

Se tudo que eu falei acima é verdadeiro, então não é possível fazer uma comunicação completa somente por DatagramPacket e DatagramSocket, porque é preciso
que a comunicação seja feita numa camada de alto nível da suíte de protocolos TCP/IP onde o computador com ip privado possa pedir para o roteador abrir uma porta
temporariamente e não permitir pacotes intrusos( esta seria a conexão protegida! )?

Quando digo que o computador com ip privado pede para o roteador abrir uma porta para que a conexão seja estabelecida, quero dizer que o computador e o roteador
devem trabalhar na mesma camada da suíte TCP/IP( camada acima da camada de Transporte )! Agora não sei se é desta forma! imagino que seja assim!

Mas minhas conclusões atuais dizem que não é possível o servidor notificar o cliente se os dois trabalham na camada (DatagramPacket e DatagramSocket)

A questão é que quero entender como este processo funciona, porque a utilização já entendi!

Preciso que uma pessoa com uma experiência lascada em redes fale se o que falei é valido!

V

Calma, cara pálida, não se desespere.

Você sabe o que é um DatagramPacket?

Trata-se de usar o protocolo UDP/IP e não do TCP/IP. O UDP roda exatamente na mesma camada do TCP, porém, é um outro protocolo. Ele não dá garantia de entrega, ordenação ou integridade dos datagramas. Ele também é orientado a pacotes não a fluxos de dados. Você não está mudando de camada e a comunicação entre redes: ela continua sendo feita pelo protocolo IP, normalmente. E será possível trocar datagramas entre IPs públicos, fazer multicasts, etc… O UDP também é plenamente suportado por roteadores, já que tipicamente eles atuam só na camada 3 (a do IP), deixando quieto o que quer que esteja nas outras camadas.

No caso do UDP é possível furar um NAT através de uma técnica conhecida como Hole Punching. Mas você ainda precisará de um servidor intermediário para facilitar a comunicação.

D

ViniGodoy:
Calma, cara pálida, não se desespere.

Você sabe o que é um DatagramPacket?

Trata-se de usar o protocolo UDP/IP e não do TCP/IP. O UDP roda exatamente na mesma camada do TCP, porém, é um outro protocolo. Ele não dá garantia de entrega, ordenação ou integridade dos datagramas. Ele também é orientado a pacotes não a fluxos de dados. Você não está mudando de camada e a comunicação entre redes: ela continua sendo feita pelo protocolo IP, normalmente. E será possível trocar datagramas entre IPs públicos, fazer multicasts, etc… O UDP também é plenamente suportado por roteadores, já que tipicamente eles atuam só na camada 3 (a do IP), deixando quieto o que quer que esteja nas outras camadas.

No caso do UDP é possível furar um NAT através de uma técnica conhecida como Hole Punching. Mas você ainda precisará de um servidor intermediário para facilitar a comunicação.

Sei, claro, estou criando um aplicativo e estou utilizando DatagramPacket.
A questão é que hole punching talvez seja o que estou procurando.

vlw pelas dicas!

Até a próxima!

Criado 12 de janeiro de 2013
Ultima resposta 15 de jan. de 2013
Respostas 10
Participantes 3