Ouvir Porta TCP - Não é Socket

4 respostas
C

Bom dia pessoal,

Tenho uma aplicação de chat (troca de strings) rodando na porta TCP 1063. Ela é muito rústica. Gostaria de fazer uma outra ferramenta para gravar logs e manipular informações. Tenho um problema:

  • Essa aplicação original foi feita em PIKE (isso mesmo!), e não quero refazê-la;
  • Preciso ficar ouvindo na porta TCP 1063, pois é onde as Strings chegam, para que eu possa guardar os logs;
  • Se eu criar um SocketServer, ao chamar SocketServer.accept(), ele vai redirecionar a comunicação para outra porta, e não vou ficar ouvindo na 1063 como eu preciso;
  • Não consigo nem criar o SocketServer porque a JVM cria uma Exception dizendo que outro programa já está usando essa porta. Se eu mato o meu programa de chat então consigo criar o SocketServer, só que preciso fazer isso sem matar o programa de chat;
  • Tentei fazer usando DatagramSocket. Essa estrutura começou a ouvir a porta 1063 UDP, e portanto não recebia os pacotes direcionados a porta 1063 TCP;

Pois bem, pergunto:

Existe alguma maneira em Java, para ficar ouvindo a porta 1063 TCP sem que a comunicação seja direcionada para uma outra porta, assim como acontece com SocketServer?

Obrigado.

Cristiano.

4 Respostas

mchiareli

Sua aplicação de chat já é o servidor.

Você precisa criar um socket e conectar nesta porta que a aplicação está ouvindo.

http://java.sun.com/javase/6/docs/api/java/net/Socket.html

C

Obrigado mchiareli, mas deixa eu explicar melhor!

Essa aplicação de chat já existe há muito tempo. E funciona. O sistema já é funcional, não preciso criar um socket para enviar as mensagens.
Eu sei que a aplicação antiga (o chat) está ouvindo na porta 1063. Eu quero fazer uma aplicação que também ouça na porta 1063 enquanto a aplicação antiga continua ouvindo.
A aplicação antiga já está pronta e funciona. Eu quero estender as funcionalidades dela, fazendo logs e outras coisas, mas sem precisar mexer no código fonte dela. Essa aplicação foi feita em PIKE e é realmente complicado mexer naquilo.

Preciso de um programa Java que ouça na porta TCP 1063 (porta na qual a aplicação antiga também está ouvindo). Não preciso escrever nada, só ouvir aquilo que já vem pela rede. A aplicação antiga já está pronta e não quero mexer nela.

O meu problema é que com ServerSocket, o método accept() redireciona o trafego para outra porta. Só que essa aplicação antiga não é java, ela já funciona e usa somente a porta 1063. Preciso que o programa Java fique ouvindo nessa mesma porta, sem redirecionar a porta (como ServerSocket) e sem derrubar a aplicação antiga (chat). Preciso que as duas fiquem ouvindo nessa porta ao mesmo tempo.

Será que dá pra fazer em Java?

Cristiano.

ViniGodoy

Nem em Java, nem em qualquer outra linguagem.
Se um aplicativo está ouvindo numa porta socket, você não pode ouvir lá também.

O que você pode fazer é usar uma linguagem como C++ ou C, para ouvir um rawsocket. Ele irá ouvir todo e qualquer mensagem da placa, em modo promíscuo. Mas ele não decodificará o TCP para você.

Se você quer somente gerar logs, sugiro que escreva um plugin para o wireshark, pois será a forma mais fácil de fazer isso.

Existe um binding java para a biblioteca que o wireshark usa, que te permite trabalhar em modo promíscuo.
Não sei o quão estável ela é, mas você pode dar uma olhada:
http://jnetpcap.com/

C

Muito obrigado ViniGodoy.

Você é o cara!!
Estava pensando usar winpcap + C para fazer isso. É muito bom saber que tenho uma opção em Java. Valeu mesmo!!

Cristiano.

Criado 10 de outubro de 2009
Ultima resposta 12 de out. de 2009
Respostas 4
Participantes 3