小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

android用okhttp搭建網(wǎng)絡(luò)通訊(附服務(wù)器端代碼)

 崋果山 2018-01-19

??Okhttp是一個處理網(wǎng)絡(luò)請求的開源項(xiàng)目,是安卓端最火熱的輕量級框架。

接下來我們就來實(shí)現(xiàn)一下這個用Okhttp搭建一個android客戶端訪問java服務(wù)端的項(xiàng)目。

網(wǎng)上有很多這樣的例子,但都是只有android客戶端的,這篇文章把服務(wù)端代碼也貼一下,這樣有許多同學(xué)就可以完全在自己的機(jī)器上面部署環(huán)境來開發(fā)測試了。

首先新建一個anroid studio項(xiàng)目,在依賴庫里面增加對okhttp庫的引用
compile 'com.squareup.okhttp:okhttp:2.7.5'
然后在AndroidManifest.xml里面增加權(quán)限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
新建一個Activity,然后在布局文件里面增加一個Button,點(diǎn)擊這個Button的時候我們?nèi)ハ蚍?wù)器發(fā)送一個GET請求。關(guān)鍵代碼如下:
  1. Button btn = (Button) findViewById(R.id.btn);  
  2.   
  3. btn.setOnClickListener(new View.OnClickListener() {  
  4.   
  5.     @Override  
  6.   
  7.     public void onClick(View view) {  
  8.   
  9.         String url = "http://192.168.23.1:7111/web02/base";  
  10.   
  11.         OkHttpClient client = new OkHttpClient();  
  12.   
  13.         final Request request = new Request.Builder().url(url).build();  
  14.   
  15.         client.newCall(request).enqueue(new Callback() {  
  16.   
  17.             @Override  
  18.   
  19.             public void onFailure(Request request, IOException e) {  
  20.   
  21.                 String  error = e.getMessage();  
  22.   
  23.             }  
  24.   
  25.   
  26.   
  27.             @Override  
  28.   
  29.             public void onResponse(Response response) throws IOException {  
  1.                 if(response.isSuccessful()){  
  2.   
  3.                         String json = response.body().toString();  
  4.   
  5.                         InputStream is =      response.body().byteStream();  
  6.   
  7.                         ByteArrayOutputStream bos = new ByteArrayOutputStream();  
  8.   
  9.                         int readed = 0;  
  10.   
  11.                         byte buf[] = new byte[1024];  
  12.   
  13.                         while ((readed = is.read(buf, 0, buf.length)) != -1) {  
  14.   
  15.                             bos.write(buf, 0, readed);  
  16.   
  17.                         }  
  18.   
  19.                          byte[] result = bos.toByteArray();  
  20.   
  21.                      Log.d("result","result:"+ new String(result));  
  22.   
  23.                      is.close();  
  24.   
  25.                      bos.close();  
  26.   
  27.                      buf=null;  
  28.   
  29.                     }  
  30.   
  31.             }  
  32.   
  33.         });  
  34.   
  35.     }  
  36.   
  37. });  

這里的url只是我本地測試的url,有的同學(xué)會問,我自己本地的url是多少呢?

如果是用同一臺機(jī)器上的tomcat部署服務(wù)端的,怎么在自己的機(jī)器上部署能讓自己的手機(jī)客戶端訪問到。

在用myeclipse發(fā)布一個程序到tomcat上后,用ipconfig命令測試下自己機(jī)器的ip。

找到無線局域網(wǎng)的IPV4地址,這里是192.168.23.1。 端口號如果不知道的,可以去tomcat下面的server.xml里面查看部署的端口號是多少。我這里已經(jīng)查看過了,是7111。

注意,要讓你的手機(jī)和你的筆記本保持在一個局域網(wǎng)里面,你的手機(jī)可以訪問這個地址,進(jìn)而訪問你筆記本上部署的tomcat服務(wù)。

所以在客戶端程序代碼里面url里面地址配置成http://192.168.23.1:7111/項(xiàng)目名/具體方法名(servlet)";比方說上面的例子,我是寫成String url = http://192.168.23.1:7111/web02/base;
好了。
客戶端完成后,接下來是服務(wù)端的編寫。

服務(wù)端很簡單,寫一個簡單的Servlet去接受數(shù)據(jù)。

  1. package com.example.servlet;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5.   
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.http.HttpServlet;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10.   
  11. /** 
  12.  */  
  13. public class BaseServlet extends HttpServlet {  
  14.   
  15.     @Override  
  16.     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
  17.         System.out.println("doGet");  
  18.         handleRequest(req,resp);  
  19.     }  
  20.   
  21.     @Override  
  22.     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
  23.         System.out.println("dopost");  
  24.         handleRequest(req,resp);  
  25.           
  26.     }  
  27.   
  28.     private void handleRequest(HttpServletRequest req, HttpServletResponse resp) throws IOException {  
  29.                   
  30.         req.setCharacterEncoding("UTF-8");  // 設(shè)置字符集  
  31.         resp.setCharacterEncoding("UTF-8");  
  32.         resp.setHeader("Cache-Control", "no-store");  
  33.         PrintWriter out = resp.getWriter(); // 準(zhǔn)備輸出  
  34.         out.println("<html>");  
  35.         out.println("<head><title>WEB開發(fā)</title></head>");  
  36.         out.println("<body>");  
  37.         out.println("<h1>Hello World</h1>");  
  38.         out.println("</body>");  
  39.         out.println("</html>");  
  40.         out.close();// 關(guān)閉輸出  
  41.           
  42.     }  
  43. }  

BaseServlet當(dāng)中重寫了 doGet方法和doPost方法,在這里我把兩種請求方式都做了統(tǒng)一處理。要注意的是,要刪掉原來servlet里面的super.doGet()方法和super.doPost(),否則在OkHttp的 response.isSuccessful())里面會返回失敗。為什么會這樣呢?我們找到Response類的源代碼

  1. /** 
  2.  * Returns true if the code is in [200..300), which means the request was 
  3.  * successfully received, understood, and accepted. 
  4.  */  
  5. public boolean isSuccessful() {  
  6.   return code >= 200 && code < 300;  
  7. }  
哦,其實(shí)就是判斷這個code是否等于200.

因?yàn)閟ervlet默認(rèn)的super.doGet()方法里面返回的code是405,所以這里面如果保留super.doGet()會出錯。

OK,最后在配置文件web.xml里面配置剛才寫的Servelt

<servlet>

 <servlet-name>base</servlet-name>

 <servlet-class>com.example.servlet.BaseServlet</servlet-class>

 

 </servlet>

 <servlet-mapping>

 <servlet-name>base</servlet-name>

 <url-pattern>/base</url-pattern>

 </servlet-mapping>

最后測試一下,控制臺打印返回的xml信息,說明連接成功。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多