Receber mensagem a partir de um Socket [Resolvido]

Boa tarde…

Seguinte pessoal, estou aqui quebrando a cabeça para utilizar o Socket no Java.
O problema é maior ainda pois preciso de resposta de um cliente em Delphi… e Eu não consigo ler a resposta da aplicação cliente.
Já procurei por vários fóruns e nada encontrei… se alguém puder me ajudar fico muito grato.

Segue parte do código.

    public TesteServerSocket() throws IOException {
        try {
            serverSocket = new ServerSocket(666);
            System.out.println("Socket Server inicializado.");
            
            //Aguarda conexão
            socket = serverSocket.accept();
            System.out.println("client conectado: " + socket.getInetAddress().getHostAddress());
            
            
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintWriter(socket.getOutputStream(), true);
            
            //Envia para o Cliente.
            out.println("conexão estabelecida");
            out.flush();
            
            String text;
            while ((text = in.readLine()) != null) { //Trava... não sei pq
                System.out.println("Mensagem:" + text);
            }

        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    }

Segue também a parte do Cliente que envia a mensagem em Delphi.



procedure TFormPrincipal.Button2Click(Sender: TObject);
begin
  Cliente_Socket.Socket.SendText(Edit2.Text);
  Edit2.Text := '';
end;

Obrigado

É bem provável que o seu cliente Delphi não está enviando o finalizador de linha no texto.

Eu sugiro também que você use raw bytes para fazer a comunicação, pois a diferença de encoding entre as plataformas do cliente e do servidor pode causar “ruídos” na comunicação.

Use esse programa para ver o que o Delphi está transmitindo:
http://www.wireshark.org/

No caso do Java, use o DataInputStream para ler dados, e o DataOutputStream para transmitir.

A aplicação em Delphi se comunica direitinho com outra em Delphi…
Já fiz o teste e funciona corretamente.

O problema está no meu código no Java… mas não consigo descobrir o problema!

Ele não lê o que a Aplicação em Delphi manda…
É Muito estranho porque em muitos outros fóruns aparece que eles não conseguem ler no Delphi o que o Java manda… e pra mim está sendo diferente.

[quote=gilvanandre]A aplicação em Delphi se comunica direitinho com outra em Delphi…
Já fiz o teste e funciona corretamente.

O problema está no meu código no Java… mas não consigo descobrir o problema!

Ele não lê o que a Aplicação em Delphi manda…
É Muito estranho porque em muitos outros fóruns aparece que eles não conseguem ler no Delphi o que o Java manda… e pra mim está sendo diferente.[/quote]

O travamento acontece porque o método readLine() lê caracteres do socket até que um finalizador de linha seja recebido. Enquanto ele não recebe esse finalizador de linha ele mantém a thread atual travada. Isso pode ser um grande problema, pois se um sistema usa ‘\n’ e o outro usa ‘\r’ o seu servidor vai ficar travado, esperando um caractere que nunca vai chegar.

[quote=rmendes08][quote=gilvanandre]A aplicação em Delphi se comunica direitinho com outra em Delphi…
Já fiz o teste e funciona corretamente.

O problema está no meu código no Java… mas não consigo descobrir o problema!

Ele não lê o que a Aplicação em Delphi manda…
É Muito estranho porque em muitos outros fóruns aparece que eles não conseguem ler no Delphi o que o Java manda… e pra mim está sendo diferente.[/quote]

O travamento acontece porque o método readLine() lê caracteres do socket até que um finalizador de linha seja recebido. Enquanto ele não recebe esse finalizador de linha ele mantém a thread atual travada. Isso pode ser um grande problema, pois se um sistema usa ‘\n’ e o outro usa ‘\r’ o seu servidor vai ficar travado, esperando um caractere que nunca vai chegar.[/quote]

Sim… compreendo! Tenho na verdade um grande problema então!

Se você quer comunicar entre duas linguagens diferentes é importante saber, byte-a-byte o que está sendo lido e o que está sendo enviado.
Sem entender perfeitamente o protocolo de comunicação, problemas certamente vão ocorrer. Eis alguns casos comuns:
a) Terminadores de linha diferentes;
b) Ordem dos bytes diferente (algumas plataformas enviam inteiros do byte mais significativo até o menos, outras fazem ao contrário);
c) Codificação de textos diferente (UTF-8, Windows, número de caracteres por byte da String, etc).

Por isso é bom pegar o Wireshark e ver exatamente o que vem pela rede. Se, como o rmendes08 falou, não vier o \n, aí vc terá que inseri-lo manualmente no Delphi, assim:

Cliente_Socket.Socket.SendText(Edit2.Text + Chr(10)); 

[quote=ViniGodoy]Se você quer comunicar entre duas linguagens diferentes é importante saber, byte-a-byte o que está sendo lido e o que está sendo enviado.
Sem entender perfeitamente o protocolo de comunicação, problemas certamente vão ocorrer. Eis alguns casos comuns:
a) Terminadores de linha diferentes;
b) Ordem dos bytes diferente (algumas plataformas enviam inteiros do byte mais significativo até o menos, outras fazem ao contrário);
c) Codificação de textos diferente (UTF-8, Windows, número de caracteres por byte da String, etc).

Por isso é bom pegar o Wireshark e ver exatamente o que vem pela rede. Se, como o rmendes08 falou, não vier o \n, aí vc terá que inseri-lo manualmente no Delphi, assim:

Cliente_Socket.Socket.SendText(Edit2.Text + Chr(10)); 

Realmente funcionou com o Chr(10), realmente é este o problema… já baixei também seus exemplos e o Wireshark.
Agora minha meta é fazer esse software rodar com uma Thread.

Não é necessário criptografar… não preciso de algo muito complexo… por isso estou fazendo dessa forma…
Minha dúvida é se irie ter problemas com a conexão do mesmo utilizando um servidor em linux e mandando os dados para esse servidor a partir da aplicação Delphi?