簡體   English   中英

無法收到服務器的完整響應

[英]can't receive server full response

我正在使用Java套接字編程來接收服務器響應,正在使用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窩。

2-我很確定服務器端可以正常工作,並且可以發送完整的響應。

3-不存在任何可能導致該行為的終止符

問題是有時我無法從服務器收到完整的響應,而是收到一半的響應,然后收到另一半的響應。

是。 這就是流協議的工作方式。 您不應該假設您將在一次read()調用中收到所有數據。

如果在同一流上有多個消息,則需要一種方法來告知消息結束的位置。 一定不能依靠read()讀取一條消息的全部,而不要讀取任何下一條消息。

三種常見方法是:

  • 每個消息的長度前綴
  • 消息之間的分隔符
  • 自終止消息(例如XML,您可以通過到達其結束標記來告知文檔的結尾)

如果您沒有這些方案,但是您想將多條消息放在網絡上並分別進行處理,則您的協議從根本上被破壞了,應該重新訪問它。

此外,在構造InputStreamReader時,應指定要應用的編碼。 不要只使用平台默認值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM