Ajuda com socket + threads

Ola pessoal, estou implementando uma aplicação socket, já dei uma boa pesquisada mas não consegui encontrar uma solução, por isso resolvi pedir um help, meu caso é o seguinte:
A minha aplicação funciona apenas como cliente, utilizo threads para dar start em cada cliente, pois cada um se conecta a um servidor diferente, o problema é que não consigo fazer um controle mais exato por threads executada, pois listo os servidores de uma base de dados, cada IP um servidor, cada cliente novo conecta com um servidor diferente, não consegui utilizar uma maneira de instanciar a classe socket dando nomes a elas sendo seus respectivos ips de conexao, teria alguma forma de fazer isso?
Segue abaixo o metodo startCliet para vcs conferirem…

 private void startClient(){
         if (jchkConexao.isSelected()) {
            try {
                conConexao();
               conn = DriverManager.getConnection("jdbc:firebirdsql://" + host + "/" + caminho, propBanco);
                String query = "SELECT dis_codigo,dis_sigla, dis_ip, dis_tipo from ace_dispositivo where dis_status = 1 order by dis_ip";

                PreparedStatement stmt = conn.prepareStatement(query);
                ResultSet rs = stmt.executeQuery(query);
                while (rs.next()) {
                    
                    ClientSocket client = new ClientSocket(
                            rs.getString(3), rs.getString(1), rs.getString(4), rs.getString(2));
                    client.start();                    

                }
                conn.close();
                
            } catch (IOException | ClassNotFoundException | SQLException ex) {
                logSalv.SalvarLog(logErro, ex, true, "jchkConexao || Classe- FrmConecta");
            }
        } else if (jchkConexao.isSelected() == false) {
            jlbStatus.setText("Agente Parado!");
            jchkConexao.setText("Iniciar");
            jlbStatus.setForeground(Color.red);
            jtaConectMessage.setText("");
        }
    }

Na classe ClientSocket acontece todo o resto, recebe um comando do servidor, processa e devolve uma mensagem conforme o resultado do processamento, porem, como se trata do cliente, se perder a comunicação de alguma forma, a thread continua rodando, não dando nenhum erro, como se ainda estivesse conectado, pra resolver isso tentei um keep_alive, porem não tenho controle do tratamento do recebimento do servidor, ou ele recebe a ou b, e isto é o comando final, n tem como reconhecer uma mensagem em especifico e saber se é apenas um keep_alive, entao pensei em dar nomes as threads para poder realizar o controle em restarte de conexao a cada determinado periodo, alguem pode dar um help?

Nessa classe ClientSocket, se você colocar uma Exception de quando a conexão cair e então você manda interromper a Thread resolve ?

Esse é o problema j-menezes, tentei colocar a Exception, porem, quando por algum motivo, a conexao para, o client (minha classe) n gera o Exception, é como se não houvesse a queda de conexao, como o servidor n envia outros dados, msm que de erro, n consigo travar uma mensagem apenas para saber se a conexao esta ativa, ele só me envia “sim”, e eu respondo com sim ou nao, caso a resposta não seja exatamente o que ele recebe, um “s1m” ou “n0o”, ele apenas nao executa o que tem q executar, mas nao me manda um erro tbm, assim eu conseguiria tratar isso como um keep_alive

E se no cliente você ficar recebendo um ping a intervalo minimo ?
Bom, em canais bloqueantes, isso segura um pouquinho né !!!
Por outro lado, se usar canais não bloqueantes fica melhor a questão do ping.
Em relação a keep_alive, já precisei dele algumas vezes.

Boa j-menezes, fiz dessa forma, com o controle de ping a parte, só não deu 100% certo pq ao mudar o status da variavel, tds as threads pararam, não apenas a que o servidor n respondeu, ate ok, poderia dar um start em tds, o problema que algumas haviam recebido solicitação do seu respectivo servidor, e antes da resposta, parou, estou dando uma olhada em Thread Pool, ver se assim consigo ter o controle individual de cada thread, por nome, creio tbm que seja a logica do meu codigo o problema, primeira vez que estou mexendo mais a fundo com threads, vamos ver se consigo resolver essa pendenga, deixarei o post em aberto ainda, caso tiver mais alguma dica, ou alguma boa alma pra ajudar, agradeço.

@j-menezes, aparentemente n se tem um controle/documentação maior se tratando apenas cliente, todos documentos, posts, exemplos e td que pude ler, só faz tratamento ou é mais detalhado na parte “servidor” do socket, como no meu caso preciso explorar melhor o lado cliente, nenhuma solução se aplica, pelo menos não no meu cenário, mas consegui resolver da seguinte maneira:
Inicio a aplicação com um timer, que, a cada 5 minutos, por um metodo na classe cliente (thread) da um stop em tds clientes, aguarda 3 segundos, tempo em que todos os loops param, e da um start novamente, iniciando um novo ciclo, aparentemente resolve o problema.
Muito obrigado pela ajuda meu caro, grande abraço.

1 curtida