【Android笔记】Android的三种网络通信方式

Android平台有三种网络接口可以使用,他们分别是:java.net.*(标准Java接口)、Org.apache接口和Android.net.*(Android网络接口)。下面分别介绍这些接口的功能和作用。

1.标准Java接口
java.net.*提供与联网有关的类,包括流、数据包套接字(socket)、Internet协议、常见Http处理等。比如:创建URL,以及URLConnection/HttpURLConnection对象、设置链接参数、链接到服务器、向服务器写数据、从服务器读取数据等通信。这些在Java网络编程中均有涉及,我们看一个简单的socket编程,实现服务器回发客户端信息。
服务端:

 1 public class Server implements Runnable{
 2     @Override
 3     public void run() {
 4         Socket socket = null;
 5         try {
 6             ServerSocket server = new ServerSocket(18888);
 7             //循环监听客户端链接请求
 8             while(true){
 9                 System.out.println("start...");
10                 //接收请求
11                 socket = server.accept();
12                 System.out.println("accept...");
13                 //接收客户端消息
14                 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
15                 String message = in.readLine();
16                 //发送消息,向客户端
17                 PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
18                 out.println("Server:" + message);
19                 //关闭流
20                 in.close();
21                 out.close();
22             }
23         } catch (IOException e) {
24             e.printStackTrace();
25         }finally{
26             if (null != socket){
27                 try {
28                     socket.close();
29                 } catch (IOException e) {
30                     e.printStackTrace();
31                 }
32             }
33         }
34
35     }
36     //启动服务器
37     public static void main(String[] args){
38         Thread server = new Thread(new Server());
39         server.start();
40     }
41 }  

客户端,MainActivity

 1 public class MainActivity extends Activity {
 2     private EditText editText;
 3     private Button button;
 4     /** Called when the activity is first created. */
 5     @Override
 6     public void onCreate(Bundle savedInstanceState) {
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.main);
 9
10         editText = (EditText)findViewById(R.id.editText1);
11         button = (Button)findViewById(R.id.button1);
12
13         button.setOnClickListener(new OnClickListener() {
14             @Override
15             public void onClick(View v) {
16                 Socket socket = null;
17                 String message = editText.getText().toString()+ "\r\n" ;
18                 try {
19                     //创建客户端socket,注意:不能用localhost或127.0.0.1,Android模拟器把自己作为localhost
20                     socket = new Socket("<span style="font-weight: bold;">10.0.2.2</span>",18888);
21                     PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter
22                             (socket.getOutputStream())),true);
23                     //发送数据
24                     out.println(message);
25
26                     //接收数据
27                     BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
28                     String msg = in.readLine();
29                     if (null != msg){
30                         editText.setText(msg);
31                         System.out.println(msg);
32                     }
33                     else{
34                         editText.setText("data error");
35                     }
36                     out.close();
37                     in.close();
38                 } catch (UnknownHostException e) {
39                     e.printStackTrace();
40                 } catch (IOException e) {
41                     e.printStackTrace();
42                 }
43                 finally{
44                     try {
45                         if (null != socket){
46                             socket.close();
47                         }
48                     } catch (IOException e) {
49                         e.printStackTrace();
50                     }
51                 }
52             }
53         });
54     }
55 }  

布局文件:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:orientation="vertical" android:layout_width="fill_parent"
 4     android:layout_height="fill_parent">
 5     <TextView android:layout_width="fill_parent"
 6         android:layout_height="wrap_content" android:text="@string/hello" />
 7     <EditText android:layout_width="match_parent" android:id="@+id/editText1"
 8         android:layout_height="wrap_content"
 9         android:hint="input the message and click the send button"
10         ></EditText>
11     <Button android:text="send" android:id="@+id/button1"
12         android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
13 </LinearLayout>  

启动服务器:

1 javac com/test/socket/Server.java
2 java com.test.socket.Server  

运行客户端程序:

结果如图:

注意:服务器与客户端无法链接的可能原因有:
没有加访问网络的权限:<uses-permission android:name="android.permission.INTERNET"></uses-permission>
IP地址要使用:10.0.2.2
模拟器不能配置代理。

2。Apache接口

对于大部分应用程序而言JDK本身提供的网络功能已远远不够,这时就需要Android提供的Apache HttpClient了。它是一个开源项目,功能更加完善,为客户端的Http编程提供高效、最新、功能丰富的工具包支持。
下面我们以一个简单例子来看看如何使用HttpClient在Android客户端访问Web。
首先,要在你的机器上搭建一个web应用myapp,只有很简单的一个http.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>  

然后实现Android客户端,分别以post、get方式去访问myapp,代码如下:
布局文件:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:orientation="vertical"
 4     android:layout_width="fill_parent"
 5     android:layout_height="fill_parent"
 6     >
 7 <TextView
 8     android:gravity="center"
 9     android:id="@+id/textView"
10     android:layout_width="fill_parent"
11     android:layout_height="wrap_content"
12     android:text="@string/hello"
13     />
14 <Button android:text="get" android:id="@+id/get" android:layout_width="match_parent" android:layout_height="wrap_content"></Button>
15 <Button android:text="post" android:id="@+id/post" android:layout_width="match_parent" android:layout_height="wrap_content"></Button>
16 </LinearLayout>  

资源文件:
strings.xml

1 <?xml version="1.0" encoding="utf-8"?>
2 <resources>
3     <string name="hello">通过按钮选择不同方式访问网页</string>
4     <string name="app_name">Http Get</string>
5 </resources>  

主Activity:

  1 public class MainActivity extends Activity {
  2     private TextView textView;
  3     private Button get,post;
  4     /** Called when the activity is first created. */
  5     @Override
  6     public void onCreate(Bundle savedInstanceState) {
  7         super.onCreate(savedInstanceState);
  8         setContentView(R.layout.main);
  9
 10         textView = (TextView)findViewById(R.id.textView);
 11         get = (Button)findViewById(R.id.get);
 12         post = (Button)findViewById(R.id.post);
 13
 14         //绑定按钮监听器
 15         get.setOnClickListener(new OnClickListener() {
 16             @Override
 17             public void onClick(View v) {
 18                 //注意:此处ip不能用127.0.0.1或localhost,Android模拟器已将它自己作为了localhost
 19                 String uri = "http://192.168.22.28:8080/myapp/http.jsp?parameter=以Get方式发送请求";
 20                 textView.setText(get(uri));
 21             }
 22         });
 23         //绑定按钮监听器
 24         post.setOnClickListener(new OnClickListener() {
 25             @Override
 26             public void onClick(View v) {
 27                 String uri = "http://192.168.22.28:8080/myapp/http.jsp";
 28                 textView.setText(post(uri));
 29             }
 30         });
 31     }
 32     /**
 33      * 以get方式发送请求,访问web
 34      * @param uri web地址
 35      * @return 响应数据
 36      */
 37     private static String get(String uri){
 38         BufferedReader reader = null;
 39         StringBuffer sb = null;
 40         String result = "";
 41         HttpClient client = new DefaultHttpClient();
 42         HttpGet request = new HttpGet(uri);
 43         try {
 44             //发送请求,得到响应
 45             HttpResponse response = client.execute(request);
 46
 47             //请求成功
 48             if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
 49                 reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
 50                 sb = new StringBuffer();
 51                 String line = "";
 52                 String NL = System.getProperty("line.separator");
 53                 while((line = reader.readLine()) != null){
 54                     sb.append(line);
 55                 }
 56             }
 57         } catch (ClientProtocolException e) {
 58             e.printStackTrace();
 59         } catch (IOException e) {
 60             e.printStackTrace();
 61         }
 62         finally{
 63             try {
 64                 if (null != reader){
 65                     reader.close();
 66                     reader = null;
 67                 }
 68             } catch (IOException e) {
 69                 e.printStackTrace();
 70             }
 71         }
 72         if (null != sb){
 73             result =  sb.toString();
 74         }
 75         return result;
 76     }
 77     /**
 78      * 以post方式发送请求,访问web
 79      * @param uri web地址
 80      * @return 响应数据
 81      */
 82     private static String post(String uri){
 83         BufferedReader reader = null;
 84         StringBuffer sb = null;
 85         String result = "";
 86         HttpClient client = new DefaultHttpClient();
 87         HttpPost request = new HttpPost(uri);
 88
 89         //保存要传递的参数
 90         List<NameValuePair> params = new ArrayList<NameValuePair>();
 91         //添加参数
 92         params.add(new BasicNameValuePair("parameter","以Post方式发送请求"));
 93
 94         try {
 95             //设置字符集
 96             HttpEntity entity = new UrlEncodedFormEntity(params,"utf-8");
 97             //请求对象
 98             request.setEntity(entity);
 99             //发送请求
100             HttpResponse response = client.execute(request);
101
102             //请求成功
103             if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
104                 System.out.println("post success");
105                 reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
106                 sb = new StringBuffer();
107                 String line = "";
108                 String NL = System.getProperty("line.separator");
109                 while((line = reader.readLine()) != null){
110                     sb.append(line);
111                 }
112             }
113         } catch (ClientProtocolException e) {
114             e.printStackTrace();
115         } catch (IOException e) {
116             e.printStackTrace();
117         }
118         finally{
119             try {
120                 //关闭流
121                 if (null != reader){
122                     reader.close();
123                     reader = null;
124                 }
125             } catch (IOException e) {
126                 e.printStackTrace();
127             }
128         }
129         if (null != sb){
130             result =  sb.toString();
131         }
132         return result;
133     }
134 }  

运行结果如下:

3.android.net编程:
常常使用此包下的类进行Android特有的网络编程,如:访问WiFi,访问Android联网信息,邮件等功能。这里不详细讲。

参考原文:http://blog.csdn.net/yuzhiboyi/article/details/7743390

时间: 2024-08-11 16:40:00

【Android笔记】Android的三种网络通信方式的相关文章

Android的三种网络通信方式

Android平台有三种网络接口可以使用,他们分别是:java.net.*(标准Java接口).Org.apache接口和Android.net.*(Android网络接口).下面分别介绍这些接口的功能和作用.1.标准Java接口java.net.*提供与联网有关的类,包括流.数据包套接字(socket).Internet协议.常见Http处理等.比如:创建URL,以及URLConnection/HttpURLConnection对象.设置链接参数.链接到服务器.向服务器写数据.从服务器读取数据

Android中常用的三种存储方法浅析

Android中常用的三种存储方法浅析 Android中数据存储有5种方式: [1]使用SharedPreferences存储数据 [2]文件存储数据 [3]SQLite数据库存储数据 [4]使用ContentProvider存储数据 [5]网络存储数据 在这里我只总结了三种我用到过的或即将可能用到的三种存储方法. 一.使用SharedPreferences存储数据 SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置信息比如窗口状态,它的本质是基

详解android解析Xml的三种方式——DOM、SAX以及XMLpull

今天学习了android解析Xml的三种方式——DOM.SAX以及XMLpull,这里对它们进行总结. 如果理解有误,欢迎指正   ^_* 一.DOM方式解析: xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据.这个写起来很简单,但是很消耗内存.要是数据过大,手机不够牛逼,可能手机直接死机. 常用的DoM接口和类: Document:该接口定义分析并创建DOM文档的一系列方法,它是文档树的根,是操作DOM的基础.Element:该接口继承Node接口,提供了获

【Android进度条】三种方式实现自定义圆形进度条ProgressBar

一.通过动画实现 定义res/anim/loading.xml如下: [html] view plaincopyprint? <?xml version="1.0" encoding="UTF-8"?> <animation-list android:oneshot="false" xmlns:android="http://schemas.android.com/apk/res/android"> &

Android处理XML的三种方式

http://www.cnblogs.com/zhangdongzi/archive/2011/04/14/2016434.html http://blog.csdn.net/zzp16/article/details/7795410 http://www.ibm.com/developerworks/cn/xml/x-android/ http://www.cnblogs.com/devinzhang/archive/2012/01/16/2323668.html http://mobile.

[Android] Android 定时任务实现的三种方法(以SeekBar的进度自动实现为例)

一.采用Handler与线程的sleep(long)方法 二.采用Handler与timer及TimerTask结合的方法 三.采用Handler的postDelayed(Runnable, long)方法  布局文件: activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.c

Android笔记——Android中数据的存储方式(二)

我们在实际开发中,有的时候需要储存或者备份比较复杂的数据.这些数据的特点是,内容多.结构大,比如短信备份等.我们知道SharedPreferences和Files(文本文件)储存这种数据会非常的没有效率.如果学过JavaWeb的朋友,首先可能想到的是数据库.当然了数据库是一个方案,那么是否还有其他的解决方案呢?今天我们在讲下Android笔记——Android中数据的存储方式(一) 提到的除了SharedPreferences和Files(文本文件)以外的其他几种数据储存方式:xml文件.SQL

虚拟主机中三种网络模式介绍

cocos2d-x升级到3.0后变化不小,除了API的变化(主要是函数和类名称变化,以及使用了C++11的不少特性,function/bind, lamda, std::thread-),创建和编译工程也做了一些简化调整.本文主要讨论一下cocos2d-x3.0 在android平台开发的环境设置及工程创建编译流程. 1.   初始设置 除了2.x所需要的python,jdk, android sdk和ndk之外,还需要部署apache-ant. 1)      在path中设置好java环境变

转载:android笔记--android中的多线程--Handler, Looper, MessageQueue, Message类

什么时候使用多线程: 1. 耗时操作使用多线程, 耗时操作放在UI线程中会导致用户的操作无法得到响应. 2. 阻塞操作使用多线程, 理由同上. 3. 多核CUP的设备使用多线程, 可以有效提高CPU的利用率. 4. 并行操作使用多线程. android中的多线程模型主要涉及的类有:Looper, Handler, MessageQueue, Message等. 一:Looper类: 1 static final ThreadLocal<Looper> sThreadLocal = new Th