Como Evitar que o Cliente se conecte duas vezes ao mesmo Servidor? ( Socket -> Server Socket)

11 respostas
SirDominque

Opa Gente :stuck_out_tongue:
Preciso de uma ajudinha.

Bom, é o seguinte.
Eu tenho um serverSocket que fica recebendo conexões, eu guardo cada socket numa lista.

Eu queria saber, como eu tenho que fazer pra CHECAR se o cliente esta se conectando duas vezes ou se ele esta no ArrayList de Banidos Temporariamente?

Eu tentei usando iNetAddress.toString()
Tentei tambem acceptedSocket = socket(do arraylist)

Nenhum deles Funcionam.

Como faço plx ?

Alguem me ajuda?

11 Respostas

drsmachado

Listas permitem elementos duplicados.
Qual a coleção que não permite elementos duplicados?

SirDominque

drsmachado:
Andre Lopes:

Eu tenho um serverSocket que fica recebendo conexões, eu guardo cada socket numa lista.

Listas permitem elementos duplicados.
Qual a coleção que não permite elementos duplicados?

Eu tenho um IF que checa se o iNetAddress é o mesmo.Mas não Funciona :slight_smile:

nebster

normalmente eh checado o ip de cada conexão,
se o ip for igual desloga o anterior e loga o novo.

SirDominque

nebster:
normalmente eh checado o ip de cada conexão,
se o ip for igual desloga o anterior e loga o novo.

Então, mas eu estou usando AcceptedSocket.getiNetAddress().toString() == iNetAddress.ToString ( da lista de usuarios)

E

== para comparar strings? ??? Você faltou às aulas iniciais de Java :slight_smile:

De qualquer forma, não compare strings.

Compare os objetos InetAddress usando equals mesmo. http://docs.oracle.com/javase/6/docs/api/java/net/InetAddress.html#equals(java.lang.Object)

E

Eu não recomendaria usar esse tipo de coisa (2 conexões vindo do mesmo endereço = mesmo cliente). Isso é porque você pode ter, por exemplo, dois clientes distintos que estão atrás de um NAT e vão aparecer para você como se fossem o mesmo endereço, o que irá ser bastante prejudicial, na verdade.

Em vez disso, veja se a identidade do usuário é a mesma (você precisa ter uma transação de login, é claro). Se for a mesma, derrube o usuário (negando o login,por exemplo).

nebster

um bom exemplo a ser seguido é login e senha para acessar o sistema de socket.

SirDominque

entanglement:
== para comparar strings? ??? Você faltou às aulas iniciais de Java :slight_smile:

De qualquer forma, não compare strings.

Compare os objetos InetAddress usando equals mesmo. http://docs.oracle.com/javase/6/docs/api/java/net/InetAddress.html#equals(java.lang.Object)

Eu sei rapaz, é que respondi correndo.
Desculpa pela falta de atenção.

SirDominque

entanglement:
Eu não recomendaria usar esse tipo de coisa (2 conexões vindo do mesmo endereço = mesmo cliente). Isso é porque você pode ter, por exemplo, dois clientes distintos que estão atrás de um NAT e vão aparecer para você como se fossem o mesmo endereço, o que irá ser bastante prejudicial, na verdade.

Em vez disso, veja se a identidade do usuário é a mesma (você precisa ter uma transação de login, é claro). Se for a mesma, derrube o usuário (negando o login,por exemplo).

È verdade.
Bom, vou fazer isso que voce disse… Pq na verdade ja tenho um sistema de login :stuck_out_tongue:

Valeu Entanglement

E

Só uma coisinha… como é que você permite que o cliente se conecte de novo?

a) Se ele executar uma transação de logout, a conexão é derrubada, a sessão dele é limpa e ele pode se conectar de novo
b) Se ele ficar inativo por muito tempo, ou se o socket cair, a sessão dele é limpa e ele pode se conectar de novo
c) Se ele já estiver conectado, pode derrubar a sessão que já está em curso.
c) Se ele já estiver conectado, você pode derrubar a OUTRA sessão - já vi muita gente pedir para fazer isso, e acho interessante se a detecção de conexão derrubada demorar muito para acontecer (isso é costumeiro se você não tiver uma transação de heartbeat no seu protocolo, já que a detecção de conexão derrubada do protocolo TCP é bastante lenta e não muito confiável).
A mensagem típica é “Parece que você já está conectado no endereço XX.XXX.XXX.XXX. Deseja desconectar a outra sessão e continuar com esta? S/N”.

SirDominque

entanglement:
Só uma coisinha… como é que você permite que o cliente se conecte de novo?

a) Se ele executar uma transação de logout, a conexão é derrubada, a sessão dele é limpa e ele pode se conectar de novo
b) Se ele ficar inativo por muito tempo, ou se o socket cair, a sessão dele é limpa e ele pode se conectar de novo
c) Se ele já estiver conectado, pode derrubar a sessão que já está em curso.
c) Se ele já estiver conectado, você pode derrubar a OUTRA sessão - já vi muita gente pedir para fazer isso, e acho interessante se a detecção de conexão derrubada demorar muito para acontecer (isso é costumeiro se você não tiver uma transação de heartbeat no seu protocolo, já que a detecção de conexão derrubada do protocolo TCP é bastante lenta e não muito confiável).
A mensagem típica é “Parece que você já está conectado no endereço XX.XXX.XXX.XXX. Deseja desconectar a outra sessão e continuar com esta? S/N”.

Falta eu fazer isso aqui :
c) Se ele já estiver conectado, você pode derrubar a OUTRA sessão - já vi muita gente pedir para fazer isso, e acho interessante se a detecção de conexão derrubada demorar muito para acontecer (isso é costumeiro se você não tiver uma transação de heartbeat no seu protocolo, já que a detecção de conexão derrubada do protocolo TCP é bastante lenta e não muito confiável).
A mensagem típica é “Parece que você já está conectado no endereço XX.XXX.XXX.XXX. Deseja desconectar a outra sessão e continuar com esta? S/N”.

E colocar o “HeartBeat”/Ping Test.

:stuck_out_tongue:

Criado 1 de julho de 2013
Ultima resposta 1 de jul. de 2013
Respostas 11
Participantes 4