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?