Проект представляет собой программу чата с многопоточным сервером для работы с несколькими клиентами. Код ниже на стороне сервера для потока, который начинается после подключения клиента. ConnectionHandler принимает сокет подключенного клиента и «ID».
Статический «широковещательный» метод, вызываемый в run (), не имеет отношения к вопросу, а также к обеим функциям в предложении finally.
Я работал над проектом как на рабочем столе Windows 10, так и на ноутбуке XPS с Ubuntu 18.04.
Отключение клиента обрабатывается, как только IOException перехватывается в методе run (). Это работает, как разработано в Windows, однако для Ubuntu это не так. При выходе из клиента графического интерфейса кажется, что только исключение перехватывается в Windows и не происходит в Ubuntu. Таким образом, сервер не работает для Linux и отлично работает на Windows.
Не является ли это хорошо отработанным методом для обработки отключения клиента в целом? Или это что-то еще, что мне нужно изменить, чтобы это работало в Linux? Я понятия не имею, что делать, потому что я не уверен, является ли это ошибкой в моем коде или это просто способ Linux обрабатывает Java по сравнению с Windows?
Любая помощь или советы приветствуются. Заранее спасибо.
class ConnectionHandler implements Runnable
{
//Begin declarations for new client thread
int clientId;
Socket connection;
BufferedReader reader;
BufferedWriter writer;
String message;
//end declarations for new client thread
public ConnectionHandler(int clientId, Socket connection)
{
this.clientId = clientId;
this.connection = connection;
}
@Override
public void run()
{
try
{
reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
writer = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));
}
catch (IOException e)
{
e.printStackTrace();
}
try
{
while (true)
{
message = reader.readLine();
if (message != null)
{
System.out.println("Message from " + message);
CrosstalkServer.broadcast(message);
}
}
}
catch (IOException e)
{
System.out.println("Client has disconnected. Recycling client ID: " + clientId);
}
finally
{
//Close the reader, writer, and socket.
terminateClient();
//Client has disconnected, handle client count and recycle client ID
CrosstalkServer.recycleClientId(this);
}
}
Редактировать: я тестировал программу на Windows 10, Windows 7 и Ubuntu 18.04. После некоторого тестирования проблема возникает на стороне клиента. Я запустил сервер на своем ноутбуке Ubuntu и протестировал клиент Windows 7 вместе с клиентами Windows 10. Клиент Windows 7 не вызывал IOException, в отличие от Windows 10. Ubuntu на стороне клиента также не вызывает IOException. Что может быть лучше для определения отключения клиента? Запустить поток для мониторинга, пытаясь постоянно писать каждому клиенту в моем клиентском массиве?