Problemas com OutputStream e FreeBSD

0 respostas
celso.martins

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]");
	}
}
Criado 6 de junho de 2007
Respostas 0
Participantes 1