Socket Windows x Linux

Tenho um servidor de aplicação em Windows feito em Delphi, desenvolvi um cliente em Java no Windows e tudo ok, porém quando rodo o cliente em linux este recebe todas as informações do servidor, porém não consegue enviar nada. Já registrei o protocolo no etc/services do linux com várias portas diferentes sem sucesso, alguém tem uma dica ?

Bem vindo!

Que tal falar um pouco mais sobre o problema? O que você quer dizer com “não envia nada”? Recebe alguma exceção? Que exceção? Trava o programa?

Não há nenhuma exceção, inclusive o aplicativo cliente em java continua recebendo dados no socket a partir de uma Thread que fica verificando a porta, o que acontece é que estou depurando no meu servidor tudo o que ele recebe e simplesmente não chega nada do endereço do cliente Java. È algo tão simples como clout.println(“qualquer coisa para o servidor”), onde clout é do tipo PrintWriter. A única coisa que recebo no servidor vindo do cliente é quando eu abro a porta do socket com o endereço e a porta do servidor, no mais nenhuma saída é feita. Para complicar mais o mesmo aplicativo cliente em Java roda perfeitamente no $Windows.

Olá

Perguntinha idiota: Quando fala em Windows está falando em outra máquina, certo?

[]s
Luca

Sim está rodando em outra máquina, para facilitar vou descrever um dos ambientes de teste que estou usando :

a) Máquina servidora de Aplicação (Alias servidor) : Desktop com Windows 2000, executando um servidor de aplicação feito em Delphi com o IP 90.0.0.1
b) Máquina Cliente (Alias Cliente) : Notebook com duplo boot windows/Linux IP 90.0.0.8 (configurações de rede idênticas em Windows e Linux).

Agora Executando o software cliente feito em java com um comando do tipo “java Cliente 90.0.0.1:1028” na máquina cliente, passando o IP e a porta do servidor, este software executa perfeitamente na máquina cliente se estiver sendo executado sobre Windows. Sobre o Linux, este software recebe todas as informações vindas do servidor, tais como uma mensagem de boas-vindas ao servidor tal, e outras que ficam sendo enviadas quando ocorrem alguns eventos no servidor. Porém eu não consigo enviar o comando inicial do sistema cliente que é solicitar o login no servidor.

Ótima descrição do ambiente :smiley:

Agora só faltou explicar o que quer dizer “não consigo enviar”. Novamente, está recebendo alguma exceção? Ou apenas não funciona?

Simplesmente não chega nenhuma informação ao servidor, pois estou utilizando o modo DEBUG dele e nada chega até este, e nenhuma exceção do lado do cliente é levantada, portanto é como se o pacote de rede não estivesse indo para o servidor, mas nenhum erro é informado.

Olá

A aplicação Java que roda no Linux roda como root? Ela tem poderes para usar a porta 1028?

[]s
Luca

Sim roda como root e sim têm acesso à porta, inclusive como já comentei, criei em /etc/services uma entrada num protocolo, algo como :
NetSgap 1028/tcp # protocolo logico de comunição do Sgap, além disso, logando com o telnet na porta referida, consigo receber e enviar dados, o que significa que não há problema na rede, pois consigo efetuar todos os comandos necessários para iniciar uma instância do cliente no servidor. Além desses testes também troquei a porta para diversos outros valores para ver se poderia estar havendo algum tipo de conflito com outro software que estivesse usando a porta, porém em todas as tentativas mesmo problema.

Luca, as portas protegidas são abaixo de 1024.

Porque você não cria um programa em Java no servidor e um cliente na linux, tenta fazer eles se comunicarem? Assim você vai saber se seu problema é de infra :wink:

[]s

Já fiz algo parecido que foi fazer um Chat (Client/Server) com as classes de comunicação de criei para o cliente, e funcionou, porém este servidor que possuo em Delphi possui algo em torno de 300.000 linhas de código, portanto não pretendo migrá-lo para Java tão rápido quanto o fiz para o cliente (3 dias), e então meu problema continua sendo : Possuo um servidor de aplicação feito em Delphi, rodando exclusivamente em Windows, que quando utilizo um software cliente feito em Java para conectar-me a ele, estando na mesma máquina ou não, se a JVM estiver sendo executada em Windows roda perfeitamente, se estiver sendo executada em Linux, o servidor não recebe nenhuma mensagem vinda do cliente, porém o cliente recebe as mensagens vindas do servidor.

A sugestão era pra testar a conexão, não para mgirar :wink:

Dez linhas e você tira a dúvida

[]s

Olá

PC, vc não vai acreditar mas qdo respondi meio às pressas nem reparei que 1028 é maior do que 1024, pensei logo na questão de falta de permissão. :oops:

Excelente sugestão!

Depurando com tcpdump? ethereal?

Está dando flush no stream do socket?

[]s
Luca

Faz assim

Isso vai te dar o thread dump do teu cliente.

Dai voce já vai conseguir saber mais que “não funciona”.

Dai, com sorte, alguem aqui tem alguma boa dica de como resolver.
Sem maiores informações só in loco mesmo…

Dada a descricao do problema a minha primeira suspeita eh que seja problema de caractere de fim de linha. No linux eh apenas \n, ao passo que no win eh \r\n.

Se o servidor le linha a linha as informacoes recebidas do client, e estah esperando um \r\n para delimitar uma linha, ele nao obtera e esses dois caracteres do cliente rodando em Linux, apenas o \n.

Pra testar se realmente eh isso, basta trocar as chamadas a println(string) por print(string + “\r\n”).

:stuck_out_tongue: Valeu a dica!, não foi como você disse mas resolveu. Por algum motivo no linux eh como se o “\r\n” não fosse enviado a cada print, só funcionou quando eu coloquei print("\r\n" + mensagem + “\r\n”);
Está gerando um pouco mais de fluxo na rede, porém já dá para continuar o desenvolvimento até conseguir depurar porque o socket no linux não envia os dados. Obrigado pela ajuda a todos que participaram desta Thread.

:stuck_out_tongue: Valeu a dica!, não foi como você disse mas resolveu. Por algum motivo no linux eh como se o “\r\n” não fosse enviado a cada print, só funcionou quando eu coloquei print("\r\n" + mensagem + “\r\n”);
Está gerando um pouco mais de fluxo na rede, porém já dá para continuar o desenvolvimento até conseguir depurar porque o socket no linux não envia os dados. Obrigado pela ajuda a todos que participaram desta Thread.