2013-07-14 2 views
1
public static void main(String args[]){ 

    byte[] message = ... 
    Socket socket = ... 
    DataOutputStream dOut = new DataOutputStream(socket.getOutputStream()); 

    dOut.write(message); //#1 

    dOut.close(); 
    socket.close(); 
} 

Предположим, что строка # 1 будет помещать данные в буфер, ожидая сброса на удаленный компьютер. После этого поток и розетка закрыты.Тайм-аут переадресации Java TCP

Мы предполагаем, что в процессе отправки в сети возникает некоторая неизвестная проблема, и наша операционная система повторно отправит пакет, который находился в буфере, до тайм-аута повторной трансакции TCP.

Мне интересно, как я могу поймать это исключение в программе Java? Поскольку вышеприведенный код уже отправляет данные в буфер и, вероятно, закрывает поток и сокет (и, вероятно, выходит из основного ядра Java), оставил все остальные задания (связанные с TCP, переадресация) в операционную систему.

Мой вопрос в том, будет ли перезапуск TCP (мы предполагаем, что потерянный пакет) продолжить даже выход из программы Java? Каков наилучший способ поймать ошибку тайм-аута повторной трансакции?

+0

Нет такой вещи, как «Тайм-аут повторной передачи Java TCP», или даже «Java TCP». Существует только TCP-стек * платформы * и его поведение. – EJP

+0

Привет @EJP, я знаю, что dOut.write будет заблокирован только в том случае, если буфер отправки TCP заполнен. Предположим, что dOut.write заблокирован, потому что буфер заполнен сейчас, и в сети возникает некоторая проблема при отправке данных, поэтому TCP продолжает пересылать данные. В этом случае исключение dOut.write throw после TCP превысит максимальное время повторной передачи? Спасибо за помощь. – GMsoF

ответ

2

TCP будет продолжать пытаться полностью отключить соединение даже после выхода программы. Обычно рекомендуется, чтобы приложение выполняло выключение. В принципе, необходимо выполнить следующую последовательность действий:

  1. Shutdown the TCP connection in the send direction запускающего нормальную близкую последовательность. Если протокол запрещает другой стороне отправлять какие-либо данные, вы также можете отключить соединение в направлении приема, однако, если вы это сделаете, а другая сторона отправит какие-либо данные, это может привести к тому, что другая сторона обнаружит ненормальное завершение работы отправленные данные будут потеряны.

  2. Продолжайте читать соединение, пока не обнаружите чистое или ненормальное выключение с другого конца. Если все будет хорошо, вы обнаружите чистое завершение работы, как только вы закончите получать какие-либо данные, отправленные другой стороной.

  3. Закройте ручку или удалите объект/ссылку на соединение. Фактическое TCP-соединение уже отключено.

+0

привет, я не совсем понимаю первую строку «TCP будет продолжать пытаться полностью отключить соединение даже после выхода программы». Говорит ли это, что операционная система продолжит отправку (пока удаленная машина не получит данные или тайм-аут), даже Java-программа уже вышла? – GMsoF

+0

@GMsoF: Это зависит от реализации. Это может быть операционная система. Это может быть отдельный стек TCP, который не является частью операционной системы. Это может быть JVM. Но это самая распространенная практика. Чтобы быть в безопасности, приложение должно управлять отключением, чтобы гарантировать, что оно получит нужное поведение. –

+0

Это не может быть JVM после выхода JVM. – EJP

Смежные вопросы