Sockets - singlethread e multithread

Pessoal, boa noite.

É o seguinte, gostaria pedir ajuda numa dúvida. Eu tenho o seguinte problema:

Eu quero que o cliente primeiro se conecte ao servidor(estabeleça uma conexão) e futuramente ele envie requisições ao servidor, até aí tudo bem. Agora, qual a melhor forma dessas requisições serem feitas? Devo fazer uma mensagem pré-formatada(cabeçalho e corpo) que ele envie ao servidor, e o servidor reconheça o comando embutido na mensagem e realize a ação(seja ela autenticar, enviar informação de volta ao cliente etc…) ou existe uma outra forma de fazer isso? Lembrando que inicialmente será singlethread.

socket = new Socket(ip.getHostAddress(), porta);
DataOutputStream dataOutput = new DataOutputStream (socket.getOutputStream());
dataOutput.writeUTF(); // aqui entraria o comando que enviarei ao servidor que ao reconhecê-lo enviaria uma resposta ao cliente

Devo transmitir um texto em unicode representado minha mensagem? Geralmente é feito assim ou existe outro modo mais elegante?

Com multithread sei que a coisa muda de figura, aqui já consigo fazer com que requisições e conexões de clientes sejam feitas em threads separadas.

Agradeço desde já.

É por aí mesmo. Dê uma lida:

Olá.

Muito boa explicação, ajudou bastante. Após definido meu protocolo, quero poder enviar e receber objetos pela rede. Como eu posso fazer isso? Já que a comunicação está sendo feita via string ou bytes.

Poderei encaixar um Object stream no meu código ou não será possível serializar?

Obrigado

Usa o DataOutputStream mesmo. Um protocolo binário é bem mais eficiente que um protocolo baseado em texto.