Ler dados do Socket

Boa tarde, estou trabalhando em um projeto em casa, onde tenho que fazer minha aplicação java comunicar-se com outra aplicação java ( de terceiro) através de sockets.
As aplicações conversam apenas utilizando strings, então desenvolvi este método:

private static String docall(String[] args) {

        //Declaro o socket cliente
        Socket s = null;

        /*
         * a aplicação que recebe o socket, necessita disto ao fim da mensagem,
         * para reconhecer o fim do socket
         */
        String fim = "\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t";

        /*
         * recebo por argumento, o ip/porta do servidor e a mensagem que vou
         * enviar para a aplicação
         */
        String ipServidor = args[0];
        int portaServidor = Integer.parseInt(args[1]);
        String comando = args[2] + fim;

        /*
         * irá retornar para a minha aplicação a resposta
         */
        String retorno = "";

        //Declaro a Stream de saida de dados
        PrintStream ps = null;

        try {

            //Cria o socket com o recurso desejado na porta especificada
            s = new Socket(ipServidor, portaServidor);

            //Cria a Stream de saida de dados
            ps = new PrintStream(s.getOutputStream());

            //Imprime uma linha para a stream de saída de dados
            ps.println(comando);

            BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream(), "UTF-8"));
            String text;

            /*
             * leitura dos dados recebidos pelo socket
             */
            while ((text = in.readLine()) != null && (!text.trim().equals(""))) {
                retorno = retorno + text + "|";
            }

            //Trata possíveis exceções
        } catch (Exception e) {

            System.out.println("Algum problema ocorreu ao criar ou enviar dados pelo socket.");
            e.printStackTrace();

        } finally {

            try {

                //Encerra o socket cliente
                s.close();

            } catch (Exception e) {
                e.printStackTrace();
            }

        }
        return retorno;

    }

Até aqui minha aplicação tem funcionado de forma satisfatória, porém atualmente estou enfrantando um problema que não sei como resolver.
Na parte onde leio os dados do Socket e concateno com a minha string:

            /*
             * leitura dos dados recebidos pelo socket
             */
            while ((text = in.readLine()) != null && (!text.trim().equals(""))) {
                retorno = retorno + text + "|";
            }

O padrão de recebimento do socket até o momento foi:

variavel="valor" variavel="valor" variavel="valor" variavel="valor" \r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t

coloquei o !text.trim().equals("") para reconhecer o fim do socket e é isto que gera o meu problema.
Em alguns casos a aplicação terceira, me devolve uma string:

variavel="valor" variavel="valor" variavel="valor" variavel="valor" \r
variavel="valor" \r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t

Então só consigo ler a primeira linha do socket.
Tentei alterar o while para ler até que seja nulo:

            /*
             * leitura dos dados recebidos pelo socket
             */
            while ((text = in.readLine()) != null ) {
                retorno = retorno + text + "|";
            }

porém a aplicação fica em loop infinito sem ler nenhum dados.
Tentei utilizar também a classe Scanner, sem sucesso também (mesmo caso do loop sem dados).

            Scanner scanner = new Scanner(in);
            while (scanner.hasNext()) {
                retorno = retorno + scanner.next() + "|";
            }

Então já não sei mais como ler os dados do socket de forma efetiva.
Não existe nenhum forma de eu identificar o tamanho do socket e usar o read para ler todos os bytes do socket?
É um estrategia que pensei, mas não sei como implementar.

Agradeço a ajuda pessoal!

Você pode usar o read para ler os dados, não precisa identificar o tamanho do socket.
Fiz um exemplo.

Você poderia criar um método lerLinha():

private static String lerLinha(BufferedReader in) throws IOException { String linha = ""; int ch; while(true){ ch = in.read(); if(ch == -1){ // final da transmissao return null; }else if((char) ch == '\n') { // final da transmissao //aqui você pode pensar numa lógica para ler o trecho final return null; }else if((char) ch == '\r'){ // final da linha return linha; }else{ // ler um caracter linha = linha + (char) ch; } } }

E no lugar onde você lê do socket:

[code] String text;

     /* 
     * leitura dos dados recebidos pelo socket 
     */  
     while ((text = lerLinha(in)) != null && (!text.trim().equals(""))) {  #
         retorno = retorno + text + "|";  
     } [/code]

Boa tarde al.barbosa, obrigado pela ajuda, testei seu exemplo porém continuei sem sucesso.
Em uma tentativa após seu exemplo, consegui o que precisava da seguinte forma:

            while ((text = in.readLine()) != null && (!text.contains("\t"))) {
                retorno = retorno + text + "|";
            }

Enquanto não encontrar a tabulação, lê os dados. Aparentemente o problema está resolvido.