pessoal tenho o seguinte metodo para se comunicar com uma outra maquina atravéz de sockets, no entanto ao menos que a maquina que atua como servidor feche a conexão o andamento do programa fica parado na linha:
retorno = in.readLine();
[code]public Map conecta(String ip, int porta, String msg){
String retorno = “”;
int cd_retorno = 0;
Socket sok = null;
PrintWriter out = null;
BufferedReader in = null;
try{
sok = new Socket(ip, porta);
out = new PrintWriter(sok.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(sok.getInputStream()));
out.println(msg);
out.flush();
//processamento fica travado na linha abaixo
retorno = in.readLine();
out.close();
in.close();
sok.close();
}catch(Exception e){
cd_retorno = 1;
retorno = "Erro";
}
map = new LinkedHashMap();
map.put("cd_retorno", cd_retorno);
map.put("ds_retorno", retorno);
return map;
} [/code]
Se está travado nesta linha, significa que o cliente está aguaradando o envio de dados por parte do servidor. Você verificou se o seu servidor, depois de receber o conteúdo de msg, usa a output stream dele para devolver uma informação ao cliente?
Você tem que ter algo do tipo lá:
PrintWriter out = new PrintWriter(serverSocket.getOutputStream());
out.println("OK");
Eu não tenho acesso ao código do servidor, eu estou migrando um programa de power builder para java, no programa original a comunicação não apresenta esse problema
O funcionamento do método readLine é este.
Ele bloqueia a execução até que receba alguma “input”.
É semelhante ao método readline da classe Scanner.
Quando você o executa, ele fica bloqueado até que algo seja digitado.
É semelhante a função scanf da linguagem C também.
Se você chamou o readLine no cliente, o servidor terá que enviar alguma informação ao cliente, caso contrário ele ficará eternamente bloqueado aí.
Se você não espera que o servidor envie nada, não faça a chamada ao in.readLine(), senão seu cliente vai ficar bloqueado.
Recomendo que você procure entender bem o protocolo usado no tráfego dos dados entre os computadores, para que você possa programar de forma correta o envio e espera dos dados.
Lembrei de uma coisa que esqueci de mencionar anteriormente.
Na maioria dos exemplos que eu achei na internet para uso de sockets o comando de leitura do socket é feito dentro de uma thread e jogado no system.out.
No entanto como eu necessito processar o valor retornado pelo socket eu não estou fazendo uso de threads.
Outra informação adicional é que esse metodo faz parte de um webservice que roda via jboss.
Quaisquer informações/sugestões são bem vindas
ctosin
Obrigado pelas respostas, e respondendo a sua ultima posso afirmar que o servidor sempre me enviara um retorno, não existe caso em que ele não me envie um retorno.
Se o servidor sempre manda uma resposta, tente descobrir exatamente que tipo de resposta é esta. Da maneira como você está fazendo, usando o in.readLine(), você está assumindo que o servidor vai enviar para o cliente uma string seguida de uma quebra de linha. Mas e se o seu servidor não estiver enviando a quebra de linha, ou estiver enviando um outro tipo de dado? Nestes casos o seu método vai ficar bloqueado, até que a string com quebra de linha seja enviada.
Para testar se o servidor está enviando alguma coisa, experimente ler byte por byte da resposta do servidor. Se você conseguir fazer isto, você garante que o servidor está respondendo, mas não da forma como você está esperando.
Como você não tem acesso ao código do servidor, procure analisar o código original (anterior a sua migração) e verifique o que exatamente está sendo mandado pelo servidor.