TCP-клиентский сокет не прослушивает поток получателя

#android #multithreading #sockets #tcp #bufferedreader

#Android #многопоточность #сокеты #tcp #bufferedreader

Вопрос:

Приведенный ниже код не может считывать данные с TCP-сервера. Я не могу найти проблему. Любая помощь будет оценена.

 class Receive extends Thread {
    public void run() {
        while (true){
           StringBuilder log = new StringBuilder();
           String line = null;
           BufferedReader bufferedReader = null;
           try {
              bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
           } catch (IOException e) {
              e.printStackTrace();
           }

           if(bufferedReader!=null){
             while (true) {
                try {
                    if (!((line = bufferedReader.readLine()) != null)) break;
                } catch (IOException e) {
                    e.printStackTrace();
                }
                log.append(line);
             }
             Log.d("==> ", "data is "   line);
          }
       }
    }
}
  

Комментарии:

1. (!((line = bufferedReader.readLine()) != null)) Дважды НЕ делает его довольно нечитаемым. Пожалуйста, адаптируйте для нас, обычных программистов.

Ответ №1:

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

Попробуйте это вместо:

 class Receive extends Thread {
    public void run() {
        try {
            StringBuilder log = new StringBuilder();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                log.append(line);
            }
            Log.d("==> ", "data is "   log.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  

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

Комментарии:

1. Спасибо, Реми Лебо. Да, на самом деле я пытаюсь подключиться к считывателю rfid. Это будет подключено все время. Итак, какую модификацию я могу сделать в этом коде?

2. @BiplabDe это полностью зависит от того, какой протокол связи фактически использует считыватель RFID. Трудно ответить на ваш вопрос без этой детали. Можете ли вы предоставить некоторую документацию или пример о том, что на самом деле ожидает считыватель RFID?

3. У RFID есть какой-то тег для сканирования, и он будет передавать данные по сети. И у меня есть приложение для Android для его прослушивания. сокет = новый сокет (); Inetsocket address inetsocket address = новый inetsocket address (strIP, NPort); socket.connect (inetsocket address, 5000); Используя этот код, я могу подключиться внутри потока. И теперь у меня есть другой поток для получения данных от считывателя rfid. И приложение Android и считыватель rfid будут находиться в одной сети.

4. Моя цель — создать приложение для Android, которое прослушивает считыватель rfid на порту 4196. и всякий раз, когда происходит сканирование тегов, клиентское приложение Android TCP должно считывать его и регистрировать.

5. @BiplabDe это не отвечает на мой вопрос. Считыватель RFID должен определенным образом форматировать отсканированные данные при передаче данных. Что это за формат? Читатель должен каким-то образом разграничить несколько сканирований. Какую семантику использует читатель для связи с заинтересованными клиентами? Если вы не можете ответить на этот вопрос, то вы не сможете эффективно общаться с читателем.