Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android套接字继续读取,直到指定的字符串序列_Java_Android_Sockets_Bufferedreader - Fatal编程技术网

Java Android套接字继续读取,直到指定的字符串序列

Java Android套接字继续读取,直到指定的字符串序列,java,android,sockets,bufferedreader,Java,Android,Sockets,Bufferedreader,我想从套接字读取一个特定的字符串序列,如。问题是,当文本(JSON)太长而无法以数据包的形式发送时,服务器有时会以块的形式返回数据。我想创建一个逻辑,其中套接字一直追加字符串生成器,直到流在结束,然后继续追加另一条消息 InputStreamReader inr = new InputStreamReader(socket.getInputStream()); BufferedReader br = new BufferedReader(inr); byte[] resultBuff = n

我想从套接字读取一个特定的字符串序列,如
。问题是,当文本(JSON)太长而无法以数据包的形式发送时,服务器有时会以块的形式返回数据。我想创建一个逻辑,其中套接字一直追加字符串生成器,直到流在
结束,然后继续追加另一条消息

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
字符串中,当
str
包含
分隔符时,它将从
str
提取消息,以便对其进行处理。如果缓冲区包含多条消息,则此操作将失败。您可以使用
String[]messages=str.split(分隔符)
来处理这个问题

更好的解决方案是使用
扫描仪
,以下是一个示例:

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

这两种解决方案根本不起作用,尤其是在扫描仪上。@H.T
使用分隔符(…)
接受正则表达式,如果您的
分隔符包含特殊的正则表达式字符,则必须对其进行转义。请尝试
sc.useDelimiter(Pattern.quote(DELIMITER))
My DELIMITER是一个字符串值。很遗憾,返回的消息是空的。使用useDelimiter(\\s*\\s*)可以解决消息没有被完全读取多长的问题。不能解决问题problem@H.T如果服务器在单个数据块中发送消息,并且完成后未关闭连接,
Scanner
方法将失败。我编辑了第一个示例,以处理在单个块中发送消息的情况。