SOCKETS - Servidor multithead

2 respostas
sdinis

Boas a todos…
Eu tou fazendo um cliente e um servidor multithread, e meu problema esta mais do lado do servidor, assim… Eu crio tudo o necessario, e ta correndo bem, só gostava de esperar uns segundo se o cliente cair, tipo, tentar religar o seu socket. Isso é possível?

Eu tenho o código organizado nas seguintes classes:

Server -> Só cria uma thread com o SocketServer pois isto depois é para implementar com RMI e então já dividi tudo…

SocketServer -> Thread que esta responsavel por aceitar as ligacoes

Connection extends Thread implements MsgInterface-> Threads que o SocketServer vai criar (handler das ligacoes)

MsgInterface -> É uma interface com os metodos para cada String que vai chegando com comandos ao servidor.

ServerInfo -> Classe com toda a informacao relativa ao servidor, clientes ativos, ligacoes ativas, utilizadores registados… (Isto vai ser util pq vou ter de fazer servidores de backup, e assim estes dados estao à parte)

User e Users -> Classe que serve apenas para guardar os utilizadores…

  1. Em primeiro lugar, queria uma opinião acerca desta distribuição, parece legal??

  2. Como faco retry à ligacao se o cliente cair? esperar 5*10s e se n voltar, fazer disconnect

  3. Estou tb com problemas em manter o registo de clientes ativos e nao ativos… Saber se a ligacao acabou ou nao…

Mando um pouco do codigo da thread connection, que não é mais q um ciclo infinito a espera de mensagens para depois reagir… Este bocado é o catch no final, ou seja, se o readUTF der erro, eu vou ter de fazer a tal tentativa de reconnect e so se nao der, desligar…

catch (Exception e)
        {
            System.out.println("Erro readUTF: "+e);
            int i;
            for(i=0; i<5; i++)
            {
                System.out.println((i+1)+"a tentativa de restabelecer ligação!");
                if(getStreams() == 0)
                    i = 5;
            }
            if(i<5)
                System.out.println("Restabelecida a ligação!");
            else
                MsgLogout();
        }
    }

    public int getStreams()
    {
     try
        {
            if(!clientSocket.isConnected())
                clientSocket.connect(remoteSA,10);
            in = new DataInputStream(clientSocket.getInputStream());
            out = new DataOutputStream(clientSocket.getOutputStream());
            if(clientSocket.isConnected())
                return 0;
            else
                return -1;
        }
        catch(IOException e)
        {
            return -1;

        }

    }

Esta também o metodo getStreams que supostamente devolve 0 se a ligacao for restabelecida :slight_smile:

Coloco em anexo todo o codigo, a ver se consigo alguma ajuda… Senao um sitio onde ver exemplos ou tutoriais…

Brigadao a todos!

2 Respostas

P

Algumas dicas:

  1. Habilite o KeepAlive na conexão do cliente, tanto no lado do servidor quanto do cliente.

  2. Não entendi muito a necessidade de uma segunda conexão entre o cliente e o servidor, iniciada por este último. IMO, esta arquitetura só vai te dar dor de cabeça no mundo real, pois implica em uma configuração de firewall que permite conexões saintes do servidor para os clientes.

  3. Se é seu requisito este mecanismo (uma espécie de callback, se entendi direito), o mais adequado é, alem do KeepAlive, uma mensagem de sonda enviada de tempos em tempos pelo servidor (análogo ao ping, só que em nível de aplicação).

sdinis

Brigadao pelas sugestoes, muito uteis mmo :slight_smile: Vou dar cabecadas um pouco nisto e digo qqer coisa assim que arranje mais ou menos. A questao da segunda conexao, foi burrice minha, tenho de retirar isso, foi dakelas coisas que fazes quando ja tas farto de olhar para a mma coisa e n sabes q mais has-de fazer :stuck_out_tongue:

Enfim, vou tentar dar a volta. O meu principal problema estava em manter a informacao do cliente, quando cai a ligacao (do cliente). Eu gardar toda a sua informacao, inclusive mensagens por entragar e quando ele se voltar a reconectar (isto claro com um timeout de espera de 2,3 min) “fazer de conta” que nada tinha acontecido…

Mas a tua ideia de PING-PONG foi legal… Vou implementar.
Do género, se der erro no socket, eu faco 5 pings com intervalo de tempo 20s e se n receber PONG nesse tempo, faco logout desse cliente e assumo que se desligou. Correcto?

Brigadao pela ajuda :slight_smile:

Criado 23 de outubro de 2006
Ultima resposta 23 de out. de 2006
Respostas 2
Participantes 2