Boa tarde!
Estou com problemas ao tentar enviar uma String no OutputStream de um ServerSocket, quando estou no FreeBSD. Preciso mandar um ACK para um aparelho. Quando o aplicativo está no Windows XP, funciona perfeitamente, tanto a leitura quanto a escrita.
O funcionamento é mais ou menos assim:
- O aparelho envia uma mensagem de “Keep Alive”;
- Dentro da mesma conexão, de onde o “Keep Alive” foi enviado, o servidor precisa escrever o ACK;
- Ao receber o ACK, o aparelho envia para o servidor todas as posições armazenadas.
- Os comandos, assim como o ACK, devem ser enviados ao aparelho assim que o servidor recebe uma conexão do mesmo. Essa parte tbm não está funcionando.
Resumindo: Qualquer comunicação Servidor - Aparelho não funciona.
Criei um aplicativo que simula o funcionamento do aparelho. Com este teste, pude perceber que o Server está mandando o ACK. Entretanto fica travado no InputStream, impossibilitando o aparelho de descarregar as mensagens.
Volto a lembrar que, sob Windows XP, tudo funciona perfeitamente.
Agradeço antecipadamente qualquer ajuda.
Abaixo seguem os código:
import java.net.ServerSocket;
public class Executa {
public static void main(String[] args) {
try {
ServerSocket sktServer = new ServerSocket(2020);
while (true) {
System.out.println("Aguardando Mensagem...");
Thread a = new Comunicacao(sktServer.accept());
a.setName("Thread" + System.currentTimeMillis());
a.start();
System.out.println("Thread - " + a.getName());
System.gc();
}
} catch (Exception e){
e.printStackTrace();
}
}
}
import java.net.*;
import java.io.*;
import java.text.SimpleDateFormat;
public class Comunicacao extends Thread{
private BufferedReader in;
private PrintWriter out;
private SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm");
public Comunicacao(Socket skt) {
super();
try{
in = new BufferedReader(new InputStreamReader(skt.getInputStream()));
out = new PrintWriter(skt.getOutputStream(), true);
skt.setSoTimeout(20000);
}catch(Exception e){
e.printStackTrace();
}
}
public void run(){
String mensagemEntrada, mensagemSaida;
String[] partes = null;
QuebraString quebra = new QuebraString();
ProtocoloPortman protocolo = new ProtocoloPortman();
Portman port = new Portman();
Comando c = new Comando();
try{
while ((mensagemEntrada = in.readLine()) != null){
System.out.println(mensagemEntrada);
quebra.setEntrada(mensagemEntrada);
quebra.setSeparador(",");
partes = quebra.SeparaDados();
if (partes.length == 0){
break;
}
c.setIdentificacao(partes[0].substring(2));
Comando[] comando = c.BuscaComandos();
for (int i = 0; i < comando.length; i++){
out.println(comando[i].getComando());
System.out.println("Comando: " + comando[i].getComando());
comando[i].setLido(true);
comando[i].Atualiza();
comando[i] = null;
}
System.out.println(comando.length + " comando(s) enviados!");
protocolo.setEntrada(partes);
if (protocolo.ProcessaEntrada() == null){
break;
}else if (protocolo.ProcessaEntrada().equalsIgnoreCase("msg de keep alive")){
mensagemSaida = "&&" + partes[1];
out.println(mensagemSaida);
System.out.println(mensagemSaida);
java.util.Date dataUltimaLeitura = new java.util.Date(System.currentTimeMillis());
System.out.println("*****************************");
System.out.println("** Coletor Portman v1.0");
System.out.println("** Mensagem para Manter a Conexao GPRS");
System.out.println("** Mensagem: " + mensagemEntrada);
System.out.println("** Data chegada: " + sdf.format(dataUltimaLeitura));
System.out.println("*****************************");
}else if (protocolo.ProcessaEntrada().equalsIgnoreCase("msg de posicao")){
port.SeparaDados(partes);
java.util.Date dataUltimaLeitura = new java.util.Date(System.currentTimeMillis());
System.out.println("*****************************");
System.out.println("** Coletor Portman v1.0");
System.out.println("** Mensagem de Posicao");
System.out.println("** Mensagem: " + mensagemEntrada);
System.out.println("** Data chegada: " + sdf.format(dataUltimaLeitura));
System.out.println("*****************************");
}
}
}catch(SocketTimeoutException ex){
java.util.Date data = new java.util.Date(System.currentTimeMillis());
System.out.println("[Timeout - fechando conexao em " + sdf.format(data) + "]");
}catch(Exception e){
e.printStackTrace();
}
try{
in.close();
out.close();
}catch (Exception e) {
e.printStackTrace();
}
quebra = null;
protocolo = null;
port = null;
System.out.println("[Loop encerrado]");
}
void close() {
System.out.println("[Thread fechada]");
}
}