当前位置: 移动技术网 > 移动技术>移动开发>Android > 谈谈Android的三种网络通信方式

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

2019年07月24日  | 移动技术网移动技术  | 我要评论

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联网信息,邮件等功能。这里不详细讲。

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网