2

ホスティング プロバイダーのサーバーと通信する Android アプリケーションがあります。このアプリケーションは、http 要求を送信し、php スクリプトが要求を取得して、データベースで操作を実行します。データベースを変更し、プログラムを修正したところ、サーバーで次のエラーが表示されました。「リクエストがタイムアウトしました。リクエストを再試行してください。」

FirefoxやChromeなどのブラウザでhttpコマンドを実行すると、コマンドは正しく実行されますが、コードを実行するとエラーが発生します。

これはスクリプトでも http リクエストでもないため、どこから来るのかまったくわかりません。手伝って頂けますか?どうもありがとうございました。

Androidコードがあります:

public class ConnexionSQL extends AsyncTask<Object,Void, ArrayList<String[]> > {


private static ArrayList<String[]> lesMessagesEtDate;
private String mydataFromHMI;
private String myFichierPHPbase;
private ProgressDialog pd;
private String[] splitData;
private boolean isProblemConnexion;

public ConnexionSQL(Activity activity) {

    pd = new ProgressDialog(activity);
    lesMessagesEtDate = new ArrayList<String[]>();
    mydataFromHMI = "";
    myFichierPHPbase="";
    isProblemConnexion = false;
}


protected ArrayList<String[]> doInBackground(Object... parametres) {
    Object[] tabArg = parametres;
    ArrayList<String[]>  messagesDateEtLocalisation = new ArrayList<String[]>();
    pd.show();

     if (((String)tabArg[3]).equalsIgnoreCase("insert")){

         insertIntoBD((String)tabArg[0], (Context)tabArg[1], (String)tabArg[2]);

     }else if(((String)tabArg[3]).equalsIgnoreCase("connect")){

         messagesDateEtLocalisation = ConnexionBD((String)tabArg[0], (Context)tabArg[1], (String)tabArg[2]);
     }
    return messagesDateEtLocalisation;
}


protected void onPreExecute() {
    pd.setMessage("Chargement en cours");
    pd.show();
}


protected void onProgressUpdate(){
    pd.setMessage("Chargement en cours");
    pd.show();
}

protected void onPostExecute(ArrayList<String[]> array)
{
    pd.setMessage("Le chargement se termine");
    pd.dismiss();     

}

public void insertIntoBD(String dataFromHMI, Context context, String FichierPHPbase){


    mydataFromHMI = dataFromHMI;
    myFichierPHPbase = FichierPHPbase;



    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

    try{
        HttpParams params = new BasicHttpParams();
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
        HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
        HttpProtocolParams.setUseExpectContinue(params, false);  
        HttpConnectionParams.setConnectionTimeout(params, 10000);
        HttpConnectionParams.setSoTimeout(params, 10000);
        ConnManagerParams.setMaxTotalConnections(params, 1000);
        ConnManagerParams.setTimeout(params, 30000);

        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http",PlainSocketFactory.getSocketFactory(), 80));
        registry.register(new Scheme("https",PlainSocketFactory.getSocketFactory(), 80));
        ThreadSafeClientConnManager manager = new ThreadSafeClientConnManager(params, registry);
        HttpClient httpclient = new DefaultHttpClient(manager, params);

        HttpPost httppost = new HttpPost("http://routeslibre.fr/"+ myFichierPHPbase + "?variable=" + mydataFromHMI);
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        httpclient.execute(httppost);


    }
    catch(Exception e){
        Log.i("taghttppost",""+e.toString());
        isProblemConnexion = true;
    }

}



public ArrayList<String[]> ConnexionBD(String dataFromHMI, Context context,String FichierPHPbase) {

    mydataFromHMI = dataFromHMI;
    myFichierPHPbase = FichierPHPbase;

    String result = null;
    InputStream is = null;
    JSONObject json_data=null;
    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

    try{
        //commandes httpClient

        HttpParams params = new BasicHttpParams();
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
        HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
        HttpProtocolParams.setUseExpectContinue(params, false);  
        HttpConnectionParams.setConnectionTimeout(params, 10000);
        HttpConnectionParams.setSoTimeout(params, 10000);
        ConnManagerParams.setMaxTotalConnections(params, 1000);
        ConnManagerParams.setTimeout(params, 30000);

        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http",PlainSocketFactory.getSocketFactory(), 80));
        registry.register(new Scheme("https",PlainSocketFactory.getSocketFactory(), 80));
        ThreadSafeClientConnManager manager = new ThreadSafeClientConnManager(params, registry);


        HttpClient httpclient = new DefaultHttpClient(manager, params);             

        GestionStrings gestionString = new GestionStrings();
        splitData = mydataFromHMI.split(";;;");
        mydataFromHMI = gestionString.blancTraitement(splitData[0]) 
                + ";;;" 
                + gestionString.blancTraitement(splitData[1]) 
                + ";;;";

        HttpPost httppost = new HttpPost("http://routeslibre.fr/"+ myFichierPHPbase + "?variable=" + mydataFromHMI);
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity entity = response.getEntity();
        is = entity.getContent();
    }
    catch(Exception e){
        Log.i("taghttppost",""+e.toString());
        isProblemConnexion = true;
    }


    //conversion de la réponse en chaine de caractère
    try
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));

        StringBuilder sb  = new StringBuilder();

        String line = null;

        while ((line = reader.readLine()) != null) 
        {
            sb.append(line + "\n");
        }

        is.close();

        result = sb.toString();
        if (result.startsWith("<html>"))
        {
            isProblemConnexion = true;
        }
    }
    catch(Exception e)
    {
        Log.i("tagconvertstr",""+e.toString());
        isProblemConnexion = true;
    }
    //recuperation des donnees json
    try{
        JSONArray jArray = new JSONArray(result);

        for(int i=0;i<jArray.length();i++)
        {

            json_data = jArray.getJSONObject(i);
            String[] messageEtDate = new String[2];
            messageEtDate[0] = json_data.getString("message");
            messageEtDate[1] = json_data.getString("date");
            lesMessagesEtDate.add(messageEtDate);


        }
        //setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, lesMessages));
    }
    catch(JSONException e){
        Log.i("tagjsonexp",""+e.toString());
        isProblemConnexion = true;
    } catch (ParseException e) {
        Log.i("tagjsonpars",""+e.toString());
        isProblemConnexion = true;
    }
    if (isProblemConnexion){

        lesMessagesEtDate = new ArrayList<String[]>();
        lesMessagesEtDate.add(new String[]{"connexion_error_1234"});
        isProblemConnexion = false;
    }
    return lesMessagesEtDate;
}

}

そこにphpスクリプトコード:

$base = mysql_connect ('sql31.free-h.org:3306', '*****', '******'); 
mysql_select_db ('routeslibre', $base) ;  
$variable = $_GET['variable'];
$first_token  = strtok($variable, ";;;");
$second_token = strtok(";;;");
$req =mysql_query("SELECT message, date from routeslibre.routeslibre where departement='$first_token' AND      voie='$second_token' ORDER BY date");
$output=array();
while ($row=mysql_fetch_array($req)) {    
$output[]=$row;    
} 
//on encode en JSON 
print(json_encode($output));
mysql_free_result ($req);

「is.close ();」の行でデバッガーを停止すると <html> Your request timed out. Please retry the request値 "db" は " "に等しい

よろしければエラーの見つけ方、テクニックを教えていただけないでしょうか?

私はコードにこの行を入れました: int test = response.getStatusLine().getStatusCode(); そしてテスト値は 408 なので (ウェブサイトで説明されているように) 私のホスティングプロバイダーにエラーがあることを意味します. しかし、コードから取得した http リクエストを送信するhttp://routeslibre.fr/"+ myFichierPHPbase + "?variable=" + mydataFromHMIと、値が表示され、それを chrome または firefox として Web クライアントに送信すると、php スクリプトが非常にうまく動作するのはなぜか... わかりません.... ???

4

1 に答える 1

0

このコードでは、それは完全には機能しません。機能しない場合もあります。実行操作でデバッガーが設定されている場合、例外が発生し、その値は「null」のみになります。私たちを手伝ってくれますか ?

動作しないコードは次のとおりです。

HttpGet httpGet = new HttpGet(url);
HttpParams httpParameters = new BasicHttpParams();
// Set the timeout in milliseconds until a connection is established.
// The default value is zero, that means the timeout is not used. 
int timeoutConnection = 3000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
// Set the default socket timeout (SO_TIMEOUT) 
// in milliseconds which is the timeout for waiting for data.
int timeoutSocket = 5000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
HttpResponse response = httpClient.execute(httpGet);

解決策を見つけました。リクエストが発生するまで(サーバーから取得したステータスが200に等しい)、実行コードをループします。リクエストで結果が得られない場合は、エラーが発生します。ここに私の解決策があります:

        String httpRequest = new String("http://routeslibre.fr/"+ myFichierPHPbase + "?variable=" + mydataFromHMI);
        HttpPost request = new HttpPost(httpRequest); 
        HttpParams httpParameters = new BasicHttpParams();
        HttpProtocolParams.setVersion(httpParameters, HttpVersion.HTTP_1_1);
        HttpProtocolParams.setContentCharset(httpParameters, HTTP.UTF_8);

        DefaultHttpClient httpclient = new DefaultHttpClient(httpParameters);

        HttpResponse response = null;
        for(int i= 0; i < 30; i++){
            response = httpclient.execute(request);
            if (response.getStatusLine().getStatusCode() == 200){
                break;
            }else if (i == 29){

                //ERROR CODE
            }
        }
于 2012-08-02T15:23:51.883 に答える