我有一个Android应用程序通过HTTP向机器人发送命令。 (机器人服务器是使用BaseHttpServer类以Python编写的。)我尽可能正确地在应用程序中建立连接,但大多数请求无法返回,如果它们执行,则会有很长的延迟。下面是初始化代码:Android,HTTP GET不返回
private void setupHttpStuff() {
HttpParams params = new BasicHttpParams();
ConnManagerParams.setMaxTotalConnections(params, 10);
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(
new Scheme("http", PlainSocketFactory.getSocketFactory(), 1504));
ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);
this.HttpClient = new DefaultHttpClient(cm, params);
}
的GET请求发生在一个的AsyncTask和代码如下:
HttpContext localContext = new BasicHttpContext();
HttpGet httpGet = new HttpGet(url);
mClient.execute(httpGet, localContext);
在哪里移动客户端是从活动共享的变量。
通过使用Log.d消息我已经确定前两个请求工作正常,但随后的所有请求(在单独的AsyncTasks中)挂起并且从不从execute返回。我也尝试手动创建一个Socket和发送的HttpRequest:
Socket socket = new Socket("192.168.1.45", 1504);
HttpParams params = new BasicHttpParams();
DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
conn.bind(socket, params);
HttpRequest request = new BasicHttpRequest("GET", "/");
conn.sendRequestHeader(request);
HttpResponse response = conn.receiveResponseHeader(); // Hangs here
conn.receiveResponseEntity(response);
socket.close();
但这挂在conn.receiveResponseHeader()线和服务器永远不会看到该请求。
Python服务器可以很好地处理来自浏览器的请求,而不是使用我的Android应用程序。我在主用户界面中也尝试了这种单线程,但也会产生相同的效果。
编辑
这里是Python代码引起的问题:
class MyHand(BaseHTTPServer.BaseHTTPRequestHandler):
def do_GET(self):
qv = parse_qs(get_qs(urlparse(self.path)))
if("method" not in qv):
self.send_nack()
elif(qv["method"][0] == "drive"):
createbot.Drive(int(qv["velocity"][0]), int(qv["radius"][0]))
self.send_ack()
else:
self.send_nack()
def send_ack(self, content_type='text/html'):
self.send_response(200)
self.send_header('Content-type', content_type)
self.end_headers()
def send_nack(self):
self.send_response(500)
self.send_header('Content-type', 'text/html')
self.end_headers()
你是一个真正的设备或AVD上测试? – Jack
这是一个真正的设备,Nexus S. – LucasMcGraw