Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dúvida ao fechar socket

Aos 10:44 quando é chamado o método servidor.parar() a variável de controle no laço while muda para false, então por que assim ele entra no bloco e tenta aceitar aceitar a conexão gerando a excessão?

3 respostas

Eu acho que entendi...é que é muito rápido ele pode ter fechado o socket no meio tempo entre entrar no while e executar a inha do socket.accept() será que é isso?

Se for bah que loucura haha é muita coisa assícrona...perdemos o controle hehe

solução!

Olá Guilherme, tudo bem?

Sim, quando a variável de controle no laço while é alterada para false, o loop é encerrado e o método servidor.parar() é chamado para fechar o socket do servidor. No entanto, pode ocorrer que entre o momento em que a variável é alterada e o momento em que o método servidor.parar() é chamado, um novo cliente possa tentar se conectar ao servidor. Nesse caso, a linha socket.accept() será executada novamente, gerando uma exceção.

Essa é uma das peculiaridades da programação concorrente e assíncrona. Quando lidamos com múltiplas threads e eventos que ocorrem simultaneamente, é necessário pensar em todas as possíveis interações entre eles e garantir que o código seja seguro e robusto. É um desafio, mas também é o que torna a programação concorrente tão poderosa e eficiente em determinados cenários.É importante lembrar que, ao fechar um socket, é necessário garantir que todas as conexões existentes também sejam fechadas antes de encerrar o servidor.

Para evitar esse problema, você pode implementar um mecanismo de controle de conexões, que garanta que todas as conexões sejam fechadas antes de encerrar o servidor. Uma opção é manter uma lista de todos os sockets abertos e percorrer essa lista ao fechar o servidor, fechando um por um.

Espero ter ajudado e bons estudos!

"Uma opção é manter uma lista de todos os sockets abertos e percorrer essa lista ao fechar o servidor, fechando um por um."

Boa!