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

M

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.

V

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