java - Android Socket 继续读取直到特定的字符串序列

标签 java android sockets bufferedreader

我想从套接字读取直到特定的字符串序列,如 <END> .问题是当文本 (JSON) 太长而无法以数据包形式发送时,服务器有时会以 block 的形式返回数据。我想创建一个逻辑,其中套接字不断附加一个 String Builder,直到流结束于 <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 循环运行,以便套接字可以在流中有内容时继续读取。

最佳答案

你可以这样做。

String str = "";
byte[] b = new byte[1024];
for(int r = 0; (r = is.read(b))!=-1;){
    str += new String(b,0,r);
    if(str.contains(DELIMITER)){
        String message = str.substring(0,str.indexOf(DELIMITER));
        str = str.substring(str.indexOf(DELIMITER)+DELIMITER.length());
        //process message.
    }
}
if(!str.isEmpty()){
    //the JSON object was sent in a single chunk, porcess it
}

这样做是将从InputStream读取的所有数据存储到str String中,当str code> 包含 DELIMITER 它将从 str 中提取消息,以便对其进行处理。如果缓冲区包含不止一条消息,这将失败。您可以使用 String[] messages = str.split(DELIMITER) 来处理它。

更好的解决方案是使用Scanner,这里是一个例子:

Scanner sc = new Scanner(in);
sc.useDelimiter(DELIMITER);
while(sc.hasNext()){
    String message = sc.next();
    // process message.
}

关于java - Android Socket 继续读取直到特定的字符串序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35577927/

相关文章:

java - Web 服务器向 J2ME 应用程序发送命令

javascript - 使用 NodeJS 和 Socket.io 的 CPU 密集型任务架构

java - 在 Android 上运行 libgdx 应用程序时出现异常

java - 在 java 中将 double 分成两部分 "integer & fraction"的最佳方法是什么

android - 如何设置 Android Studio 项目所需的最低 SDK Build Tools 版本?

java - 如何解决 Android 4.4.2 中的 AVD 自动旋转屏幕问题?

php - socket_read() 只返回标题,而不是实际的响应

java - 使用 Mockito 模拟结果集

java - 使用 Connection Provider 类配置 Spring 4 JDBC JDBCTemplate

android - 使用不安全的 RFCOMM 蓝牙套接字时,android 何时显示配对对话框?