سؤال

أود أن أعرف مقدار البيانات التي تم إرسالها استجابة لطلب HTTP معين. ما أقوم به حاليا هو:

   HttpURLConnection con = (HttpURLConnection) feedurl.openConnection();

// التحقق من الاستجابة لحجم المحتوى INT FeedSize = con.getcontentLength ()؛

المشكلة هي أن المحتوى - لا يتم تعيين Legnth دائما. على سبيل المثال، عندما يستخدم الخادم ترميز الترميز = قم بتشغيل قيمة -1.

أفعل ليس بحاجة إلى هذا لعرض معلومات التقدم. أحتاج فقط إلى معرفة حجم البيانات التي تم إرسالها إلي بعد ذلك.

خلفية: أحتاج هذه المعلومات لأنني أرغب في مقارنتها بحجم الاستجابة، تم إرسالها باستخدام ترميز Gzip.

هل كانت مفيدة؟

المحلول

كنت أستخدم أ Commons-io CountingInputstream, ، والتي من شأنها أن تفعل الوظيفة لك. مثال كامل ولكنه تافه:

public long countContent(URL feedurl) {
  CountingInputStream counter = null;
  try {
     HttpURLConnection con = (HttpURLConnection) feedurl.openConnection();
     counter = new CountingInputStream(con.getInputStream());
     String output = IOUtils.toString(counter);
     return counter.getByteCount();
  } catch (IOException ex) {
     throw new RuntimeException(ex);
  } finally {
     IOUtils.closeQuietly(counter);
  }
}

نصائح أخرى

يمكنك تمديد FilterInputStream, ، تجاوز read(), read(byte[],int,int), ، و skip الأساليب بحيث بعد استدعاء super شكل، يقومون بتحديث عداد مع قراءة عدد البايتات.

ثم لفت دفق الإدخال عاد من قبل URLConnection مع أحد هذه، واستخدم المجمع بدلا من الدفق الأصلي. عند الانتهاء، يمكنك استعلام المجمع الخاص به.

ستستخدم النهج الأخرى ("دليل") أداة مثل Yslow لجمع الإحصاءات في متصفح أو Wireshark لفحص حركة المرور على الشبكة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top