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??