转自http://blog.csdn.net/yuzhiboyi/article/details/7743390

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

public class Server implements Runnable{    @Override    public void run() {        Socket socket = null;        try {            ServerSocket server = new ServerSocket(18888);            //循环监听客户端链接请求            while(true){                System.out.println("start...");                //接收请求                socket = server.accept();                System.out.println("accept...");                //接收客户端消息                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));                String message = in.readLine();                //发送消息,向客户端                PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);                out.println("Server:" + message);                //关闭流                in.close();                out.close();            }        } catch (IOException e) {            e.printStackTrace();        }finally{            if (null != socket){                try {                    socket.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }            }    //启动服务器    public static void main(String[] args){        Thread server = new Thread(new Server());        server.start();    }}

客户端,MainActivity

public class MainActivity extends Activity {    private EditText editText;    private Button button;    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                editText = (EditText)findViewById(R.id.editText1);        button = (Button)findViewById(R.id.button1);                button.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                Socket socket = null;                String message = editText.getText().toString()+ "\r\n" ;                try {                    //创建客户端socket,注意:不能用localhost或127.0.0.1,Android模拟器把自己作为localhost                    socket = new Socket("<span style="font-weight: bold;">10.0.2.2</span>",18888);                    PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter                            (socket.getOutputStream())),true);                    //发送数据                    out.println(message);                                        //接收数据                    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));                    String msg = in.readLine();                    if (null != msg){                        editText.setText(msg);                        System.out.println(msg);                    }                    else{                        editText.setText("data error");                    }                    out.close();                    in.close();                } catch (UnknownHostException e) {                    e.printStackTrace();                } catch (IOException e) {                    e.printStackTrace();                }                finally{                    try {                        if (null != socket){                            socket.close();                        }                    } catch (IOException e) {                        e.printStackTrace();                    }                }            }        });    }}

布局文件:

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

启动服务器:

javac com/test/socket/Server.javajava com.test.socket.Server

运行客户端程序:

结果如图:

Android的三种网络通信方式

注意:服务器与客户端无法链接的可能原因有:
没有加访问网络的权限:<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
内容如下:

<%@page language="java" import="java.util.*" pageEncoding="utf-8"%><html><head><title>Http Test</title></head><body><%String type = request.getParameter("parameter");String result = new String(type.getBytes("iso-8859-1"),"utf-8");out.println("<h1>" + result + "</h1>");%></body></html>

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

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    ><TextView    android:gravity="center"    android:id="@+id/textView"      android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:text="@string/hello"    /><Button android:text="get" android:id="@+id/get" android:layout_width="match_parent" android:layout_height="wrap_content"></Button><Button android:text="post" android:id="@+id/post" android:layout_width="match_parent" android:layout_height="wrap_content"></Button></LinearLayout>

资源文件:
strings.xml

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

主Activity:

public class MainActivity extends Activity {    private TextView textView;    private Button get,post;    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                textView = (TextView)findViewById(R.id.textView);        get = (Button)findViewById(R.id.get);        post = (Button)findViewById(R.id.post);                //绑定按钮监听器        get.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                //注意:此处ip不能用127.0.0.1或localhost,Android模拟器已将它自己作为了localhost                String uri = "http://192.168.22.28:8080/myapp/http.jsp?parameter=以Get方式发送请求";                textView.setText(get(uri));            }        });        //绑定按钮监听器        post.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                String uri = "http://192.168.22.28:8080/myapp/http.jsp";                textView.setText(post(uri));            }        });    }    /**     * 以get方式发送请求,访问web     * @param uri web地址     * @return 响应数据     */    private static String get(String uri){        BufferedReader reader = null;        StringBuffer sb = null;        String result = "";        HttpClient client = new DefaultHttpClient();        HttpGet request = new HttpGet(uri);        try {            //发送请求,得到响应            HttpResponse response = client.execute(request);                        //请求成功            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){                reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));                sb = new StringBuffer();                String line = "";                String NL = System.getProperty("line.separator");                while((line = reader.readLine()) != null){                    sb.append(line);                }            }        } catch (ClientProtocolException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        finally{            try {                if (null != reader){                    reader.close();                    reader = null;                }            } catch (IOException e) {                e.printStackTrace();            }        }        if (null != sb){            result =  sb.toString();        }        return result;    }    /**     * 以post方式发送请求,访问web     * @param uri web地址     * @return 响应数据     */    private static String post(String uri){        BufferedReader reader = null;        StringBuffer sb = null;        String result = "";        HttpClient client = new DefaultHttpClient();        HttpPost request = new HttpPost(uri);                //保存要传递的参数        List<NameValuePair> params = new ArrayList<NameValuePair>();        //添加参数        params.add(new BasicNameValuePair("parameter","以Post方式发送请求"));                try {            //设置字符集            HttpEntity entity = new UrlEncodedFormEntity(params,"utf-8");            //请求对象            request.setEntity(entity);            //发送请求            HttpResponse response = client.execute(request);                        //请求成功            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){                System.out.println("post success");                reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));                sb = new StringBuffer();                String line = "";                String NL = System.getProperty("line.separator");                while((line = reader.readLine()) != null){                    sb.append(line);                }            }        } catch (ClientProtocolException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        finally{            try {                //关闭流                if (null != reader){                    reader.close();                    reader = null;                }            } catch (IOException e) {                e.printStackTrace();            }        }        if (null != sb){            result =  sb.toString();        }        return result;    }}

运行结果如下:

Android的三种网络通信方式

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

更多相关文章

  1. android存取数据方式:文件、SharedPreferences
  2. Android解析XML文件的三种方式
  3. android5中数据存储方式详解
  4. 利用半透明对话框实现新浪微博android客户端首次运行时的提示界
  5. Android 4.0 SDK的离线方式安装
  6. Android 关于WebView加载完成的多种监听方式
  7. android 4种存储方式
  8. Android中的四种启动方式

随机推荐

  1. Android(安卓)直接顯示 Emoji 圖案
  2. Android通知系统源码解析
  3. 《Android(安卓)Dev Guide》系列教程8:用
  4. 003.android资源文件剖析(Resources)
  5. Mac修改环境变量路径中带空格的处理
  6. Android系统架构-[Android取经之路]
  7. 开源android平板开发所需的软硬件知识
  8. android 通信开发要用的文档
  9. Android命名规范,开发规范,注意点整理(一)
  10. Android(安卓)编译命令及选项(转)