2011-09-28 61 views
1

我有一个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() 
+0

你是一个真正的设备或AVD上测试? – Jack

+0

这是一个真正的设备,Nexus S. – LucasMcGraw

回答

0

以保持活动,这可能是相关的。 Android发送Connection:Keep-Alive并且Python发回Connection:close。我查看了从Firefox和HttpClient发送的HTTP标头,没有什么区别(除了发送一些额外的Accept标头的Firefox)。不知何故,Android希望Python服务器发送除HTTP/1.1 200 OK\nContent-type: text/html以外的东西,因此保持套接字打开。我最终编写了自己的基本HTTP服务器和客户端。

Python代码:

class SingleTCPHandler(SocketServer.BaseRequestHandler): 

    def handle(self): 
     data = self.request.recv(1024) 
     parts = data.rsplit(" ") 
     if (parts[0] != "GET"): 
      self.request.close() 
      return 

     url = parts[1].split("?")[1] 
     qv = parse_qs(url) 
     ... 

安卓

Socket socket = null; 
    PrintWriter output = null; 

    try { 
     socket = new Socket(this.ipAddress, this.portNo); 
     output = new PrintWriter(new BufferedWriter 
       (new OutputStreamWriter(socket.getOutputStream())), true); 
     output.println("GET " + url); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (socket != null) 
       socket.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     if (output != null) 
      output.close(); 
    }