Сокет BufferedReader IOException выдается только в Windows, а не в Linux? - PullRequest
0 голосов
/ 29 июня 2018

Проект представляет собой программу чата с многопоточным сервером для работы с несколькими клиентами. Код ниже на стороне сервера для потока, который начинается после подключения клиента. 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. Что может быть лучше для определения отключения клиента? Запустить поток для мониторинга, пытаясь постоянно писать каждому клиенту в моем клиентском массиве?

...