我想从Socket读取数据,直到遇到特定的字符串序列,如
这里的目标是让while循环持续运行,以便套接字可以在流中读取任何东西时保持读取状态。
<END>
。问题是服务器有时会将数据分成块返回,这是因为文本(JSON)太长而无法一次性发送。我希望设计一种逻辑,使Socket不断附加一个字符串构建器,直到流结束时出现<END>
,然后继续添加下一个消息。InputStreamReader inr = new InputStreamReader(socket.getInputStream());
BufferedReader br = new BufferedReader(inr);
byte[] resultBuff = new byte[0];
byte[] buff = new byte[99999];
int k;
StringBuilder sb = new StringBuilder();
while ((k = in .read(buff, 0, buff.length)) > -1) {
byte[] tbuff = new byte[resultBuff.length + k]; // temp buffer size = bytes already read + bytes last read
System.arraycopy(resultBuff, 0, tbuff, 0, resultBuff.length); // copy previous bytes
System.arraycopy(buff, 0, tbuff, resultBuff.length, k); // copy current lot
resultBuff = tbuff; // call the temp buffer as your result buff
System.out.println(resultBuff.length + " bytes read.");
String s = new String(resultBuff);
sb.append(s);
if (s.endsWith(DELIMITER)) {
String response = sb.toString().replace(DELIMITER, "").replace("\n", "").replace("\r", "");
System.out.println(response);
if (listener != null) {
listener.onMessageReceived(params[0], response);
} else {
Log.e(TAG, "Response :: listener.onMessageReceived null ");
}
resultBuff = new byte[0];
sb = new StringBuilder();
} else {
sb.append(s);
}
}
这里的目标是让while循环持续运行,以便套接字可以在流中读取任何东西时保持读取状态。
useDelimiter(...)
接受一个正则表达式,如果你的DELIMITER
包含特殊的正则表达式字符,你需要对它们进行转义。尝试使用sc.useDelimiter(Pattern.quote(DELIMITER))
。 - TitusScanner
方法将会失败。我已经编辑了第一个示例以处理消息在单个块中发送的情况。 - Titus