2010-12-26 12 views
0

Ich habe ein Problem mit HTTP-URL-Verbindungen, die keine Daten zurückgeben. Der Code, den ich benutze, ist unten ... Es ist im Grunde ein Messaging-Client, und diese Methode erhält alle Nachrichten an einen gefälschten Benutzer (Bot) geschickt und dann bin ich in der Lage, die Nachrichten zu manipulieren, nach Schlüsselwörtern suchen und reagieren von der Bot.HttpURLConnection POST-Anforderung gibt keinen Wert zurück

public void getMessages(String bot) 
{ 
    xml = "" + 
      "xmlMessage=<message type=\"comet.get.message.updates\" " 
      + "id=\"" + bot + "\" " 
      + "password=\"" + password + "\" />"; 

    // Replace spaces (partial url encode). 
    xml = xml.replace(" ", "%20"); 

    String serverResponse = ""; 

    try 
    { 
     // Build URL 
     url = new URL(botUrl); 
     request = (HttpURLConnection)url.openConnection(); 

     // Set the Request Method. 
     request.setRequestMethod("POST"); 
     request.setDoInput(true); 
     request.setDoOutput(true); 
     request.setUseCaches(false); 
     request.setAllowUserInteraction(false); 
     request.setRequestProperty("Content-type", "text/xml; charset=" + "UTF-8"); 

     out = request.getOutputStream(); 
     writer = new OutputStreamWriter(out, "UTF-8"); 
     writer.write(xml); 
     writer.close(); 

     String temp = ""; 

     buff = new BufferedReader (new InputStreamReader (request.getInputStream())); 
     while ((temp = buff.readLine()) != null) 
     { 
      serverResponse = serverResponse + temp; 
     } 

//  XML RESPONSE EXAMPLE 
//   xml = "- <message type=\"comet.message.updates\" id=\"[email protected]\" count=\"2\">z" + 
//      "- <contact id=\"jy5740\" />" + 
//        "<statement text=\"test\" from=\"jy5740\" />" + 
//        "<statement text=\"testing 123\" from=\"jy5740\" />" + 
//       "</contact>" + 
//      "</message>"; 
    } 
    catch (MalformedURLException ex) 
    { 
     System.out.println("Bad URL: " + ex); 
    } 
    catch (IOException ex) 
    { 
     System.out.println("Connection error: " + ex); 
    } 

    // do stuff with the serverResponse string 

Die Methode funktioniert einwandfrei, wenn Nachrichten vorliegen, die zum Zeitpunkt des Methodenaufrufs nicht empfangen wurden. Das Problem ist, wenn seit der letzten Überprüfung keine Nachrichten mehr vorhanden sind. Die Methode bleibt einfach in der while-Schleife, bis eine Nachricht an den Bot gesendet wird, der meine App sperrt. Wie kann ich feststellen, ob der Server keine Antwort erhalten hat?

Antwort

1

Die Punkt des Kometen ist "lange Polling" - das Sie eine Anfrage stellen und es wird nicht abgeschlossen, bis es eine echte Antwort gibt, oder bis es ausläuft. Mit anderen Worten, wenn es keine Nachrichten gibt, würde ich erwarten, dass der Anruf an readLine für eine lange Zeit blockiert.

Wenn Sie einen Antrag stellen müssen, die wird nicht lange Timeout nehmen, müssen Sie entweder eine Auszeit irgendwo angeben (möglicherweise auf HTTP-Ebene, möglicherweise innerhalb der XML-Inhalte) oder verwenden Sie einen anderen Anruf, um mit zu beginnen - es kann durchaus eine andere Art von Nachricht geben, die für nicht hängende Anfragen verwendet wird.

+0

Ok, ich völlig übersehen, dass. Vielen Dank, dass Sie mich in die richtige Richtung weisen! – JustinY17

0

Keine Ahnung, aber hier ist mein Code für HTTP Post:

 

      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost(UPLOAD_URL); 

      MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 

      try { 
       reqEntity.addPart("param1", new StringBody("yes")); 
       reqEntity.addPart("param2", new StringBody("no")); 

       httppost.setEntity(reqEntity); 

       LOG.debug("executing request " + httppost.getRequestLine()); 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity resEntity = response.getEntity(); 

       String urlImageShack = null; 
       if (resEntity != null) { 
        // XML returned by Imageshack 
        String page = EntityUtils.toString(resEntity); 
        LOG.debug("It return: " + page); 
       }