Receber mensagem a partir de um Socket [Resolvido]

7 respostas
G

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

7 Respostas

R

É 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.

V

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.

G

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.

R

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.

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.

G

rmendes08:
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.

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.

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

V
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 <a href="http://www.guj.com.br/java/136538-duvida-simples#735860" data-bbcode="true">protocolo</a> 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));
G
[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 <a href="http://www.guj.com.br/java/136538-duvida-simples#735860" data-bbcode="true">protocolo</a> 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?

Criado 14 de junho de 2012
Ultima resposta 14 de jun. de 2012
Respostas 7
Participantes 3