Android HttpPost无法使用python CGI服务器

时间:2011-03-08 11:03:36

标签: python android cgi http-post

我正在建立一个Android应用程序,需要将数据提交到我的python CGI服务器。我通常使用HttpGet从服务器上提取数据,所有这些调用都能正常,快速地完成。当我尝试使用HttpPost推送数据时,程序无限期挂起,直到我长按模拟器上的返回按钮并强制退出程序。 CGI服务器似乎启动脚本,但直到我强制退出Android应用程序才返回。当CGI脚本返回时,它显示CGI script exited OK但它没有做任何事情。

目前我正在UI线程中执行请求。我知道它应该在AsyncTask中完成,但在尝试一个好的解决方案之前我想要一个解决方案。

我花了3天时间尝试不同的事情,并在没有运气的情况下查看论坛。我真的很感激建议。这是我的Android代码的相关部分:

private final String serverIP = "10.0.2.2";

HttpClient httpclient = new DefaultHttpClient();
HttpParams params = httpclient.getParams();
HttpConnectionParams.setConnectionTimeout(params, 5000);
HttpConnectionParams.setSoTimeout(params, 5000);
String URI = "http://"+serverIP+":8000/cgi-bin/test.py?order_submit=0";
HttpPost post = new HttpPost(URI);

List<NameValuePair> kvPairs = new ArrayList<NameValuePair>(2);  
kvPairs.add(new BasicNameValuePair("name", "bob"));
kvPairs.add(new BasicNameValuePair("surname", "the builder"));

try {
    Log.i(TAG, "Trying to set Entity");
    post.setEntity(new UrlEncodedFormEntity(kvPairs, HTTP.UTF_8));

    Log.i(TAG, "Trying to Post");

    HttpResponse response = httpclient.execute(post);

    Log.i(TAG, "execute done");
    httpclient.getConnectionManager().closeExpiredConnections();

} catch (ClientProtocolException e) {
    Log.e(TAG,e.toString());
} catch (UnsupportedEncodingException e) {
    Log.e(TAG,e.toString());
} catch (IOException e) {
    Log.e(TAG,e.toString());
}

在LogCat中输出以下内容:

INFO/App:(534): Trying to set Entity
INFO/App:(534): Trying to Post
ERROR/App:(534): java.net.SocketTimeoutException: The operation timed out

我的Python CGI服务器脚本如下:

import os, sys, cgi, csv
import cgitb #CGI error backtracer
cgitb.enable()

form = cgi.FieldStorage()

if "order_submit" in form:    
    ofile = open(os.getcwd() + "/Forms/Output/foo.csv", "wb")
    writer = csv.writer(ofile, delimiter=',', quotechar='"',quoting=csv.QUOTE_ALL)
    writer.writerow(["Name", form["name"].value])
    writer.writerow(["Surname", form["surname"].value])
    ofile.close()

Android应用请求超时后,foo.csv仍然不存在。即使脚本的 if 部分包含以下内容,并且根本不使用CGI表单,情况也是如此:

if "order_submit" in form:    
    ofile = open(os.getcwd() + "/Forms/Output/foo.csv", "wb")
    writer = csv.writer(ofile, delimiter=',', quotechar='"',quoting=csv.QUOTE_ALL)
    writer.writerow(["Name", "harry"])
    ofile.close()  

httpclient.execute(post);之后,这是事件的顺序:
应用:httpclient.execute(post);
CGI服务器:POST /cgi-bin/test.py?order_submit=0 HTTP/1.1" 200
CGI服务器:启动第二个python脚本
几秒钟等待......
应用:java.net.SocketTimeoutException: The operation timed out
Python脚本:创建正确的虚拟文件
CGI服务器:CGI script exited OK

2 个答案:

答案 0 :(得分:0)

错误听起来似乎无法访问给定的IP,或者ISP阻止了端口8000或防火墙。

答案 1 :(得分:0)

我改变了

HttpClient httpclient = new DefaultHttpClient();
HttpParams params = httpclient.getParams();
HttpConnectionParams.setConnectionTimeout(params, 5000);
HttpConnectionParams.setSoTimeout(params, 5000);

HttpParams params = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(params, timeout);
HttpConnectionParams.setSoTimeout(params, timeout);
HttpClient httpclient = new DefaultHttpClient(params);

现在工作正常。我不认为我改变了其他任何东西。 BasicHttpParams必须初始化DefaultHttpClient没有的内容,这很奇怪,因为我一直在做的方式适用于HttpGet