Aplicação CRUD trava esperando conexão socket

Pessoal criei uma aplicação CRUD em java para desktop e a mesma tem uma aplicação socket. Ao ativar um evento a aplicação espera uma conexão socket e apos recebe-la envia informações adquiridas no banco. O problema é que quando eu ativo esse evento e a conexão não acontece a aplicação trava, fica esperando eternamente, até fechar não aceita, como faço deixar essa conexão aberta por determinados segundos e depois fecha-la?

Para a aplicação não travar enquanto ela espera uma conexão socket, vc deve colocar esse evento dentro de uma Thread separada.

Opa!
Seria melhor postar o código aqui…

Mas em todos os casos para a aplicação fechar o socket depois de determinado tempo você usa o método Socket.setSoTimeOut(int milisegundos) ou ServerSocket.setSoTimeOut(int milisegundos).

Porém seria mais correto você utilizar Thread para manipular este socket. Por Exemplo: Aceita um novo socket pelo servidor e abre uma thread para manipular, assim tua aplicação principal não ficaria travada esperando a conexão.

Espero ter ajudado.

Att,
Yuri

Classe SocketServidor que estabelece a conexão e envia dados via socket.

public class SocketServidor {
   private ServerSocket serv = null;  
   private Socket s = null;  
   public PrintStream ps = null;
   public int porta = 7000;
   private boolean verifica_conexao = false;
    
   public void estabelecer_server(){
         
      try {  
         serv = new ServerSocket(porta);  
         s = serv.accept();
         verifica_conexao = true;
         JOptionPane.showMessageDialog(null, "conexão ok","", JOptionPane.INFORMATION_MESSAGE);
      }
      catch (IOException e){  
         System.out.println("Algum problema ocorreu para criar ou receber o socket.");
      }
   }  

   public void enviar_dados (String id, String nome){
       
       try{  
           ps = new PrintStream(s.getOutputStream());
           ps.println("C"+id+";"+nome+"#");
       }
       catch (IOException e){  
          System.out.println("Algum problema ocorreu para criar ou receber o socket.");
       } 
   }
   
   public void fecha_socket(){
       
      try{  
         serv.close();
         s.close();
         ps.close();
         verifica_conexao = false;
      }
      catch (IOException e){  
         System.out.println("Algum problema ocorreu para criar ou receber o socket.");
      } 
   }
   
   public boolean status_socket(){
      return verifica_conexao; 
   }
}    

Ai segue um exemplo.

public class SocketServidor {
   private ServerSocket serv = null;  
   private Socket s = null;  
   public PrintStream ps = null;
   public int porta = 7000;
   private boolean verifica_conexao = false;
    
   public void estabelecer_server(){
         
      try {  
         serv = new ServerSocket(porta);  
         s = serv.accept();
         verifica_conexao = true;
         JOptionPane.showMessageDialog(null, "conexão ok","", JOptionPane.INFORMATION_MESSAGE);
      }
      catch (IOException e){  
         System.out.println("Algum problema ocorreu para criar ou receber o socket.");
      }
   }  

   public void enviar_dados (String id, String nome){
           //Encaminha o socket para a manipulação na classe que é Runnable
           ManipulaConexao conex = new ManipulaConexao(s);
           
           //Envia a manipulaçao do socket para uma Thread
           new Thread(conex).start();
           
   }
   
   public void fecha_socket(){
       
      try{  
         serv.close();
         verifica_conexao = false;
      }
      catch (IOException e){  
         System.out.println("Algum problema ocorreu para criar ou receber o socket.");
      } 
   }
   
   public boolean status_socket(){
      return verifica_conexao; 
   }
   
     class ManipulaConexao implements Runnable {
        private Socket clientSock = null;


   
     public ManipulaConexao(Socket client){
            this.clientSock = client;
        }

    public void run(){
            try {              
                
                ps = new PrintStream(s.getOutputStream());
                ps.println("C"+id+";"+nome+"#");
                
                ps.close();
                s.close();

            } catch (IOException ex) {
                Logger.getLogger(ManipulaConexao.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
   
     }

No que a hora que ele espera pela conexao ja deve ser criado uma Thread.

Note que você está tentando enviar dados ao cliente com o servidor.

Ai eu fiz como uma classe interna mas você pode fazer da maneira que você quiser no entanto a classe deve ser Runnable.

Quando uma classe é Runnable quer dizer que todo seu contexto pode ser executado dentro de uma Thread.
Runnable obriga que um método chamado run() seja criado e é nessa parte que o código é executa em Thread.

A classe ManipulaConexao é Runnable por isso no metodo estabelecerServer() ela eh passada como referência de uma Thread: new Thread(conex).start().

Note que toda manipulação depois que você aceita um cliente, é bom que o Socket seja fechado.

Pelo que entendi você colocou o controle no momento de enviar os dados, mas eu faço a conexão antes e quando a mesma está ok eu envio os dados, assim eu preciso de algo que faça o controle no momento de estabelecer a conexão socket.

public class SocketServidor {
   private ServerSocket serv = null;  
   private Socket s = null;  
   public PrintStream ps = null;
   public int porta = 7000;
   private boolean verifica_conexao = false;
    
   public void estabelecer_server(){
         
      try {  
         serv = new ServerSocket(porta);  
         s = serv.accept();
         verifica_conexao = true;
         JOptionPane.showMessageDialog(null, "conexão ok","", JOptionPane.INFORMATION_MESSAGE);
      }
      catch (IOException e){  
         System.out.println("Algum problema ocorreu para criar ou receber o socket.");
      }
   }  

Alguém??