Bom dia pessoal;
gostaria de uma ajudinha com meu código,pois, não consegui identificar o problema ainda.
Tenho um SocketClient que se conecta ao servidor para troca de mensagens,no primeiro momento meu socket funciona sem nenhum problema,eu mando alguns comandos ao servidor e obtenho a resposta, no entanto, quando a conexão cai eu tento reconectar e consigo,o problema está no seguinte: depois de reconectar eu preciso mandar 3,4,5 vezes o comando pra que ele chegue no servidor e obter a resposta.
Aí vai meu codigo pra quem puder dar uma olhada.
Valeu pessoal!
Esse é o socket
package threads;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.Observable;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author leonardo
*/
public class SocketLeitura extends Observable implements Runnable{
public class EventoConexao{
}
public class EventoDesconexao{
}
//declara variavel socket
Socket conecta;
public SocketLeitura(Socket s){
//metodo que recebe socket como parametro
conecta = s;
}
@Override
//sobrescreve metodo run
public void run(){
setChanged();
notifyObservers(new EventoConexao());
try {
//captura os streams de entrada no socket
BufferedReader entrada = new BufferedReader(new InputStreamReader(conecta.getInputStream()));
do{
String mensagem = entrada.readLine();
if(mensagem==null){
conecta.close();
break;
}else{
//enquanto o buffer tiver entrada
System.out.println("do Servidor: "+ mensagem);}
//imprime as linhas de entrada
}while(Thread.currentThread().isAlive());
} catch (IOException ex) {
Logger.getLogger(SocketLeitura.class.getName()).log(Level.SEVERE, null, ex);
}finally{
setChanged();
notifyObservers(new EventoDesconexao());
}
}
}
Aqui o MAIN
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package threads;
import java.io.IOException;
import java.io.PrintStream;
import java.net.InetSocketAddress;
import java.net.NoRouteToHostException;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;
import java.util.Observable;
import java.util.Observer;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author leonardo
*/
public class testaleitura implements Observer{
SocketAddress server = new InetSocketAddress("tele-teste", 22000);
private void executaSocket(){
try {
//cria o socket com o endereço e porta do server
Socket s = new Socket();
s.connect(server);
//passa o socket como parametro para a classe que cria as Threads
SocketLeitura leitura = new SocketLeitura(s);
//cria a Thread
Thread t = new Thread(leitura);
// Me registro como ouvinte dos eventos do socket
leitura.addObserver(this);
//inicia a Thread
t.start();
//Ler comandos digitados no teclado
Scanner teclado = new Scanner(System.in);
//cria saida dos Streams para a conexão
PrintStream saida = new PrintStream(s.getOutputStream());
//laço - enquanto houver comandos a enviar
while(teclado.hasNextLine()){
//envia comandos
saida.println(teclado.nextLine());
}
}
catch(NoRouteToHostException e){
System.out.println("Não foi possível localizar o caminho especificado!");
}
catch (UnknownHostException uHException) {
uHException.printStackTrace();
System.out.println("Host não encontrado ou fora da rede!");
} catch (IOException iOException) {
iOException.printStackTrace(); }
}
public void update(Observable o, Object arg) {
if(arg instanceof SocketLeitura.EventoConexao){
System.out.println("Socket conectado!");
return;
}
if(arg instanceof SocketLeitura.EventoDesconexao){
System.out.println("Socket desconectado! Tentando reconectar!");
try {
for(int i=0;i<30;i++){
Thread.sleep(5000);
executaSocket();
System.out.println("tentativo: "+(i+1));
}
} catch (Exception ex) {
Logger.getLogger(testaleitura.class.getName()).log(Level.SEVERE, null, ex);
}
return;
}
}
public static void main(String[] args) {
testaleitura tl = new testaleitura();
tl.executaSocket();
}
}