0

データを返さないHTTPURL接続の処理に問題があります。私が使用しているコードは次のとおりです...これは基本的にメッセージングクライアントであり、このメソッドは偽のユーザー(ボット)に送信されたメッセージを取得し、メッセージを操作してキーワードを探し、ボット。

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=\"chalkboard.status@fdq.att.com\" 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

メソッド呼び出し時に受信されていないメッセージがある場合、メソッドは完全に機能します。問題は、最後のチェック以降にメッセージがない場合です。このメソッドは、アプリをロックしているボットにメッセージが送信されるまで、whileループにとどまります。サーバーからの応答がなかったかどうかを確認するにはどうすればよいですか?

4

2 に答える 2

1

コメットのポイントは「長いポーリング」です。つまり、リクエストを行うと、実際の応答があるか、タイムアウトになるまで完了しません。つまり、メッセージがない場合は、呼び出しがreadLine長時間ブロックされると予想されます。

タイムアウトに時間がかからないリクエストを行う必要がある場合は、どこかで(おそらくHTTPレベルで、おそらくXMLコンテンツ内で)タイムアウトを指定するか、別の呼び出しを使用する必要があります。そもそも-ハングしていないリクエストに使用される別の種類のメッセージがあるかもしれません。

于 2010-12-26T18:24:50.240 に答える
0

わかりませんが、HTTPPostのコードは次のとおりです。

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

            MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);

            試す {
                reqEntity.addPart( "param1"、new StringBody( "yes"));
                reqEntity.addPart( "param2"、new StringBody( "no"));

                httppost.setEntity(reqEntity);

                LOG.debug("リクエストの実行"+ httppost.getRequestLine());
                HttpResponse応答=httpclient.execute(httppost);
                HttpEntity resEntity = response.getEntity();

                文字列urlImageShack=null;
                if(resEntity!= null){
                    //Imageshackから返されるXML
                    文字列ページ=EntityUtils.toString(resEntity);
                    LOG.debug( "戻り値:" +ページ);
                }
于 2010-12-26T18:30:12.993 に答える