Как да се справя с Java SocketException

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 { 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.