Client socket não funciona no linux! [resolvido]

14 respostas
L

Olá Pessoal,

Estou com um bucha daquelas, tenho um cliente socket, que roda normal no Windows, mas na hora de rodar no linux o cliente não
echoSocket = new Socket(ip, port);
		out = new PrintWriter(echoSocket.getOutputStream(), true);
		in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
                out.println(message);
		in.readLine();
Ele para no "in.readLine();" e não retorna nada, as portas no servidor estão abertas, o cliente o servidor estão na mesma máquina, uma máquina com redhat 4, quanto o servidor está na maquina com redhat e o cliente em um máquina windows tudo funciona bem, alguém tem alguma idéia?
 Estou disposto a pagar para quem me ajudar a resolver essa ducha.

14 Respostas

L

wellington.nogueira:
Qdo vc diz: “Ele para…” quer dizer que não continua processando (como se esperasse algo) ou ocorre alguma exceção?
Se for exceção, copie-a aqui.

O client-socket usa uma porta diferente que a do server-socket? a porta que o client-socket está usando, está aberta?

Ele para, fica esperando e nada! Acredito que não seja a porta, já fiz o cliente levantar na mesma porta, levantar em porta diferente (em portas abertas é claro) e nada o erro e sempre o mesmo.
Vi agora, ele conecta, mas a mensagem enviada pelo cliente não chega no servidor.

P

O readln() bloqueia até que receba um caractere de final de linha. Tem certeza que este caractere está sendo enviado?

P

Terceiro resultado de uma pesquisa rápida no google: http://forums.sun.com/thread.jspa?threadID=5406007

G

Uma maneira rápida de testar se o caracter de fim de linha está chegando:

Substitua a chamada ao readLine() pelo bloco abaixo:

int readChar; while ((readChar = in.read()) != -1) { if (readChar == 10 || readChar == 13) { System.out.println("Termino de linha! " + readChar); } else { System.out.println((char) readChar); } }

V

Uma dica.
Crie um protocolo decente: http://www.guj.com.br/posts/list/136538.java#735860

O Windows e o Linux tem conceitos diferentes do que seja um “final de linha”. Você começa a ter problemas de interoperabilidade se usar os streams como se estivesse lidando com texto.

As classes de Streams funcionam muito bem com texto, mas não são muito adequadas para serem usadas com sockets. É bom fazer as coisas entendendo certinho como o TCP/IP funciona.

L
ViniGodoy:
Uma dica. Crie um protocolo decente: http://www.guj.com.br/posts/list/136538.java#735860

O Windows e o Linux tem conceitos diferentes do que seja um "final de linha". Você começa a ter problemas de interoperabilidade se usar os streams como se estivesse lidando com texto.

As classes de Streams funcionam muito bem com texto, mas não são muito adequadas para serem usadas com sockets. É bom fazer as coisas entendendo certinho como o TCP/IP funciona.

Olá Vinni,

Legal o tuto que vc escreveu, mas tem o seguinte, o sevidor não fui eu que escrevi, tenho apenas o manual de protocolo que diz que as mensagens devem terminar com o caractere hexadecimal "0d", o que vc acha, como implemento isso? Olhando seu tuto pensei em algo como abaixo, mas não deu certo.
public ByteArrayOutputStream codificarListarDiretorio(String message) throws IOException   {
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
         DataOutputStream dos = new DataOutputStream(bos);
         dos.writeChars(message);
         return bos;
      }

      public void enviarMensagem(String message) throws IOException  
       {  
    	  ByteArrayOutputStream bos = this.codificarListarDiretorio(message + "\n");
          byte[] msg = bos.toByteArray();  
          DataOutputStream out = new DataOutputStream(this.echoSocket.getOutputStream());  
          out.writeInt(msg.length); //Agora sim, o tamanho da mensagem  
          out.write(msg); //Os dados  
          out.flush();  
       }
L

Na falta de algo melhor, resolvi na ignorância!!!

char newline = (char) Integer.parseInt("0d",16); out.print(message + newline);

P

algo melhor:

char newline = '\n';
   out.print(message + newline);
L

PauloBrito:
algo melhor:

char newline = '\n'; out.print(message + newline);

O problema de colocar assim é que no linux o newline character não é o hexadecimal 0d, então, não iria funcionar no protocolo maldito que eu tenho de usar.

P

Até onde eu sei, a diferença entre windows e linux com relação ao final de linha é que o windows embute um \r antes do \n. Ou seja, no windows a linha acaba com \r\n e no linux somente com \n.

L
PauloBrito:
Até onde eu sei, a diferença entre windows e linux com relação ao final de linha é que o windows embute um \r antes do \n. Ou seja, no windows a linha acaba com \r\n e no linux somente com \n.

Sim, mas o protocolo do servidor que eu tenho de conectar diz que a menssagem tem de terminar com 0d, que eu acho que corresponde ao caractere hexadecimal "\n", note que servidor está rodando no linux, quando o cliente está no windows o servidor me resposnde pq o caracter final do println vai ser o "\n" (hexadecimal 0d), quando o cliente roda no linux o println não põe o caractere "\n", mas sim o "\r\n", que sei lá que hexadecimal que é, aí o servidor não responde. Note, nem o servidor, nem o protocolo fui eu quem escreveu (é tudo da 3M), só caíu na minha mão de fazer com que meu programa se comunicasse com eles!

Se eu fizer
char newline = '\n';

A java virtual machine põe no windows o "\n", mas no linux ela põe "\r\n", aí da pau!

por isso tenho de usar o
# char newline = (char) Integer.parseInt("0d",16);

pelo menos foi essa a conclusão que cheguei, e no final das contas, agora está funcionado!

P

Na verdade é o oposto disso! O padrão de final de linha do windows é \r\n (note que são dois caracteres, 0xA e 0xD). Já no linux é \n (0xD) somente.

Enfim…

P

Ah…

Coloque RESOLVIDO no título do primeiro post e aproveita pra tirar aquele “Pago pela ajuda”. Pega mal.

W

Qdo vc diz: “Ele para…” quer dizer que não continua processando (como se esperasse algo) ou ocorre alguma exceção?
Se for exceção, copie-a aqui.

O client-socket usa uma porta diferente que a do server-socket? a porta que o client-socket está usando, está aberta?

Criado 1 de setembro de 2010
Ultima resposta 1 de set. de 2010
Respostas 14
Participantes 5