Перейти к основному содержимому

Как обрабатывать исключение Java SocketException

· 3 мин. чтения

1. Введение

В этом кратком руководстве мы рассмотрим причины SocketException на примере.

Мы также, конечно, обсудим, как обрабатывать исключение.

2. Причины исключения SocketException

Наиболее распространенной причиной SocketException является запись или чтение данных в или из закрытого соединения сокета . Другой причиной этого является закрытие соединения до чтения всех данных в буфере сокета.

Давайте подробнее рассмотрим некоторые общие основные причины.

2.1. Медленная сеть

Плохое сетевое соединение может быть основной проблемой. Установка более высокого тайм-аута подключения к сокету может снизить скорость SocketException для медленных подключений:

socket.setSoTimeout(30000); // timeout set to 30,000 ms

2.2. Вмешательство брандмауэра

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

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

2.3. Длительное простое соединение

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

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 .