Socket entre Java e Delphi  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
juarezna
Thread.start()
[Avatar]

Membro desde: 26/12/2006 19:36:35
Mensagens: 42
Offline

Olá a todos!
Estou implementando uma comunicação socket entre um site desenvolvido em java (Servidor) e uma aplicação Delphi (Cliente).
O servidor java está ok... recebe mensagens do cliente delphi sem problemas, porém, não estou conseguindo fazer com que o retorno do servidor chegue ao cliente. Segue abaixo trechos simplificados do código.

Estou utilizando Delphi 7 com o componente TClienteSocket, original do próprio delphi.

Qualquer sugestão será bem-vinda.

[]s

Juarez


public serverSocket() {
serverSocket = new ServerSocket(1000);
while (true) {
System.out.println("Socket Server inicializado.");
socket = serverSocket.accept();
System.out.println("client conectado");

in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);

System.out.println(in.readLine()); // recebe mensagem do cliente. funciona corretamente

out.write("msg de retorno ao cliente"); // nao funcionou. Não chega nada no socket do delphi 7
out.println("msg de retorno ao cliente"); // nao funcionou. Não chega nada no socket do delphi 7

System.out.println("Socket Server finalizado.");
}
}


procedure TfrmCliente.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
Var x: String;
begin

showmessage('Chegou mensagem do socket servidor');

...
...
Código para manipulação dos dados recebidos
...
...
end;
adriano.ferranti
JavaTeenager
[Avatar]

Membro desde: 27/03/2006 10:59:38
Mensagens: 181
Offline

tenta um



depois das linhas

ricardosoares
JavaEvangelist
[Avatar]

Membro desde: 03/12/2004 09:49:13
Mensagens: 318
Localização: São Paulo, SP, Brasil
Offline

considere seriamente a utilização de webservices.
xfire para servir o com java e uma simples maneira de consumir pelo delphi http://www.linhadecodigo.com.br/Artigo.aspx?id=774

Ricardo Soares
renatosilva
GUJ Master

Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline

Adiciona um componente TServerSocket na mesma porta
juarezna
Thread.start()
[Avatar]

Membro desde: 26/12/2006 19:36:35
Mensagens: 42
Offline

ricardosoares wrote:considere seriamente a utilização de webservices.
xfire para servir o com java e uma simples maneira de consumir pelo delphi http://www.linhadecodigo.com.br/Artigo.aspx?id=774


Olá Ricardo!
Ainda estou em tempo de partir para outra solução... Pensei em webservice, mas, achei que seria mais rápido e fácil fazer com socket.

Vc acha que não é confiável utilizar socket nesse caso? Não funcionaria bem?

Valeu!!

Juarez
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20570
Localização: Curitiba/PR
Offline

Para pacotes pequenos, use também o comando:


Isso desabilita o algoritmo de Nagle, do próprio TCP, que une pacotes pequenos num pacote maior. Esse algoritmo foi criado para evitar sobrecarga da rede caso aplicações que trabalhem com tinigrams (pacotes minúsculos), estejam operando. O Telnet, por exemplo, antes do algoritmo, enviava um pacote TCP por letra pressionada. E imagine uma rede inteira nos anos 70/80 com pessoas usando o telnet para comunicar com seu mainframe sem esse algoritmo...

This message was edited 1 time. Last update was at 03/03/2009 08:15:37


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
juarezna
Thread.start()
[Avatar]

Membro desde: 26/12/2006 19:36:35
Mensagens: 42
Offline

adriano.ferranti wrote:tenta um



depois das linhas



Testei o out.flush(); mas, ainda está faltando alguma coisa... Continua não chegando o retorno do servidor(Java) para o cliente(Delphi) .
Valeu!!
ricardosoares
JavaEvangelist
[Avatar]

Membro desde: 03/12/2004 09:49:13
Mensagens: 318
Localização: São Paulo, SP, Brasil
Offline

juarezna wrote:
ricardosoares wrote:considere seriamente a utilização de webservices.
xfire para servir o com java e uma simples maneira de consumir pelo delphi http://www.linhadecodigo.com.br/Artigo.aspx?id=774


Olá Ricardo!
Ainda estou em tempo de partir para outra solução... Pensei em webservice, mas, achei que seria mais rápido e fácil fazer com socket.

Vc acha que não é confiável utilizar socket nesse caso? Não funcionaria bem?

Valeu!!

Juarez


Não digo que socket não é confiável. Digo apenas que webservices já conta com frameworks dotados de uma certa segurança embutida e controle de acesso. Outro ponto a ser considerado é que algumas redes tem restrições a sockets puros, limitando o trafego em http/https apenas.

Quanto a rapidez do desenvolvimento, volto a recomendar um estudo do XFire e uma olhada no link demonstrando a facilidade de se consumir um webservice pelo Delphi 7.

Ricardo Soares
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20570
Localização: Curitiba/PR
Offline

juarezna wrote:Testei o out.flush(); mas, ainda está faltando alguma coisa... Continua não chegando o retorno do servidor(Java) para o cliente(Delphi) .
Valeu!!


E o comando que eu coloquei, testou também?

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
bergao
Smalltalk
[Avatar]

Membro desde: 01/03/2009 20:06:37
Mensagens: 1
Offline

Juarezna, tenta usar o código que estou enviando, essa classe que ainda estou montando funciona tanto como cliente como servidor dependendo do construtor usado. Como ainda não terminei (e ainda não sei como resolver o problema) essa classe só responde a primeira conexão, se por acaso o cliente cair, é necessário reiniciar a aplicação para que volte a responder. Já deixei preparado pra responder a mensagem do mesmo jeito que receber. Alías, se conseguir resolver o problema das desconexões, me avisa!!!

This message was edited 4 times. Last update was at 03/03/2009 22:32:11


Existem 10 tipos de pessoas: as que entendem números binários e as que não entendem.
juarezna
Thread.start()
[Avatar]

Membro desde: 26/12/2006 19:36:35
Mensagens: 42
Offline

ViniGodoy wrote:Para pacotes pequenos, use também o comando:


Isso desabilita o algoritmo de Nagle, do próprio TCP, que une pacotes pequenos num pacote maior. Esse algoritmo foi criado para evitar sobrecarga da rede caso aplicações que trabalhem com tinigrams (pacotes minúsculos), estejam operando. O Telnet, por exemplo, antes do algoritmo, enviava um pacote TCP por letra pressionada. E imagine uma rede inteira nos anos 70/80 com pessoas usando o telnet para comunicar com seu mainframe sem esse algoritmo...


Olá!! Testei também o comando, mas a mensagem continua não chegando ao Delphi:

procedure TfrmCliente.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
showmessage('Chegou mensagem do socket servidor');
end;

[]s
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20570
Localização: Curitiba/PR
Offline

Use o whireshark para dar uma olhada na conexão e ver se o problema é do lado do Java ou do Delphi. Está tudo certo demais para ser problema do Java.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
Eliezer Reis
Java Ninja
[Avatar]
Membro desde: 23/04/2006 11:21:50
Mensagens: 291
Localização: Brasil
Offline

Amigo,

Tenta utilizar o PrintStream do java no lugar do OutputStreamWriter para ver no quê da.


Olha, no seu cliente você precisa colocar um estrutura parecida como abaixo para ele ficar verificando "eternamente" quando chega um mensagem. Se você simplesmente der um system.out no in.readLine() pode ser que nesse momento realmente não tenha nada a exibir. Dai é bom você olhar o código bergão.

Outro detalhe, e que para seu server java suportar mais de um cliente é necessário usar Threads.



Aproveitando o topico, gostaria de tirar um dúvida. É possível ter um servidor socket em um aplicativo .war rodando em um servidor de aplicação?

Abraço

[]'s Eliezer Reis
SCJP
SCWCD
[Email] [MSN]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20570
Localização: Curitiba/PR
Offline

Você só deve usar o PrintStream se for enviar mensagens de texto.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
jeanand
Smalltalk

Membro desde: 11/03/2009 16:42:02
Mensagens: 2
Offline

Acredito estar com o mesmo problema.
Este caso já foi resolvido?
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team