Socket não desconecta

1 resposta
J

Olá amigos.

Tenho o seguinte código:

public class TesteConexao {
	// Thread que recebe a conexão
	private class Servidor extends Thread{
		private ServerSocket sSocket;
		private Socket socket;
		
		public void run(){
			try{
				sSocket = new ServerSocket(1234);
				socket = sSocket.accept();
				System.out.println(socket.getInetAddress().getHostName() + " conectado!");
				while(socket.isConnected()){ // espera o usuário desconectar
					sleep(1000);
					System.out.println("Servidor esperando...");
				}
				System.out.println(socket.getInetAddress().getHostName() + " desconectou!");
			} catch(Exception e){
				e.printStackTrace();
			}
		}
	}
	
	// Thread que solicita a conexão
	private class Cliente extends Thread{
		private Socket socket;
		
		public void run(){
			try {
				socket = new Socket("localhost", 1234);
				sleep((int)(Math.random() * 10000));
				System.out.println("Cliente desconectando...");
				socket.close();
			} catch (UnknownHostException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	public TesteConexao() {
		new Servidor().start();
		new Cliente().start();
	}
	
	public static void main(String args[]){
		new TesteConexao();
	}

}

Porém, após o Cliente executar o socket.close(), o servidor continua executando o laço.
Alguém saberia me dizer o que está errado?
Obrigado!

1 Resposta

J

Olá novamente, amigos…

Consegui fazer o código acima detectar o encerramento da conexão. Não sei se foi da maneira mais adequada, porém foi a única que funcionou.

O método que eu usei foi o seguinte: em cada iteração do laço, o servidor executa um socket.getOutputStream().write(1). Quando esse método é mal-sucedido, ele lança uma SocketException que eu capturo e trato como encerramento da conexão.

Porém isso é “gambi”. Deve ter um jeito certo de detectar o encerramento da conexão!

Alguma sugestão?
Obrigado!

Criado 25 de abril de 2007
Ultima resposta 26 de abr. de 2007
Respostas 1
Participantes 1