我有一个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脚本工作非常发现...我不明白.. .. ???
答案 0 :(得分: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
}
}