2010-07-15 38 views
5

Tôi đang cố gắng lấy đầu ra từ một servlet trên điện thoại Android.Gọi Java servlet từ Android

Đây là servlet của tôi:

/* 
    * To change this template, choose Tools | Templates 
    * and open the template in the editor. 
    */ 
    package main; 

    import java.io.IOException; 
    import java.io.PrintWriter; 
    import javax.servlet.ServletException; 
    import javax.servlet.http.HttpServlet; 
    import javax.servlet.http.HttpServletRequest; 
    import javax.servlet.http.HttpServletResponse; 

    /** 
    * 
    * @author Bert Verhelst <[email protected]> 
    */ 
    public class servlet1 extends HttpServlet { 

     /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods. 
     * @param request servlet request 
     * @param response servlet response 
     * @throws ServletException if a servlet-specific error occurs 
     * @throws IOException if an I/O error occurs 
     */ 
     protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
       throws ServletException, IOException { 
      response.setContentType("text/html;charset=UTF-8"); 
      PrintWriter out = response.getWriter(); 
      out.println("<html>"); 
      out.println("<head>"); 
      out.println("<title>Servlet servlet1</title>"); 
      out.println("</head>"); 
      out.println("<body>"); 
      out.println("<h1>processing...</h1>"); 
      out.println("</body>"); 
      out.println("</html>"); 
     } 

     // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code."> 
     /** 
     * Handles the HTTP <code>GET</code> method. 
     * @param request servlet request 
     * @param response servlet response 
     * @throws ServletException if a servlet-specific error occurs 
     * @throws IOException if an I/O error occurs 
     */ 
     @Override 
     protected void doGet(HttpServletRequest request, HttpServletResponse response) 
       throws ServletException, IOException { 
      processRequest(request, response); 
      PrintWriter out = response.getWriter(); 
      out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " 
        + "Transitional//EN\">\n" 
        + "<html>\n" 
        + "<head><title>Hello WWW</title></head>\n" 
        + "<body>\n" 
        + "<h1>doget...</h1>\n" 
        + "</body></html>"); 
     } 

     /** 
     * Handles the HTTP <code>POST</code> method. 
     * @param request servlet request 
     * @param response servlet response 
     * @throws ServletException if a servlet-specific error occurs 
     * @throws IOException if an I/O error occurs 
     */ 
     @Override 
     protected void doPost(HttpServletRequest request, HttpServletResponse response) 
       throws ServletException, IOException { 
      processRequest(request, response); 
      PrintWriter out = response.getWriter(); 
      out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " 
        + "Transitional//EN\">\n" 
        + "<html>\n" 
        + "<head><title>Hello WWW</title></head>\n" 
        + "<body>\n" 
        + "<h1>dopost...</h1>\n" 
        + "</body></html>"); 
     } 

     /** 
     * Returns a short description of the servlet. 
     * @return a String containing servlet description 
     */ 
     @Override 
     public String getServletInfo() { 
      return "Short description"; 
     }// </editor-fold> 
    } 

Đây là Android trang chính của tôi:

 package be.smarttelecom.MyTest; 

    import android.app.Activity; 
    import android.os.Bundle; 
    import android.widget.TextView; 

    public class Main extends Activity { 
     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 
      TextView output = (TextView) findViewById(R.id.output); 
      try { 
       output.append("starting\n"); 
       RestClient client = new RestClient("http://10.0.0.188:8084/Servlet_1/servlet1"); 

       try { 
        client.Execute(RequestMethod.GET); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

       output.append("after execute\n"); 

       String response = client.getResponse(); 
       output.append("class - " + response + "\n"); 
       output.append(response); 
       output.append("done\n"); 
      } 
      catch (Exception ex) { 
       output.append("error: " + ex.getMessage() + "\n" + ex.toString() + "\n"); 
      } 
     } 
    } 

Và cuối cùng chúng ta có RestClient:

 package be.smarttelecom.MyTest; 

    import java.io.BufferedReader; 
    import java.io.IOException; 
    import java.io.InputStream; 
    import java.io.InputStreamReader; 
    import java.util.ArrayList; 

    import org.apache.http.HttpEntity; 
    import org.apache.http.HttpResponse; 
    import org.apache.http.NameValuePair; 
    import org.apache.http.client.ClientProtocolException; 
    import org.apache.http.client.HttpClient; 
    import org.apache.http.client.entity.UrlEncodedFormEntity; 
    import org.apache.http.client.methods.HttpGet; 
    import org.apache.http.client.methods.HttpPost; 
    import org.apache.http.client.methods.HttpUriRequest; 
    import org.apache.http.impl.client.DefaultHttpClient; 
    import org.apache.http.message.BasicNameValuePair; 
    import org.apache.http.protocol.HTTP; 

    public class RestClient { 
     private ArrayList <NameValuePair> params; 
     private ArrayList <NameValuePair> headers; 

     private String url; 

     private int responseCode; 
     private String message; 

     private String response; 

     public String getResponse() { 
      return response; 
     } 

     public String getErrorMessage() { 
      return message; 
     } 

     public int getResponseCode() { 
      return responseCode; 
     } 

     public RestClient(String url) 
     { 
      this.url = url; 
      params = new ArrayList<NameValuePair>(); 
      headers = new ArrayList<NameValuePair>(); 
     } 

     public void AddParam(String name, String value) 
     { 
      params.add(new BasicNameValuePair(name, value)); 
     } 

     public void AddHeader(String name, String value) 
     { 
      headers.add(new BasicNameValuePair(name, value)); 
     } 

     public void Execute(RequestMethod method) throws Exception 
     { 
      switch(method) { 
       case GET: 
       { 
        //add parameters 
        String combinedParams = ""; 
        if(!params.isEmpty()){ 
         combinedParams += "?"; 
         for(NameValuePair p : params) 
         { 
          String paramString = p.getName() + "=" + p.getValue(); 
          if(combinedParams.length() > 1) 
          { 
           combinedParams += "&" + paramString; 
          } 
          else 
          { 
           combinedParams += paramString; 
          } 
         } 
        } 

        HttpGet request = new HttpGet(url + combinedParams); 

        //add headers 
        for(NameValuePair h : headers) 
        { 
         request.addHeader(h.getName(), h.getValue()); 
        } 
        executeRequest(request, url); 
        break; 
       } 

       case POST: 
       { 
        HttpPost request = new HttpPost(url); 

        //add headers 
        for(NameValuePair h : headers) 
        { 
         request.addHeader(h.getName(), h.getValue()); 
        } 

        if(!params.isEmpty()){ 
         request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); 
        } 

        executeRequest(request, url); 
        break; 
       } 
      } 
     } 

     private void executeRequest(HttpUriRequest request, String url) 
     { 
      HttpClient client = new DefaultHttpClient(); 

      HttpResponse httpResponse; 

      try { 
       httpResponse = client.execute(request); 
       responseCode = httpResponse.getStatusLine().getStatusCode(); 
       message = httpResponse.getStatusLine().getReasonPhrase(); 

       HttpEntity entity = httpResponse.getEntity(); 

       if (entity != null) { 
        InputStream instream = entity.getContent(); 
        response = convertStreamToString(instream); 

        // Closing the input stream will trigger connection release 
        instream.close(); 
       } 
      } 
      catch (ClientProtocolException e) { 
       client.getConnectionManager().shutdown(); 
       e.printStackTrace(); 
      } catch (IOException e) { 
       client.getConnectionManager().shutdown(); 
       e.printStackTrace(); 
      } 
     } 

     private static String convertStreamToString(InputStream is) { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
      StringBuilder sb = new StringBuilder(); 

      String line = null; 
      try { 
       while ((line = reader.readLine()) != null) { 
        sb.append(line + "\n"); 
       } 
      } 
      catch (IOException e) { 
       e.printStackTrace(); 
      } 
      finally { 
       try { 
        is.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
      return sb.toString(); 
     } 
    } 

Thật không may điều này không làm việc . Dưới đây là những gì tôi nhận được cho đầu ra (null),

Screenshot of

Tôi đang làm gì sai?

Tôi yêu cầu phương thức DoGet của servlet của tôi và chuyển đổi đầu ra thành một chuỗi, nhưng nó dường như trống.

tôi cho phép kết nối Internet trong file manifest ngay sau khung bế mạc của ứng dụng,

<uses-permission android:name="android.permission.INTERNET" /> 
+0

Bạn có được những gì bạn mong đợi nếu bạn truy cập servlet từ trình duyệt? Ngoài ra, doGet() của bạn gọi processRequest, nó thực hiện out.close(), trong khi doGet cố gắng viết thêm HTML trên một luồng đã đóng (không bao giờ đóng luồng đầu ra trong một servlet). – nos

+3

Cuộc gọi có bao giờ đến Servlet không? Máy chủ nhìn thấy gì đang được gửi? Máy chủ gửi lại là gì? –

Trả lời

3

Romain Hippeau đã viết trong một chú thích:

Liệu cuộc gọi bao giờ đến được với các servlet? Máy chủ nhìn thấy gì đang được gửi? Máy chủ gửi lại là gì?

Đó là vấn đề! Tôi bị vô hiệu hóa tường lửa của tôi và bây giờ nó hoạt động :)

0

tại sao bạn sử dụng cổng IP này

"http://10.0.0.188:8084" 

Tôi đoán bạn nên sử dụng này để thay thế cho android mô phỏng:

"http://10.0.2.2:8080"