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!