我正在使用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吗?
当缓冲区另一端的发送方完成发送数据流时,'read'方法将返回-1。通常从持久性存储(例如磁盘)中读取,从磁盘中的文件读取最后一个字符时,该方法返回-1。
解决此问题的方法是检查是否已发送整个JsonRPC消息,并关闭您身边的连接
while( (br.read(data)) != -1 )
{
answer = new String(data);
System.out.println(answer);
if (testForCompleteness(answer)) socket.close();
}