- Как обрабатывать Java SocketException
- 1. введение
- 2. Причины исключения SocketException
- 2.1. Медленная сеть
- 2.2. Вмешательство брандмауэра
- 2.3. Длительное Простое Соединение
- 2.4. Ошибка приложения
- 3. Обработка исключения SocketException
- 4. Заключение
- Почему клиент на Java не может подключиться к серверу (на сокетах)?
- Войдите, чтобы написать ответ
- Как вернутся из одной активности в предыдущую не пересоздавая ее?
- Как исправить ошибку java net connectexception connection timed out no further information
- Connection timed out: no further information – особенности дисфункции
- Как исправить «Java.net.ConnectException: Connection timed out»
- Заключение
Как обрабатывать Java SocketException
Узнайте, что вызывает SocketException в Java и как с ним справиться.
1. введение
В этом кратком руководстве мы рассмотрим причины возникновения SocketException на примере.
Мы также, конечно, обсудим, как справиться с этим исключением.
2. Причины исключения SocketException
Наиболее распространенной причиной SocketException является запись или чтение данных в закрытое сокет соединение или из него. Еще одна причина этого-закрытие соединения перед чтением всех данных в буфере сокета.
Давайте подробнее рассмотрим некоторые общие причины.
2.1. Медленная сеть
Основной проблемой может быть плохое сетевое соединение. Установка более высокого таймаута соединения сокета может уменьшить скорость SocketException для медленных соединений:
socket.setSoTimeout(30000); // timeout set to 30,000 ms
2.2. Вмешательство брандмауэра
Сетевой брандмауэр может закрывать соединения сокетов. Если у нас есть доступ к брандмауэру, мы можем отключить его и посмотреть, решит ли он проблему.
В противном случае мы можем использовать инструмент мониторинга сети, такой как Wireshark для проверки активности брандмауэра.
2.3. Длительное Простое Соединение
Простаивающие соединения могут быть забыты на другом конце (для экономии ресурсов). Если мы должны использовать соединение в течение длительного времени, мы можем отправлять сообщения heartbeat , чтобы предотвратить состояние ожидания.
2.4. Ошибка приложения
И последнее, но не менее важное: SocketException может возникнуть из-за ошибок или ошибок в нашем коде.
Чтобы продемонстрировать это, давайте запустим сервер на порту 6699:
SocketServer server = new SocketServer(); server.start(6699);
Когда сервер будет запущен, мы будем ждать сообщения от клиента:
serverSocket = new ServerSocket(port); clientSocket = serverSocket.accept(); out = new PrintWriter(clientSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String msg = in.readLine();
Как только мы его получим, мы ответим и закроем соединение:
out.println("hi"); in.close(); out.close(); clientSocket.close(); serverSocket.close();
Итак, допустим, клиент подключается к нашему серверу и посылает “привет”:
SocketClient client = new SocketClient(); client.startConnection("127.0.0.1", 6699); client.sendMessage("hi");
Но, если клиент отправляет другое сообщение:
client.sendMessage("hi again");
Поскольку клиент отправляет “привет снова” на сервер после прерывания соединения, возникает SocketException .
3. Обработка исключения SocketException
Обработка SocketException довольно проста и понятна. Подобно любому другому проверенному исключению, мы должны либо выбросить его, либо окружить блоком try-catch.
Давайте рассмотрим исключение в нашем примере:
try < client.sendMessage("hi"); client.sendMessage("hi again"); >catch (SocketException e)
Здесь мы закрыли клиентское соединение после того, как произошло исключение. Повторная попытка не сработает, потому что соединение уже закрыто. Вместо этого мы должны начать новую связь:
client.startConnection("127.0.0.1", 6699); client.sendMessage("hi again");
4. Заключение
В этой статье мы рассмотрели, что вызывает SocketException и как с этим справиться.
Почему клиент на Java не может подключиться к серверу (на сокетах)?
Я написал сервер и клиент на Java (ServerSocket и Socket). При подключении клиента по локалхосту или локальному ip компьютера в сети (192.168.1.8) — все отлично. При попытке подключиться по внешнему ip (белый, статический) или по локальному ip роутера (192.168.1.1) возникает
java.net.ConnectException: Connection refused: connect
Разумеется, я пробросил порты, настроил файерволл и все такое (2ip.ru показывает, что порт открыт), но вот подключаться оно всё равно не хочет.
При данной постановке вопроса сложно дать прямой ответ, т.к. нет ни кода ни какого-либо анализа и дампов.
Но можно явно отметить, что работа через сокеты подразумевает, что всю ответственность за правильную работу с сетью программист берёт на себя. Если же есть полная уверенность в корректности кода, тогда стоит обратиться к навыкам отладки или администрирования для сбора дополнительной диагностической информации.
Например, могу предположить, что не корректно ожидается проброс порта через NAT на WAN-интерфейсе, при фактической передаче пакета на LAN-интерфейс роутера. Попробуйте запустить любой сниферр, вероятно в нём увидите, пакет к роутеру на создание соединение, но ответа не будет, т.к. роутеру не ясно куда перенаправлять этот пакет. При этом обращение из внешней сети по белому IP, при настроенном пробросе, покажет, что обмен работает.
Спасибо, я хотя бы понял куда копать)
Единственная проблема — я абсолютно не разбираюсь в этих сетевых хитростях))
Попробовал проверить через Wireshark и при попытке подключить клиент получаю это:
Решил зайти по внешнему ip и этому порту через браузер Тор, и на удивление, получил какой-то ответ (сервер тоже зафиксировал подключение). Однако через Java клиент всё равно подключение не проходит (см. скрин выше, при использовании внешнего ip вместо 192.168.1.1 ситуация такая же).
Значит ли это, что проблема всё-таки в коде, а не в настройке сети?
Tester17, судя по скрину роутер отвечает, что порт закрыт (флаги RST,ACK в ответ на инициацию TCP-сеанса).
Т.е. нужно разобраться с корректной настройкой маршрутизации на роутере.
Как вариант можно инициировать подключение к своему внешнему белому адресу через внешний VPN (при этом понадобиться настроить маршрутизацию на своём компьютере).
В общем рекомендация, в любом случае, пополнить свои знания в области маршрутизации пакетов в сетях IPv4.
Тут — какая-то обще-системная ошибка, и сообщение java.net.ConnectException: Connection refused: connect
совершенно не несет никакой информации где искать проблему. Давайте переведем задачу из плоскости Java в плоскость сетей и протоколов. Вобщем для начала надо подёргать порт снаружи используя утилиты telnet или netcat и далее уже смотреть по ошибкам.
nc -w 3 -zv tester17.com 33333
когда получишь сообщение : «Connection . succeded!» — то можно возвращаться в Java кодинг.
Войдите, чтобы написать ответ
Как вернутся из одной активности в предыдущую не пересоздавая ее?
Как исправить ошибку java net connectexception connection timed out no further information
В статье описана суть сообщения «Java.net.ConnectException: Connection timed out: no further information», приведено решение дисфункции.
При попытке подключения к серверу «Майнкрафт» пользователь может столкнуться с сообщением «Java.net.ConnectException: Connection timed out: no further information». Появление данного сообщения обычно сигнализирует о возникновении различного рода сетевых проблем при получении доступа к игровому серверу, из-за чего желание пользователя насладиться игровыми мирами «Майнкрафт» остаётся нереализованным. Ниже я разберу суть данной дисфункции, опишу её причины, а также поясню, как исправить ошибку Java.net.ConnEctexception на вашем ПК.
Connection timed out: no further information – особенности дисфункции
В переводе текст данного сообщения выглядит примерно как «Сетевой сбой Java. Время соединения истекло: дальнейшая информация отсутствует».
Указанная ошибка Java.net.ConnectException обычно возникает во время подключения к серверу игры «Майнкрафт», но также фиксировались спорадические случаи появления данной ошибки при работе других продуктов, использующих «Java» (к примеру, на «Azure notification hub»).
Появление проблемы «Java.net.ConnectException: Connection timed out: no further information» имеет следующие причины:
- Пользователь использует нестабильное сетевое соединение с медленным интернетом;
- На ПК пользователя установлена устаревшая версия «Java»;
- Пользователь пользуется устаревшей версией «Майнкрафт»;
- Наблюдаются сбои в работе игрового сервера, к которому пробует подключиться пользователь (ресурс не доступен, проходят технические работы и др.);
- Антивирус или брандмауэр блокирует подключения к игровому серверу;
- Пользователь использует динамический IP;
- Пользовательский роутер работает некорректно.
Как исправить «Java.net.ConnectException: Connection timed out»
Существуют несколько способов избавиться от ошибки Java.net.ConnectException. Рассмотрим их по порядку:
- Перезагрузите ваш PC. В некоторых случаях данный простой метод позволял решить ошибку java.net.connectexception connection refused;
- Установите на ПК свежую версию «Java». Довольно частой причиной рассматриваемой проблемы является устаревшая версия «Java» на пользовательском ПК. Перейдите в Панель управления, затем в «Программы», там найдите «Java» и кликните на неё. После появления окна её настроек перейдите на вкладку «Update», нажмите там на кнопку «Update Now», и установите в системе требуемые обновления.
Данную процедуру необходимо провести как на вашей машине, так и на машине того пользователя, с которым вы собираетесь играть в «Майнкрафт» по сети;
- Внесите «Майнкрафт» в исключения брандмауэра и антивируса на вашем ПК. Запустите Панель управления, перейдите в «Система и безопасность», там найдите «Брандмауэр Виндовс» и кликните на него. В открывшемся окне настроек брандмауэра слева сверху выберите опцию «Разрешения взаимодействия…». В открывшемся окне разрешённых для внешнего подключения программ найдите программы с упоминанием «Java», и поставьте им галочки для разрешения подключения (поможет кнопка «Изменить параметры»). Нажимаем на «Ок» для сохранения результата, перезагружаемся и пробуем подключиться к серверу. С антивирусом необходимо проделать аналогичные операции, внеся «Java» и «Майнкрафт» в его исключения;
- Попробуйте альтернативный сервер. Если подключения к конкретному серверу невозможно, тогда вполне вероятно, что у него наблюдаются временные проблемы в работе. Рекомендую попробовать альтернативный сервер, или подождать некоторое время, пока работоспособность начального сервера восстановиться;
- Создайте сервер на другой машине. Если вы создаёте сервер, к которому подключается другой знакомый вам пользователь, тогда рекомендуется поменять базовый компьютер для создания сервера. То есть сервер должен создать уже другой пользователь, а вы подключитесь к нему. Часто это позволяло решить проблему net.ConnectException на пользовательском компьютере;
- Используйте статистический IP-адрес. Если у вас есть возможность, рекомендуется использовать официальный (белый) IP-адрес, полученный через провайдера (обычно данная услуга имеет платный характер);
- Установите на ваш ПК (гаджет) свежую версию «Майнкрафт». Обычно необходимо, чтобы версии игры на сервере и на вашем ПК (гаджете) соответствовали друг другу; Установите самую свежую версию программы
- Избавьтесь от имеющихся модов к игре. Если вы используете какие-либо моды «Майнкрафт», рекомендуется удалить их, оставив само тело игры;
- Перезагрузите ваш роутер. Отключите ваш роутер, подождите полминуты, а затем включите его обратно;
- Обратитесь за консультацией к провайдеру. По различным причинам некоторые провайдеры блокируют доступ к некоторым серверам. Узнайте, не ваш ли это случай, и не является ли ваш провайдер причиной возникновения данной проблемы.
Заключение
Наиболее распространёнными причинами ошибки «Java.net.ConnectException: Connection timed out: no further information» является устаревание пользовательской версии «Java» и блокировка брандмауэром подключения к нужному игровому серверу. Решением проблемы станет выполнение перечисленных выше советов, это позволит исправить ошибку Java.net.ConnectException на вашем ПК.
Опубликовано 21.03.2018 Обновлено 03.12.2020