Thread, DatagramSokect,while e muita dor de cabeça

Olá,
estou enfrentando um problema q não sei mais oq fazer.
tenho uma comunicação via DatagramSocket que roda em uma classe que implementa a Interface runnable, quando a comunicação terminar quero fechar o socket parar a thread e dar um dispose no Jframe.
na teoria faço mas quando o Jframe eh aberto recebo a linda mensagem do socket java.net.BindException: Address already in use: Cannot bind.

ja tentei usando variavel local, global chamar o close em um metodo stop junto com um boolean para para o loop e nenhum sucesso.
alguma ajuda?

Grato.


 public void stop() {
        try {
            turnoff = false;

            thread.interrupt();

        } catch (Exception e) {
            System.err.println("erro serverRX stop :" + e);
        }
    }

    @Override
    public void run() {

        while (turnoff) {
            try {
                DatagramSocket socket = new DatagramSocket(PORTGAME);
                byte[] dados = new byte[MESSAGESHORT];
                DatagramPacket datagram = new DatagramPacket(dados, dados.length);
                socket.receive(datagram);
                byte[] recebido = datagram.getData();
                String message = new String(recebido);
                message = message.trim();
                if (message.startsWith(UPDATEME)) {
                   ...
                }
                socket.close();
                Thread.sleep(50);
            } catch (IOException | NumberFormatException e) {
                System.err.println("erro serverRX while :" + e);
            } catch (InterruptedException ex) {
                Logger.getLogger(ServerRX.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

    }

1° se estiver utilizando Windows tente alterar este parâmetro no Registro:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters

TcpTimedWaitDelay
A DWORD value, in the range 30-300, that determines the time in seconds that elapses before TCP can release a closed connection and reuse its resources. Set this to a low value to reduce the amount of time that sockets stay in TIME_WAIT.

altere para 30 segundos e faça um teste na sua aplicação


2° tente colocar o socket para re-abrir após 30 segundos (coloque um break point na re-abertura do socket e cronometra no relógio mesmo… depois libera) e podemos ver se tem ligação uma coisa com outra.


3° ao invés de usar:

DatagramSocket socket = new DatagramSocket(PORTGAME);

use:

DatagramSocket socket = new DatagramSocket(null); socket.setReuseAddress(true); socket.bind(new InetSocketAddress(PORTGAME))


4° tente após o disconect tente aguardar um periodo de tempo entre o close e o re-open do socket, por exemplo 10 segundos, depois 30 segundos, depois 1 minuto.


thread.sleep(10 * 1000 ) // 10 segundos
thread.sleep(30 * 1000 ) // 30 segundos
thread.sleep(60 * 1000 ) // 1 minuto

são sugestões que pesquisei na internet talves alguma funcione. espero ter ajudado.

olá,
ataquei direto na 3ª dica aparentemente funcionou, vou fazer mais teste em casa estou no trampo agora…
wlw cara foi de grande ajuda suas dicas.