我正在建立一个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
答案 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
。