Рубрики
Без рубрики

Как обрабатывать Java SocketException

Узнайте, что вызывает SocketException в Java и как с ним справиться.

Автор оригинала: baeldung.

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.stopConnection();
}

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

client.startConnection("127.0.0.1", 6699);
client.sendMessage("hi again");

4. Заключение

В этой статье мы рассмотрели, что вызывает SocketException и как с этим справиться.

Как всегда, код доступен на Github .