栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

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

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap

谈谈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; 
   
  @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()+ "rn" ; 
 try { 
   //创建客户端socket,注意:不能用localhost或127.0.0.1,Android模拟器把自己作为localhost 
   socket = new Socket("10.0.2.2",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(); 
   } 
 } 
      } 
    }); 
  } 
} 

布局文件:

 
 
   
   
   
 

启动服务器:

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

运行客户端程序:

结果如图:

注意:服务器与客户端无法链接的可能原因有:

没有加访问网络的权限:

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"%> 
 
 
 
Http Test 
 
 
 
<% 
String type = request.getParameter("parameter"); 
String result = new String(type.getBytes("iso-8859-1"),"utf-8"); 
out.println("" + result + ""); 
%> 
 
 

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

布局文件:

 
 
 
 
 
 

资源文件:

strings.xml

 
 
  通过按钮选择不同方式访问网页 
  Http Get 
 

主Activity:

public class MainActivity extends Activity { 
  private TextView textView; 
  private Button get,post; 
   
  @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)); 
      } 
    }); 
  } 
   
  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; 
  } 
   
  private static String post(String uri){ 
    BufferedReader reader = null; 
    StringBuffer sb = null; 
    String result = ""; 
    HttpClient client = new DefaultHttpClient(); 
    HttpPost request = new HttpPost(uri); 
     
    //保存要传递的参数 
    List params = new ArrayList(); 
    //添加参数 
    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联网信息,邮件等功能。这里不详细讲。

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/160311.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号