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. public static void main(String[] args){
  37. Thread server = new Thread(new Server());
  38. server.start();
  39. }
  40. }

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

布局文件:

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

运行结果如下:

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

Android的三种网络通信方式的更多相关文章

  1. VMware的三种网络连接方式区别

    关于VMware的三种网络连接方式,NAT,Bridged,Host-Only ,在刚接触的时候通常会遇到主机Ping不通虚拟机而虚拟机能Ping得通主机:主机与虚拟机互不相通等等网络问题.本文就这三 ...

  2. 简单区分VMware的三种网络连接模式(bridged、NAT、host-only)

    艺搜简介 VMware在安装时默认安装了两块虚拟网卡,VMnet1和VMnet8,另外还有VMnet0.这些虚拟网卡的配置都是由Vmware虚拟机自动生成的,一般来说不需要用户自行设置. Vmware ...

  3. vmware虚拟机三种网络模式详解_转

    原文来自http://note.youdao.com/share/web/file.html?id=236896997b6ffbaa8e0d92eacd13abbf&type=note 由于L ...

  4. VMware虚拟系统 bridged、NAT、host-only三种网络连接模式

    目录 前言 bridged(桥接模式) NAT(网络地址转换模式) host-only(仅主机模式) 总结 前言 如果你想利用VMWare安装虚拟机,或想创建一个与网内其他机器相隔离的虚拟系统,进行特 ...

  5. Android动画 三种动画

    Android可以使用三种动画 Frame Animation-帧动画 ,就像GIF图片,通过一系列Drawable依次显示来模拟动画的效果 Tween Animation-补间动画,给出两个关键帧, ...

  6. Vmware虚拟机三种网络模式详解

    原文来自http://note.youdao.com/share/web/file.html?id=236896997b6ffbaa8e0d92eacd13abbf&type=note 我怕链 ...

  7. VMware三种网络模式

    VMware网络配置详解一:三种网络模式简介安装好虚拟机以后,在网络连接里面可以看到多了两块网卡: 其中VMnet1是虚拟机Host-only模式的网络接口,VMnet8是NAT模式的网络接口,这些后 ...

  8. Host Only、NAT和Bridge三种网络连接

    Host Only.NAT和Bridge三种网络连接 在安装好了Linux镜像之后,如何连接物理机和虚拟机呢?这就需要网络连接,网络连接有三种:HostOnly.NAT.Bridge,它们都可用于Gu ...

  9. vmware三种网络模式的工作原理及配置详解

    vmware为我们提供了三种网络工作模式,它们分别是:Bridged(桥接模式).NAT(网络地址转换模式).Host-Only(仅主机模式). 打开vmware虚拟机,我们可以在选项栏的“编辑”下的 ...

随机推荐

  1. 深入探析koa之中间件流程控制篇

    koa被认为是第二代web后端开发框架,相比于前代express而言,其最大的特色无疑就是解决了回调金字塔的问题,让异步的写法更加的简洁.在使用koa的过程中,其实一直比较好奇koa内部的实现机理.最 ...

  2. javascript笔记——jQuery插件开发的几种方式

    jQuery插件开发分为两种: 1 类级别  类级别你可以理解为拓展jquery类,最明显的例子是$.ajax(...),相当于静态方法. 开发扩展其方法时使用$.extend方法,即jQuery.e ...

  3. MySQL的 inner join on 与 left join on

    WHERE子句中使用的连接语句,在数据库语言中,被称为隐性连接.INNER JOIN……ON子句产生的连接称为显性连接. inner join:理解为“有效连接”,两张表中都有的数据才会显示left ...

  4. 《编写高质量代码-Web前端开发修改之道》笔记--第三章 高质量的HTML

    本章内容: 标签的语义 为什么要使用语义化标签 如何确定你的标签是否语义良好 常见模块你真的很了解吗 标签的语义 HTML标签的设计都是有语义考虑的,部分标签的中文翻译图示及本章内容参看:3.1 标签 ...

  5. php程序备份还原mysql数据库

    <?php $link = mysql_connect("localhost", "root",""); mysql_query(&q ...

  6. 全面理解BFC

    BFC 已经是一个耳听熟闻的词语了,网上有许多关于 BFC 的文章,介绍了如何触发 BFC 以及 BFC 的一些用处(如清浮动,防止 margin 重叠等).虽然我知道如何利用 BFC 解决这些问题, ...

  7. Pandas简易入门(四)

    本节主要介绍一下Pandas的另一个数据结构:DataFrame,本文的内容来源:https://www.dataquest.io/mission/147/pandas-internals-dataf ...

  8. apache-2.4.12之虚拟主机配置问题与觖决办法

    apache-2.4.12基于域名访问的多虚拟主机配置 原始配置: <VirtualHost *:80> ServerAdmin kk@etiantian.org DocumentRoot ...

  9. CentOS 下 Codeblocks 的 安装 + 汉化 以及 基本使用介绍

    Codeblocks 安装 注:在root用户下运行下列命令 1.安装gcc,需要c和c++两部分,默认安装下,CentOS不安装编译器的,在终端输入以下命令即可 yum install gcc yu ...

  10. Git之不明觉厉11-利其器source tree

    前面10篇文章都在用命令行,虽然装逼不错,但是我想说一句,平时我也是用source tree比较多点,命令行一般都是在source tree的图形按钮找不到在哪里,就直接用命令行.对于初次用git的同 ...