无法接收服务器完整响应

时间:2014-07-01 12:16:36

标签: java inputstream bufferedreader inputstreamreader

我正在使用 Java Socket Programming 来接收服务器响应,我正在使用char array并使用read()方法读取其中的每个响应:

InputStream stream = null;
try{
    stream = socket.getInputStream();
}catch(Exception e){
    conn_lost();
}

if(stream != null){
    input = new BufferedReader(new InputStreamReader(
                    stream));

Looper.prepare();
char a[] = new char[1000];
for(int i =0; i < a.length; i++){
      a[i] = ' ';
   }

while (true){

   input.read(a);

   String response = String.valueOf(a);

   process_server_response(response);

   for(int i =0; i < a.length; i++){
         a[i] = ' ';
      }
}

问题是有时我无法从服务器收到完整的响应,而不是我收到的一半,然后响应之后我收到了另一半。

值得一提:

1 - 受影响的响应有点大于其他响应,但我确定它不会超过 1000 l窝。

2 - 我非常确定服务器端工作正常,并且它会完成响应。

3 - 不存在任何可能导致该行为的终结者类型。

1 个答案:

答案 0 :(得分:2)

  

问题有时我无法从服务器收到完整的响应,而不是我接收到的一半,然后是响应,之后我收到了另一半。

是。这就是流协议的工作原理。您不应该假设您只需拨打一次read()即可收到所有数据。

如果您在同一个流上有多条消息,则需要一种方法来告知消息的结束位置。您不得依赖read()阅读整条信息,而不是阅读下一条信息。

三种常见方法是:

  • 每封邮件的长度前缀
  • 消息之间的分隔符
  • 自终止消息(例如XML,您可以通过到达其结束标记来告知文档的结尾)

如果您没有任何这些方案,但是您希望在线路上放置多条消息并单独处理它们,那么您的协议将从根本上被破坏,您应该重新访问它。

此外,您应指定构建InputStreamReader时要应用的编码。不要只使用平台默认值。