Когда BufferedReader.read (char []) возвращает -1? - PullRequest
0 голосов
/ 28 февраля 2020

Я работаю с Evolis Card Printer SDK, он связывается с клиентом с помощью JsonRP C через TCP-сокет.

У меня есть Java пример, предоставленный производителем, но у меня возникли проблемы с чтением сокета:

package MinimalClient;
import java.io.*;
import java.net.*;

public class MinimalClient 
{   
    public static void main(String[] args) 
    {
        try {
                String ip = "11.1.24.210";
                int port = 18000;
                char[] data = new char[1024];
                String request = "{\"jsonrpc\":\"2.0\",\"id\":\"1\",\"method\":\"CMD.SendCommand\",\"params\":{\"command\":\"Rfv\", \"device\":\"Evolis Primacy\", \"timeout\":\"5000\"}}"; 
                String answer = "";

                Socket socket = new Socket(ip,port);

                BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                DataOutputStream out = new DataOutputStream(socket.getOutputStream());

                byte[] byteRequest = request.getBytes("UTF-8");

                out.write(byteRequest);

                out.flush();

                while( (br.read(data)) != -1 ) 
                {
                    answer = new String(data);
                    System.out.println(answer);
                }

                socket.close();
            } 
            catch (Exception e) 
            { 
                System.out.println("Communication failed :\n");
                System.out.println(" - check TCP communication is activated\n");
                System.out.println(" - check the service is activated\n");
                System.out.println(" - check your IP address and port\n");                          
            }
    }
}

Я застрял в while( (br.read(data)) != -1 ), потому что после первого l oop, BufferedReader.read не возвращает -1 и остается там до истечения времени ожидания!

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

Когда BufferedReader.read (char []) возвращает -1?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

BufferedReader.read (char []) вернет -1 для файла, если (а) вы достигли конца файла и (б) файл открыт для записи в другом месте. В противном случае он будет ожидать записи дополнительных данных в поток.

Способ исправить это - проверить, что сообщение JsonRP C полностью отправлено, и закрыть соединение на вашей стороне * 1003. *

            while( (br.read(data)) != -1 ) 
            {
                answer = new String(data);
                System.out.println(answer);
                if (testForCompleteness(answer)) socket.close();
            }
0 голосов
/ 28 февраля 2020

Когда отправитель на другом конце буфера завершит отправку потока данных, метод read прочитает -1. Обычно чтение из постоянного хранилища, например с диска, когда последний символ считывается из файла с диска, метод возвращает -1.

Однако это «Socket», а «sender» находится на другая сторона сети. Я подозреваю, что «sender» должен flu sh () и закрыть () свою сторону «output stream» для вашего метода read (), чтобы получить -1.

Вы должны войти в свяжитесь с вашим продавцом и проверьте это. Всего наилучшего и надеюсь, что это помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...