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();”行停止调试器时 值“db”等于“ <html> Your request timed out. Please retry the request

如果你不介意,你能给我一个技巧,一个找到错误的方法吗?

我将这一行放在代码中: int test = response.getStatusLine().getStatusCode(); 并且测试值为 408,因此(如网站所述)这意味着我的托管服务提供商有错误。但是为什么当我提出 http 请求时,从代码中检索:值http://routeslibre.fr/"+ myFichierPHPbase + "?variable=" + mydataFromHMI以及当我将它作为 chrome 或 firefox 放入 Web 客户端时,我的 php 脚本工作起来很发现......我不明白...... ???

4

1 回答 1

0

使用此代码,它不能完美地工作:有时它的工作有时不是。在执行操作上设置调试器时,会抛出异常,其值仅为“null”。你可以帮帮我吗 ?

这是不起作用的代码 find :

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 回答