Анализ сокетов Java TCP

Я использую сокеты TCP для передачи данных между сервером и клиентской программой с использованием определенного номера порта на том же компьютере (localhost).

Мне нужно программное обеспечение, которое может захватывать данные, отправляемые / получаемые через этот сокет?

(или)

Какой самый простой способ прослушивания пакетов с указанного порта в Java?

Ответов (7)

Вы можете использовать это, tcpdump что дает вам множество вариантов. Вы сохраняете захват в .pcap файл с параметром -w, а когда вы закончите, вы открываете этот файл с помощью wireshark . Преимущество этого способа состоит в том, что вы можете захватывать высокую скорость пакетов в секунду, не влияя на общую производительность вашего компьютера (даже если она низкая).

Предлагаю использовать Wireshark. Он прост в использовании и работает на многих платформах.

http://www.wireshark.org/

Tcpdump также можно использовать напрямую, если объем трафика невелик, что устраняет необходимость в использовании wireshark . Просто что-то вроде

tcpdump -ni lo0 port 1234

должно быть всем, что вам нужно (lo0 - это интерфейс обратной связи во всех системах Unix / Linux; также, конечно, измените номер порта).

Запустите вашу программу так:

java -Djavax.net.debug=all helloworld.java

Переключатель полностью задокументирован на странице Oracle JSSE.

Плюсы:

  • Намного проще, чем другие предлагаемые решения (не требует внешнего программного обеспечения)
  • Также может расшифровывать / сбрасывать TLS / SSL соединения :)

Минусы:

  • Это будет работать только в том случае, если вы используете классы, java.net.*например, OutputStreamилиInputStream Это не будет работать, если вы используете сырые сокеты. Это задокументировано в ссылке.
  • Поверьте, это может работать только на Oracle JDK.

Самый простой способ - заменить InputStream / OutputStream из сокета в одной из программ на реализацию прокси, которая либо печатает / журналы, либо «тройники» в исходный и поток печати / журнала.

Но есть много снифферов, если вы действительно хотите запутаться.

Если вы не против испачкаться и испачкать командную строку, вы можете попробовать netcat . Это позволит вам прослушивать порт и выгружать вывод в файл, если хотите.
Вы также можете заставить его отправлять поддельные данные и записывать ответ.

Я часто использую его как воображаемый HTTP-прокси (и настраиваю Firefox для его использования), чтобы обнаруживать, что отправляется по сети.

Если вы занимаетесь программированием (а не просто запускаете wirehark / tcpdump), у вас есть несколько вариантов. Если вы хотите придерживаться Java, то единственный (?) Вариант использования сырых сокетов - через JNI, и есть несколько библиотек, которые могут помочь, например:

  • jNetPcap - оболочка для собственных библиотек libpcap / winpcap, раскрывающая все их функции и структуры
  • RockSaw - API для использования сырых сокетов