Java HttpurlConnection كيفية تلقي استجابات متعددة من الخادم

StackOverflow https://stackoverflow.com/questions/4066825

  •  28-09-2019
  •  | 
  •  

سؤال

أحاول الاتصال بخادم برسالة منشور تطلب من الخادم الاشتراك لي. سيحتفظ الخادم بعد ذلك بتوصيل HTTP مفتوحًا وإرسال الرسائل غير المتزامنة إلي مع حالات حية حتى أطلب إلغاء الاشتراك أو إغلاق الاتصال بنفسي. أواجه مشكلة في قراءة هذه الردود اللاحقة من الخادم. يتصل الرمز أدناه بالخادم وقراءة الاستجابة الأولى بنجاح وطباعته إلى وحدة التحكم. المشكلة هي بعد ذلك الاستمرار في قراءة نفس الاستجابة (الاستجابة الأولى) بشكل لا نهائي وطبعها على الشاشة.

هل يرى أي شخص ما سأفشل هنا؟ أحاول فقط مشاهدة الرسالة التالية غير المتزامنة من الخادم وحظرها حتى تأتي. أيضًا إذا كان أي شخص يعرف كيفية التسجيل ليتم إخطاره عندما تظهر الرسالة التالية بشكل غير متزامن حتى لا أضطر إلى منع الانتظار سيكون أفضل.

public void HttpSubscription() 
{
    byte[] result = new byte[10240];

    try
    {
        /* Generate the hard coded request data */
        final StringBuffer soap = new StringBuffer();
        soap.append("<s:Envelope><s:Body><SoapTest1>thing1</SoapTest1></s:Body></s:Envelope>");

        // to make HTTP Post request with HttpURLConnection
        URL url = new URL("http://192.168.1.110:80/services");
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();

        // then set some properties and make a request
        conn.setRequestMethod("POST");
        conn.setRequestProperty( "Content-type", "text/xml; charset=utf-8" );

        // Get a handle to the output stream 
        OutputStream OStream = conn.getOutputStream();

        // Write the soap data to the output stream
        OStream.write(soap.toString().getBytes());

        InputStream ResponseStream = conn.getInputStream();
        while (true)
        {
            int len = ResponseStream.read(result);
            String value = new String(result);
            System.out.println(value);
        }
    }
    catch (Exception e)
    {
        System.out.println(e);
    }

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

المحلول

ما وصفته ليس HTTP ، إنه شيء آخر. قد تتمكن من الحصول على الخادم الخاص بك لتنفيذه ، قد لا. لكن توقع أن يفهم HttpurlConnection شيئًا ينتهك بروتوكول HTTP يسأل كثيرًا ، ألا تعتقد ذلك؟

نصائح أخرى

قديمة بعض الشيء ، لكنني قررت تصحيح بعض المعلومات الخاطئة الصارخة هنا.

الإجابات التي تنص على أن الردود المتعددة لطلب HTTP ليست وفقًا لمواصفات HTTP خاطئة!

من RFC 2616:

10 تعريفات رمز الحالة

يتم وصف كل رمز الحالة أدناه ، بما في ذلك وصف للطريقة (الطرق) التي يمكن أن تتبعها وأي معلومات ميثقة مطلوبة في الاستجابة.

10.1 المعلومات 1xx

تشير فئة رمز الحالة هذه إلى استجابة مؤقتة ، تتكون فقط من خط الحالة والرؤوس الاختيارية ، ويتم إنهاءها بواسطة خط فارغ. لا توجد رؤوس مطلوبة لهذا الفئة من رمز الحالة. نظرًا لأن HTTP/1.0 لم يحدد أي رموز حالة 1xx ، يجب ألا ترسل الخوادم استجابة 1xx إلى عميل HTTP/1.0 باستثناء الظروف التجريبية.

يجب أن يكون العميل مستعدًا لقبول استجابات حالة واحدة أو أكثر من 1xx قبل استجابة منتظمة ، حتى لو لم يتوقع العميل رسالة حالة 100 (متابعة). قد يتم تجاهل استجابات حالة 1xx غير متوقعة من قبل وكيل المستخدم.

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