1、Android網絡通訊html
android網絡通訊通常有三種:java.net.*(標準Java接口)、org.apache接口(基於http協議)和android.net.*(Android網絡接口),涉及到包括流、數據包套接字(socket)、Internet協議、常見Http處理等。android 內置HttpClient,簡化和網站間的交互。可是不支持Web Services,須要利用ksoap2_android才能支持。java
一、使用Socket進行通訊
Socket一般也稱做"套接字",用於描述IP地址和端口,是一個通訊鏈的句柄。Android Socket開發和JAVA Socket開發相似
無非是建立一個Socket服務端和Socket客戶端進行通訊。
Socket服務端代碼:android
1 try{ 2 // 新建服務器Socket 3 ServerSocket ss = new ServerSocket(8888); 4 System.out.println("Listening..."); 5 while(true){ 6 // 監聽是否有客戶端連上 7 Socket socket = ss.accept(); 8 System.out.println("Client Connected..."); 9 DataOutputStream dout = new DataOutputStream(socket.getOutputStream()); 10 Date d = new Date(); 11 // 演示傳送個 當前時間給客戶端 12 dout.writeUTF(d.toLocaleString()); 13 dout.close(); 14 socket.close(); 15 } 16 } 17 catch(Exception e){ 18 e.printStackTrace(); 19 } 20 }
Socket客戶端代碼:web
1 public void connectToServer(){ //方法:鏈接客戶端 2 try{ 3 Socket socket = new Socket("10.0.2.2", 8888);//建立Socket對象 4 DataInputStream din = new DataInputStream(socket.getInputStream()); //得到DataInputStream對象 5 String msg = din.readUTF(); //讀取服務端發來的消息 6 EditText et = (EditText)findViewById(R.id.et); //得到EditText對象 7 if (null != msg) { 8 et.setText(msg); //設置EditText對象 9 }else { 10 et.setText("error data"); 11 } 12 13 14 } 15 catch(Exception e){ //捕獲並打印異常 16 e.printStackTrace(); 17 } 18 }
服務端是普通JAVA項目,先啓動服務端,再啓動客戶端Android項目,客戶端連上服務端,把當前時間數據從服務端發往客戶端顯示出來apache
注意:服務器與客戶端沒法連接的可能緣由有:
a、AndroidManifest沒有加訪問網絡的權限:<uses-permission android:name="android.permission.INTERNET"></uses-permission>
b、IP地址要使用:10.0.2.2,不能用localhost
c、模擬器不能配置代理tomcat
二、使用Http進行通訊
使用HttpClient在Android客戶端訪問Web,有點html知識都知道,提交表單有兩種方式
get和post,Android客戶端訪問Web也是這兩種方式。在本機先建個web應用(方便演示)。
data.jsp的代碼:服務器
1 <%@page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 <html> 3 <head> 4 <title> 5 Http Test 6 </title> 7 </head> 8 <body> 9 <% 10 String type = request.getParameter("parameter"); 11 String result = new String(type.getBytes("iso-8859-1"),"utf-8"); 12 out.println("<h1>" + result + "</h1>"); 13 %> 14 </body> 15 </html>
啓動tomcat,訪問http://192.168.1.101:8080/test/data.jsp?parameter=發送的參數網絡
注意:192.168.1.101是我本機的IP,要替換成本身的IP。app
按鈕監聽代碼:socket
1 //綁定按鈕監聽器 2 get.setOnClickListener(new OnClickListener() { 3 @Override 4 public void onClick(View v) { 5 //注意:此處ip不能用127.0.0.1或localhost,Android模擬器已將它本身做爲了localhost 6 String uri = "http://192.168.1.101:8080/test/data.jsp?parameter=以Get方式發送請求"; 7 textView.setText(get(uri)); 8 } 9 }); 10 //綁定按鈕監聽器 11 post.setOnClickListener(new OnClickListener() { 12 @Override 13 public void onClick(View v) { 14 String uri = "http://192.168.1.101:8080/test/data.jsp"; 15 textView.setText(post(uri)); 16 } 17 });
get方式請求代碼:
1 /** 2 * 以get方式發送請求,訪問web 3 * @param uri web地址 4 * @return 響應數據 5 */ 6 private static String get(String uri){ 7 BufferedReader reader = null; 8 StringBuffer sb = null; 9 String result = ""; 10 HttpClient client = new DefaultHttpClient(); 11 HttpGet request = new HttpGet(uri); 12 try { 13 //發送請求,獲得響應 14 HttpResponse response = client.execute(request); 15 16 //請求成功 17 if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ 18 reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 19 sb = new StringBuffer(); 20 String line = ""; 21 String NL = System.getProperty("line.separator"); 22 while((line = reader.readLine()) != null){ 23 sb.append(line); 24 } 25 } 26 } catch (ClientProtocolException e) { 27 e.printStackTrace(); 28 } catch (IOException e) { 29 e.printStackTrace(); 30 } 31 finally{ 32 try { 33 if (null != reader){ 34 reader.close(); 35 reader = null; 36 } 37 } catch (IOException e) { 38 e.printStackTrace(); 39 } 40 } 41 if (null != sb){ 42 result = sb.toString(); 43 } 44 return result; 45 }
post方式請求代碼:
1 /** 2 * 以post方式發送請求,訪問web 3 * @param uri web地址 4 * @return 響應數據 5 */ 6 private static String post(String uri){ 7 BufferedReader reader = null; 8 StringBuffer sb = null; 9 String result = ""; 10 HttpClient client = new DefaultHttpClient(); 11 HttpPost request = new HttpPost(uri); 12 13 //保存要傳遞的參數 14 List<NameValuePair> params = new ArrayList<NameValuePair>(); 15 //添加參數 16 params.add(new BasicNameValuePair("parameter","以Post方式發送請求")); 17 18 try { 19 //設置字符集 20 HttpEntity entity = new UrlEncodedFormEntity(params,"utf-8"); 21 //請求對象 22 request.setEntity(entity); 23 //發送請求 24 HttpResponse response = client.execute(request); 25 26 //請求成功 27 if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ 28 System.out.println("post success"); 29 reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 30 sb = new StringBuffer(); 31 String line = ""; 32 String NL = System.getProperty("line.separator"); 33 while((line = reader.readLine()) != null){ 34 sb.append(line); 35 } 36 } 37 } catch (ClientProtocolException e) { 38 e.printStackTrace(); 39 } catch (IOException e) { 40 e.printStackTrace(); 41 } 42 finally{ 43 try { 44 //關閉流 45 if (null != reader){ 46 reader.close(); 47 reader = null; 48 } 49 } catch (IOException e) { 50 e.printStackTrace(); 51 } 52 } 53 if (null != sb){ 54 result = sb.toString(); 55 } 56 return result; 57 }
點擊'get'按鈕:
點擊'post'按鈕
三、獲取http網絡資源
其實這裏就是前面講Android數據存儲的最後一種:網絡存儲。將txt文件和png圖片放在tomcat服務器上,模擬器經過http路徑去獲取資源顯示出來。
獲取路徑爲:
1 String stringURL = "http://192.168.1.101:8080/test/test.txt"; 2 String bitmapURL = "http://192.168.1.101:8080/test/crab.png";
獲取文本資源代碼:
1 //方法,根據指定URL字符串獲取網絡資源 2 public void getStringURLResources(){ 3 try{ 4 URL myUrl = new URL(stringURL); 5 URLConnection myConn = myUrl.openConnection(); //打開鏈接 6 InputStream in = myConn.getInputStream(); //獲取輸入流 7 BufferedInputStream bis = new BufferedInputStream(in);//獲取BufferedInputStream對象 8 ByteArrayBuffer baf = new ByteArrayBuffer(bis.available()); 9 int data = 0; 10 while((data = bis.read())!= -1){ //讀取BufferedInputStream中數據 11 baf.append((byte)data); //將數據讀取到ByteArrayBuffer中 12 } 13 String msg = EncodingUtils.getString(baf.toByteArray(), "GBK"); //轉換爲字符串,用UTF-8中文會亂碼 14 EditText et = (EditText)findViewById(R.id.et); //得到EditText對象 15 et.setText(msg); //設置EditText控件中的內容 16 } 17 catch(Exception e){ 18 e.printStackTrace(); 19 } 20 }
獲取圖片資源代碼:
1 public void getBitmapURLResources(){ 2 try{ 3 URL myUrl = new URL(bitmapURL); //建立URL對象 4 URLConnection myConn = myUrl.openConnection(); //打開鏈接 5 InputStream in = myConn.getInputStream(); //得到InputStream對象 6 Bitmap bmp = BitmapFactory.decodeStream(in); //建立Bitmap 7 ImageView iv = (ImageView)findViewById(R.id.iv); //得到ImageView對象 8 iv.setImageBitmap(bmp); //設置ImageView顯示的內容 9 } 10 catch(Exception e){ 11 e.printStackTrace(); 12 } 13 }
注意:String msg = EncodingUtils.getString(baf.toByteArray(), "GBK");//轉換爲字符串,用UTF-8中文會亂碼
運行效果: