谈谈Android的三种网络通信方式

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.java
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

内容如下:

<%@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;
  }
}

运行结果如下:

3.android.net编程:

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • android 网络编程之网络通信几种方式实例分享

    如今,手机应用渗透到各行各业,数量难以计数,其中大多数应用都会使用到网络,与服务器的交互势不可挡,那么android当中访问网络有哪些方式呢? 现在总结了六种方式: (1)针对TCP/IP的Socket.ServerSocket (2)针对UDP的DatagramSocket.DatagramPackage.这里需要注意的是,考虑到Android设备通常是手持终端,IP都是随着上网进行分配的.不是固定的.因此开发也是有一点与普通互联网应用有所差异的. (3)针对直接URL的HttpURLConn

  • Android网络通信的实现方式

    Android网络编程分为两种:基于http协议的,和基于socket的. 基于Http协议:HttpClient.HttpURLConnection.AsyncHttpClient框架等 基于Socket: (1)针对TCP/IP的Socket.ServerSocket (2)针对UDP/IP的DatagramSocket.DatagramPackage (3)Apache Mina框架 一.HttpURLConnection的实现方式 String response = null; Url

  • Android之网络通信案例分析

    由于一个项目的需要,我研究了一下android的网络通信方式,大体和java平台的很相似!  android平台也提供了很多的API供开发者使用,请按示例图:  首先,介绍一下通过http包工具进行通信,分get和post两种方式,两者的区别是: 1,post请求发送数据到服务器端,而且数据放在html header中一起发送到服务器url,数据对用户不可见,get请求是把参数值加到url的队列中,这在一定程度上,体现出post的安全性要比get高 2,get传送的数据量小,一般不能大于2kb,

  • 谈谈Android的三种网络通信方式

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

  • Android 打包三种方式实例详解

     Android 打包三种方式实例详解 前言: 现在市场上很多app应用存在于各个不同的渠道,大大小小几百个,当我们想要在发布应用之后统计各个渠道的用户下载量,我们就要进行多渠道打包. 01.应用的打包签名什么是打包? 打包就是根据签名和其他标识生成安装包. 签名是什么? 1.在android应用文件(apk)中保存的一个特别字符串 2.用来标识不同的应用开发者:开发者A,开发者B 3.一个应用开发者开发的多款应用使用同一个签名 就好比是一个人写文章,签名就相当于作者的署名. 如果两个应用都是一

  • Android 文件下载三种基本方式

    一.自己封装URLConnection 连接请求类 public void downloadFile1() { try{ //下载路径,如果路径无效了,可换成你的下载路径 String url = "http://c.qijingonline.com/test.mkv"; String path = Environment.getExternalStorageDirectory().getAbsolutePath(); final long startTime = System.cur

  • VMware WorkStation的三种网络连接方式详解

    一. 首先贴出本人在网络上找到与VMware网络连接相关的知识 安装完虚拟机后,默认安装了两个虚拟网卡,VMnet1和VMnet8,其他的未安装(当然也可以手动安装其他的).其中VMnet1是host网卡,用于host方式连接网络的.VMnet8是NAT网卡,用于NAT方式连接网络的.它们的IP地址是随机生成的,如果要用虚拟机做实验的话,最好将VMnet1到VMnet8的IP地址改掉.习惯上把VMware虚拟网卡使用的网段"固定",使用如下原则:VMnet1对应的网段是192.168.

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

    关于VMware的三种网络连接方式,NAT,Bridged,Host-Only ,在刚接触的时候通常会遇到主机Ping不通虚拟机而虚拟机能Ping得通主机:主机与虚拟机互不相通等等网络问题.本文就这三种连接方式作一一说明,也方便以后翻阅当参考用. 首先,要注意安装完VMware后,控制面板\网络和 Internet\网络连接会多出两块虚拟网卡VMnet1.VMnet2,两个网卡各有用途. 基本拓扑 NAT(网络地址转换) 依靠物理主机的VMnet8网卡上网.虚拟机可以互Ping通,前提是物理主机

  • Android 中三种启用线程的方法总结

    在多线程编程这块,我们经常要使用Handler(处理),Thread(线程)和Runnable这三个类,那么他们之间的关系你是否弄清楚了呢? 首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应. 而Runnable是一个接口,Thread是Runnable的子类.所以说,他俩都算一个进程. HandlerThread顾名思义就是可以处理消息循环的线程,他是一个拥有Looper的线程,可以处理消息循环

  • 深入解析docker三种网络模式

    目录 1.docker默认的三种网络模式: 2.桥接模式 3.host模式 4.none模式 1.docker默认的三种网络模式: bridge:桥接模式 host:主机模式 none:无网络模式 查看网络模式: docker network ls 2.桥接模式 简介:桥接模式是docker 的默认网络设置,当Docker服务启动时,会在主机上创建一个名为docker0的虚拟网桥,并选择一个和宿主机不同的IP地址和子网分配给docker0网桥 如下图所示:eno16777728是宿主机的网卡,1

  • VMware虚拟机三种网络模式区别

    我们知道VMware也分几种版本,普通用户最常用的就是Workstation,但是不管使用哪种版本,我们都能发现在安装过程中让我们选择 网络模式.在默认情况下会选中桥接模式,但有用户会问其他模式是干什么用的?有时候选择了其他模式之后就不能上网了.今天小编就和大家一起探讨一下 VMware 3种网络模式的功能和通信规则. 我们首先说一下VMware的几个虚拟设备 VMnet0:用于虚拟桥接网络下的虚拟交换机 VMnet1:用于虚拟Host-Only网络下的虚拟交换机 VMnet8:用于虚拟NAT网

  • Android三种网络通讯方式及Android的网络通讯机制

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

  • Android SDK三种更新失败及其解决方法

    最近在网上看Moto 360的图片,真是帅,帅了又帅,比帅更帅.所以想研究下Android wear. 更新Android SDK,居然失败了三次. 1.第一次失败 出现Failed to fetch URL错误提示 Failed to fetch URL https://dl-ssl.google.com/android/repository/repository-6.xml, reason: Connection to https://dl-ssl.google.com refused Fa

随机推荐