1. 程式人生 > >android客戶端與部署到tomcat的servlet伺服器之間實現http通訊

android客戶端與部署到tomcat的servlet伺服器之間實現http通訊

博主目前小白,為了完成這個踩到不少地雷,在此處記錄下,可能錯誤忘記了,以後想起來再更新。

伺服器端:

public class Servlet extends HttpServlet {
@Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
            }
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.setContentType("text/plain"); response.setCharacterEncoding("UTF-8"); response.getOutputStream().print("This is Servlet "
); } } }

這裡寫圖片描述
在tomcat上部署專案時,輸入http://localhost:8080/專案名稱/servlet名稱,看到自己的寫的servlet就成功了,如果出現500錯誤,描述裡說是過濾器什麼的,很大的原因是缺少包,少什麼匯入什麼就行。

不要忘記在web.xml中建立servlet

<servlet>
    <servlet-name>Servlet</servlet-name>//就是那個繼承httpservlet的類名
    <servlet-class>com.example.Servlet</servlet-class
>//那個servlet類的在scr下的檔案地址 </servlet> <servlet-mapping> <servlet-name>Servlet</servlet-name> <url-pattern>/Servlet</url-pattern>//也是類名。不要忘了斜槓 </servlet-mapping>

這就好了。有關tomcat 和eclipse 的配置就不多說了,百度下教程很多。

下面是android客戶端:

public class MainActivity extends Activity {
    private TextView textView;
    private connect connectThread;
    private String result1;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.textView);
        connectThread = new connect();
        connectThread.start();
        try {
            Thread.currentThread().sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

這裡要重點說明的是那個connect類的物件connectThread,可以看出這是個執行緒。
之所以建個子執行緒是因為剛開始我直接在onCreate裡連線的時候一直被堵塞導致app掛掉。。就是刷到真機上點開就閃退。查過很多資料,也有很多人發了跟我一樣的問題。我最終是用子執行緒的方式解決的。
因為很多人是看書或者是一些老的demo學習的,所以會進入困境,由於sdk升級,android4.3以上的手機好像不能在主執行緒裡進行網路操作。
下面是子執行緒類:

public class connect extends Thread {
    int count = 0;
    private String string_url = "http://172.27.163.4:8080/http_server/Servlet";//ip 要自行修改 手機和電腦在同一個區域網下。因為我沒有可用的外網伺服器,是將PC作為伺服器的。
    private URL url = null;
    String result;
    String readline;
    public connect() {
        super();
        System.out.println("建立子執行緒end");
    }
    public void run() {
        super.run();
        System.out.println("get方法begin");
        this.getconnect();
        System.out.println("get方法end");
        //count++;
        //System.out.println("" + count);這兩行我剛開始是為了測試這個執行緒的執行情況的。因為還是新手,多試試能記得牢
    }
    public void getconnect() {
        try {
            url = new URL(string_url);
            System.out.println("11111111111");
            HttpURLConnection connect_url = (HttpURLConnection) url.openConnection();
            connect_url.setDoOutput(true);
            connect_url.setDoInput(true);
            connect_url.setConnectTimeout(10000);
            connect_url.setRequestMethod("GET");
            connect_url.connect();
            System.setProperty("http.keepAlive", "false");

            InputStreamReader in = new InputStreamReader(connect_url.getInputStream(), "utf-8");
            System.out.println("22222222222");
            BufferedReader reader = new BufferedReader(in);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            reader.close();
            result = sb.toString();
            in.close();
            connect_url.disconnect();
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            // e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

可能會比較亂,有很多沒提到。
像,我寫這個的時候用了json解析。程式碼沒貼上來,時間關係,下次再更新。android端的json 我開始的時候犯了個錯誤,原來伺服器端的json的包是匯入的。我順手也匯入了android端,結果閃退了,原因是android自己本身就是有關於json的jar的,兩個包同時存在的話裡面的類會打架導致出錯。刪掉後來導進去的就好了。

還碰到一些問題,我後續學習中有想起來的話就再加進去。