1

我正在使用Java Socket Programming来接收服务器响应,我正在使用 achar 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窝。

2-我很确定服务器端工作正常,它发送完成的响应。

3-不存在任何可能导致该行为的终止符。

4

1 回答 1

2

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

是的。这就是流协议的工作方式。您不应该假设您将在一次调用中收到所有数据read()

如果您在同一个流上有多条消息,您将需要一种方法来判断消息在哪里结束。您不能依赖于read()阅读整条消息而不阅读任何下一条消息。

三种常见的方法是:

  • 每条消息的长度前缀
  • 消息之间的分隔符
  • 自终止消息(例如 XML,您可以通过到达结束标签来判断文档的结尾)

如果您没有任何这些方案,但是您想将多条消息放在网络上并分别处理它们,那么您的协议从根本上被破坏了,您应该重新审视它。

此外,您应该指定在构造InputStreamReader. 不要只使用平台默认值。

于 2014-07-01T12:22:55.350 回答