Illyoneer
@Illyoneer
Android Developer

Баг с BufferedReader + Socket, почему дублируются строки?

Привет ведающим, столкнулся с проблемой при использовании BufferedReader'a в Android.
Суть проблемы: держу самописный Java-сервер на ПК, открыты порты и подключаюсь с клиента на Android.
Сервер выступает в роли ретранслятора сообщений от одного клиента всем и занимается логированием.
При подключении всем клиентам выдается список подключившихся и сообщение о подключении нового пользователя.
BufferedReader на ПК-клиентах отрабатывает как нужно, а на мобильном клиенте при идентичном коде бывает съедает строку или выводит ее дважды. Прилагаю скрин на котором зеленым отмечено как должно быть, а красным, как багается.

Сервер пишу на Java 16.0.1, чтение и запись в поток идет в отдельном потоке(тьфу-тьфу) что в мобильном клиенте, что на сервере. В мобильном клиенте считанные строки добавляю в TextView, а на ПК-клиенте просто вывожу в консоль, но это так, к слову.

60979f1d34260130592942.jpeg

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

Код прилагаю:

Клиент, метод принятия сообщений:

private void receiveMessage() throws IOException
    {
        _reader = new BufferedReader(new InputStreamReader(_clientSocket.getInputStream()));
        Thread input = new Thread(() ->
        {
            try {
                while (true)
                {
                    _clientMessage = _reader.readLine();
                    runOnUiThread(() ->
                    {
                        if(_clientMessage != null)
                            _messages_text.append("\n\t\t" + _clientMessage);
                    });
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
        input.start();
    }


Сервер, метод отправки сообщений всем пользователям и метод отображения всех подключенных:
public static synchronized void broadcastMessage(String message) throws InterruptedException
    {
        for (PrintWriter printWriter : _clientsList.values())
        {
            printWriter.println(message);
            printWriter.flush();
            Thread.sleep(150);
        }
    }
    public static synchronized void showUsers() throws InterruptedException
    {
        broadcastMessage("CONNECTED: " + _nicknameClient);
        Thread.sleep(135);
        broadcastMessage("\n");
        broadcastMessage("CLIENTS LIST: ");
        for (String name : _clientsNicknames)
        {
            broadcastMessage(name.trim());
            Thread.sleep(135);
        }
        broadcastMessage("\n");
    }
  • Вопрос задан
  • 94 просмотра
Решения вопроса 1
Illyoneer
@Illyoneer Автор вопроса
Android Developer
Всем спасибо(хоть и я один), проблема была решена.
Дело оказалось в неправильной синхронизации потоков чтения.
Добавив доп. синхронизацию все стало нормально.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы