Как получить подтверждение в связи TCP в Java - PullRequest
4 голосов
/ 08 июня 2010

Я написал программу для сокетов на Java. И сервер, и клиент могут отправлять / получать данные друг другу. Но я обнаружил, что если клиент отправляет данные на сервер, используя TCP, то внутри страны TCP отправляет подтверждение клиенту, как только данные получены сервером. Я хочу обнаружить или обработать это подтверждение. Как я могу читать или записывать данные в TCP, чтобы я мог обрабатывать подтверждение TCP. Спасибо.

Ответы [ 4 ]

4 голосов
/ 08 июня 2010

Это просто невозможно, даже если вы программировали на C напрямую, используя собственный API сокетов ОС. Одной из особенностей API сокетов является то, что он абстрагируется от вас.

Отправка и получение данных на уровне TCP не обязательно коррелируют с вашими вызовами Java для отправки или получения данных. Данные, которые вы отправляете в одном вызове Java, могут быть разбиты на несколько частей, которые могут быть буферизованы, отправлены и получены независимо или даже получены не по порядку.

Подробнее об этом см. здесь .

2 голосов
/ 08 июня 2010

Любые данные, отправляемые через сокет TCP, подтверждаются в обоих направлениях. Данные, передаваемые от клиента к серверу, аналогичны данным, передаваемым с сервера на клиент, в отношении проводной связи TCP и сигнализации приложений Как упоминает @Eric, нет никакого способа получить эту сигнализацию.

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

Возможно, вы захотите взглянуть на код NIO , если вы еще этого не сделали. У него есть несколько классов, которые дают вам более точный контроль над сокетными коммуникациями.

1 голос
/ 08 июня 2010

Это невозможно в чистой Java, поскольку сетевой API Java все обрабатывает сокет, который скрывает все детали TCP.

Вам необходим протокол, который может обрабатывать данные уровня IP, чтобы вы могли получать заголовки TCP.DLPI - самый популярный API для этого,

http://www.opengroup.org/onlinepubs/9638599/chap1.htm

К сожалению, Java-реализация такой сети отсутствует.Вы должны использовать нативный код через JNI для этого.

0 голосов
/ 08 июня 2010

Я хочу обнаружить или обработать это подтверждение.

Не существует API для приема или обнаружения ACK на любом уровне выше стека протоколов.

Переосмыслите ваше требование. Знание того, что данные попали на сервер, не имеет смысла для приложения. Что вы хотите знать, так это то, что одноранговое приложение получило его, и в этом случае вам необходимо получить подтверждение однорангового приложения на уровне протокола приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...