simplesmente faça out.flush()
Eu sugeriria que você lesse os oito bytes primeiro e depois trabalhasse com a decodificação do resultado.
Basicamente, isso pode ser resolvido num while mais ou menos como:
OutputStream out = Socket.getOutputStream();
int nRead = 0;
byte[] buffer = new byte[8];
while (out.read() != -1 && nRead < 8) {
byte[nRead] = out.read();
nRead++;
}
if (nLidos == 8) //Não será 8 se a conexão fechar. read() retornará -1.
processMessage(buffer);
Usar Channels, Selectors e ByteBuffers é muito legal, aumenta muito o throughput e a performance do servidor, mas não creio que tenha sido a sua dúvida inicial. Se você está começando com sockets, eu sugeriria que você partisse para algo mais simples.
Se quiser mexer com NIO, comece com uma programação similar a com sockets, se beneficiando apenas do SocketChannel e dos ByteBuffers. O ByteBuffer facilita muito o trabalho com os buffers, suporta little e big endian e facilita a leitura de tipos primitivos.
Depois, quando você tiver mais prática e entender as vantagens/desvantagens do sistema multi thread, parta para os selectors.