Ok, vamos começar do começo. Não sei o que você está fazendo e como, mas ao fazer com a rede, você deve tentar o padrão REACTOR .
Basicamente, o reator é uma maneira de evitar o uso de encadeamentos ou adiá-lo quando uma tarefa encadeada é mais dissociada pelo núcleo.
O centro do reator é a função de seleção : você registra suas fontes de eventos e solicita que a seleção retorne quando algo acontecer com uma dessas fontes .
Quando algo é anexado, o loop principal do reator simplesmente encontra o que se aplica a que fonte está reagindo criando um Evento e despacha esse evento para objetos interessados nesse tipo de evento.
Eu não sou um Java Guru, mas eu sei que você pode configurar o soquete (mesmo os UDP) e pode configurá-los como não-bloqueadores. Junto com isso, eu sei que há uma classe chamada Selector em um pacote chamado NIO. Esses itens concordam em definir um recurso de E / S multiplexado e sem bloqueio
Tudo que você precisa é simplesmente configurar dois canais UDP: um para escuta do servidor e outro para conversação do servidor; registre o que está ouvindo no reator e integre a etapa de reação do reator ao loop principal.
Leve em consideração que esse tipo de abordagem permite conectar-se simultaneamente a diferentes canais, para que você considere desenvolver um jogo ponto a ponto (sem gargalos no servidor e design distribuído ... parece bom!)
PS
Observe que, se você estiver usando algum tipo de interface / instalação GUI, provavelmente já estará usando um reator ...