none
Detectar usuário online) RRS feed

  • Pergunta

  • E aí galera, tudo bem? Eu tenho um sistema com banco de dados local, que faz o login de uma conta existente no mesmo. Eu criei um sistema de detecção de usuário online, quando o usuário entrar, a linha chamada Status no banco de dados (int) vai para 1 e quando ele desloga do usuário, ele vai para 0. Mas há um jeito de burlar isso, quando o usuário encerra o processo da aplicação, existe um sistema assim mais complexo?

    Obrigado.


    • Editado Marcos SJ terça-feira, 12 de abril de 2016 14:48 Edição
    segunda-feira, 11 de abril de 2016 15:50

Respostas

  • Você na verdade precisa deixar o banco de lado nesse sentido.

    É virtualmente impossível você detectar se o usuário está online dessa forma. Em um cenário ideal aonde TODA VEZ QUE O PROGRAMA ENCERRA ELE ATUALIZA O STATUS NO BANCO, funcionaria. O raciocínio não está errado, mas você não pode prever as diversas possibilidades disso dar errado como; o programa encerra inesperadamente por um erro no sistema cliente, o cliente perde conexão com a rede ou simplesmente o computador cliente é desligado a força (falta luz por exemplo).

    A outra solução é você usar o princípio que o XMPP usa. O XMPP é um serviço de mensagens, tipo SKYPE. Ele é usado para troca de mensagens, mas o princípio pode ser aplicado para o seu caso. O que acontece é que tem um programa no servidor e um no cliente e eles ficam se comunicando constantemente (tipo, de 5 em 5 segundos ou algo assim) para ambos saberem que o outro ainda está conectado (um exemplo de biblioteca C# é o agsXMPP).

    Se quiser manter o banco tem outra possibilidade, não tão interessante. Ao invés de guardar 0 ou 1 no campo status transforme-o em um campo DATETIME. O que você vai fazer é colocar no código do seu programa uma Thread que vai ficar ligando para o banco (de X em X tempo) e gravando no banco a data, hora, minuto, segundo ... dessa ligação. Assim quando você pesquisar no banco quem está online, faça-o procurando por quem teve a última conexão em até 1 minuto (ou X tempo que você definiu). Nessa ligação, quando o seu programa ligar para o banco, se a última ligação foi maior do que o tempo definido, desconecte o usuário (no cliente).

    Eu não gosto muito dessa segunda opção, porque vai causar uma carga alta no banco de dados quando ele deveria estar sendo usado para tarefas de manipulação de dados. O programa que fica ouvindo o cliente (tipo o XMPP) já trabalha com Sockets, e não grava nada em lugar nenhum. É tudo na memória. O que é ótimo porque se o servidor cair por exemplo todos os usuários estão desconectados ...

    • Marcado como Resposta Marcos SJ terça-feira, 12 de abril de 2016 14:48
    terça-feira, 12 de abril de 2016 12:10

Todas as Respostas

  • Pode explanar melhor sua dúvida?
    segunda-feira, 11 de abril de 2016 17:15
  • Boa tarde Gerlanio!

    Você pode deixar por padrão ele com offline, ao entra na sua aplicação ele muda para offline, mas isso não no banco, em uma variável do Tipo bool, se aquela variável estiver true, é porque ele está online, se ela estiver false(que o padrão dela, tipo se o aplicativo finalizar ela vai está false) ele vai está offline. 

    Então se você consultar agora seu sistema e três pessoas estiverem com ele aberto, a variável vai está com o valor true, mas se alguém sair, só vai existir dois com true. 

    Uma maneira seria assim, mas não deu para entender muito bem.

    At.te, 

    segunda-feira, 11 de abril de 2016 19:22
  • Você na verdade precisa deixar o banco de lado nesse sentido.

    É virtualmente impossível você detectar se o usuário está online dessa forma. Em um cenário ideal aonde TODA VEZ QUE O PROGRAMA ENCERRA ELE ATUALIZA O STATUS NO BANCO, funcionaria. O raciocínio não está errado, mas você não pode prever as diversas possibilidades disso dar errado como; o programa encerra inesperadamente por um erro no sistema cliente, o cliente perde conexão com a rede ou simplesmente o computador cliente é desligado a força (falta luz por exemplo).

    A outra solução é você usar o princípio que o XMPP usa. O XMPP é um serviço de mensagens, tipo SKYPE. Ele é usado para troca de mensagens, mas o princípio pode ser aplicado para o seu caso. O que acontece é que tem um programa no servidor e um no cliente e eles ficam se comunicando constantemente (tipo, de 5 em 5 segundos ou algo assim) para ambos saberem que o outro ainda está conectado (um exemplo de biblioteca C# é o agsXMPP).

    Se quiser manter o banco tem outra possibilidade, não tão interessante. Ao invés de guardar 0 ou 1 no campo status transforme-o em um campo DATETIME. O que você vai fazer é colocar no código do seu programa uma Thread que vai ficar ligando para o banco (de X em X tempo) e gravando no banco a data, hora, minuto, segundo ... dessa ligação. Assim quando você pesquisar no banco quem está online, faça-o procurando por quem teve a última conexão em até 1 minuto (ou X tempo que você definiu). Nessa ligação, quando o seu programa ligar para o banco, se a última ligação foi maior do que o tempo definido, desconecte o usuário (no cliente).

    Eu não gosto muito dessa segunda opção, porque vai causar uma carga alta no banco de dados quando ele deveria estar sendo usado para tarefas de manipulação de dados. O programa que fica ouvindo o cliente (tipo o XMPP) já trabalha com Sockets, e não grava nada em lugar nenhum. É tudo na memória. O que é ótimo porque se o servidor cair por exemplo todos os usuários estão desconectados ...

    • Marcado como Resposta Marcos SJ terça-feira, 12 de abril de 2016 14:48
    terça-feira, 12 de abril de 2016 12:10