Что такое ошибка TCP `ConnectException`?

#java #sockets #tcp

#java #сокеты #tcp

Вопрос:

У меня есть некоторый Java-код, который подключает к приложению Windows виртуальную машину (VirtualBox) через сетевой адаптер WLAN. Самое странное здесь то, что это работает «иногда», и когда оно начинает работать, оно работает некоторое время, а затем снова останавливается.

Код работает нормально в течение многих лет, именно эта комбинация мобильного терминала (это Android) и виртуализированного сервера раздражает меня:

 URL url = new URL(urlString);
connection = (HttpURLConnection)url.openConnection();
connection.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
connection.setDoOutput(true);

// 'tel' is the String I am sending
connection.setFixedLengthStreamingMode(tel.getBytes().length);
connection.setConnectTimeout(10000);
connection.setReadTimeout(requestTel.getTimeout());

// this call throws the exception
OutputStream o = connection.getOutputStream();
 

Исключение, которое я получаю из кода Java, заключается в следующем ConnectException :

java.net.ConnectException: Не удалось подключиться к /192.168.3.145:8080

Согласно документации, это может быть, когда ни один процесс не прослушивается (есть), но, по-видимому, это также может означать, что маршрутизация неверна или что-то еще. Я хотел бы знать основную ошибку TCP, чтобы я мог лучше устранить эту проблему.

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

Обновление при подключении моего виртуального гостя к проводному порту, похоже, он работает нормально…

Комментарии:

1. Я думаю, что на самом деле это означает, что время ожидания попытки подключения истекло. Причина истечения времени ожидания может быть любой, например, список причин, которые вы указали. Вы должны исследовать свою собственную сеть, чтобы определить, что происходит.

2. @markspace, нет, тайм-аут выдает SocketTimeoutException .

3. Похоже на проблему, с которой я сталкивался в прошлом. К сожалению, я так и не смог по-настоящему решить эту проблему конкретно. Вы создали правило переадресации портов для порта 8080 на виртуальной машине? Настройки-> Сеть-> Адаптер #-> Переадресация портов. Также по какой-то причине, когда я переставлял свои адаптеры для VirtualBox на виртуальной машине, запускал виртуальную машину, выключал ее, а затем переставлял их обратно, это работало.