当BufferedReader.read(char [])返回-1吗?

问题描述 投票:0回答:2

我正在使用Evolis证卡打印机SDK,它通过TCP套接字使用JsonRPC与客户端进行通信。

我有制造商提供的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 )中,因为在第一个循环之后,BufferedReader.read不会返回-1并一直停留在超时之前!

第一次运行获取答复内容的所有JSON,然后第二次运行被卡住,因为没有要读取的内容。

当BufferedReader.read(char [])返回-1吗?

java sockets tcp sdk bufferedreader
2个回答
0
投票

当缓冲区另一端的发送方完成发送数据流时,'read'方法将返回-1。通常从持久性存储(例如磁盘)中读取,从磁盘中的文件读取最后一个字符时,该方法返回-1。


0
投票

解决此问题的方法是检查是否已发送整个JsonRPC消息,并关闭您身边的连接

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

© www.soinside.com 2019 - 2024. All rights reserved.