iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >谈谈Android的三种网络通信方式
  • 908
分享到

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

通信方式通信Android 2022-06-06 04:06:58 908人浏览 八月长安
摘要

Android平台有三种网络接口可以使用,他们分别是:java.net.*(标准Java接口)、Org.apache接口和Android.net.*(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()+ "\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; 
   
  @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<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联网信息,邮件等功能。这里不详细讲。

您可能感兴趣的文章:Android网络通信的实现方式android 网络编程之网络通信几种方式实例分享Android之网络通信案例分析


--结束END--

本文标题: 谈谈Android的三种网络通信方式

本文链接: https://www.lsjlt.com/news/22717.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 网络通信的三种方式
    “全局模式” 通常指网络代理的一种工作模式,即将所有网络连接都通过代理服务器进行转发,而不管这些连接是否需要被代理。在全局模式下,所有的流量都会被代理服务器拦截和转发,因此可以实现对所有网络请求的监控...
    99+
    2023-10-07
    网络 服务器 java
  • 浅谈PostgreSQL表分区的三种方式
    目录一、简介二、三种方式2.1、Range范围分区2.2、List列表分区2.3、Hash哈希分区三、总结一、简介 表分区是解决一些因单表过大引用的性能问题的方式,比如某张表过大就会...
    99+
    2024-04-02
  • 浅谈Flutter解析JSON三种方式
    Dart实体类格式 class CategoryMo { String name; int count; CategoryMo({this.name, this.cou...
    99+
    2024-04-02
  • 浅谈Java线程间通信方式
    目录1.volatile和synchronized关键字2.等待/通知机制3.管道输入/输出流4.join()方法5.ThreadLocal()方法总结线程间通信方式有两种:共享内存...
    99+
    2024-04-02
  • 怎样简谈Kafka中的NIO网络通信模型
    这篇文章将为大家详细讲解有关怎样简谈Kafka中的NIO网络通信模型,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。摘要:很多人喜欢把RocketMQ与Kafka做对比,其实这两款消息队列的网...
    99+
    2023-06-02
  • 浅谈Spring解决循环依赖的三种方式
    引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错。下面说一下Spring是如果解决循环依赖的。第一种:构造器参数循环依赖表示通过构造器注入构成的...
    99+
    2023-05-30
    spring 循环 依赖
  • 浅谈Java 三种方式实现接口校验
    本文介绍了Java 三种方式实现接口校验,主要包括AOP,MVC拦截器,分享给大家,具体如下:方法一:AOP代码如下定义一个权限注解package com.thinkgem.jeesite.common.annotation; impor...
    99+
    2023-05-30
    java 接口 校验
  • 浅谈Java生成唯一标识码的三种方式
    目录前言正文UUID实现唯一标识码SnowFlake实现唯一标识码通过时间工具生成带有业务标示的唯一标识码前言 我们经常会遇到这样的场景,需要生成一个唯一的序列号来表明某一个数据的唯...
    99+
    2024-04-02
  • 浅谈Java实现分布式事务的三种方案
    目录一、问题描述二、分布式事务2.1、什么是分布式系统2.2、什么是事务2.3、什么是本地事务2.4、什么是分布式事务三、如何进行分布式事务控制3.1、CAP理论3.2、分布式系统如...
    99+
    2024-04-02
  • 浅谈Qt信号与槽的各种连接方式
    目录简介 连接信号槽 connect 函数的第五个参数 信号与槽的连接方式 简介 信号槽是 Qt 框架引以为豪的机制之一。当用户触发某个事件时,就会发出一个信号(signal),这...
    99+
    2024-04-02
  • 浅谈QT打包的两种方式
    目录QT打包的两种方式具体步骤QT打包的两种方式 一个是QT5自带的windeployqt(不需要下载安装),它可以找到程序(exe)用到的所有库文件,并且都拷贝到exe程序的当前文...
    99+
    2023-03-10
    QT打包
  • 浅谈MyBatis执行SQL的两种方式
    目录前言准备接口和Mapper配置文件:使用SqlSession 发送 SQL使用 Mapper 接口发送 SQL比较两种发送 SQL 方式前言 本文介绍MyBatis执行SQL语句...
    99+
    2024-04-02
  • 浅谈Java字符串比较的三种方法
    目录java字符串如何进行比较?1.通过使用 equals() 方法2.通过使用 == 运算符3.通过使用 compareTo() 方法java字符串如何进行比较? 我们可以根据内容...
    99+
    2023-05-14
    Java字符串 Java字符串比较
  • 浅谈SpringBoot @Autowired的两种注入方式
    Autowired有两种注入方式 by type by name 默认使用的是byType的方式向Bean里面注入相应的Bean。例如: @Autowire...
    99+
    2024-04-02
  • android json的三种方式
    在Android中,可以使用以下三种方式来处理JSON数据:1. 使用原生的JSONObject和JSONArray类:Androi...
    99+
    2023-08-29
    android
  • 浅谈Spring的两种事务定义方式
    一、声明式这种方法不需要对原有的业务做任何修改,通过在XML文件中定义需要拦截方法的匹配即可完成配置,要求是,业务处理中的方法的命名要有规律,比如setXxx,xxxUpdate等等。详细配置如下:<bean id="transact...
    99+
    2023-05-31
    spring 事务 定义
  • 浅谈react路由传参的几种方式
    第一种传参方式,动态路由传参 通过设置link的path属性,进行路由的传参,当点击link标签的时候,会在上方的url地址中显示传递的整个url <Link to='/...
    99+
    2024-04-02
  • 浅谈go中cgo的几种使用方式
    目录最简单的CGO程序源码方式调用C函数内部机制编译和链接参数编译参数:CFLAGS/CPPFLAGS/CXXFLAGS链接参数:LDFLAGS通过静态库的方式调用C函数通过动态库的...
    99+
    2024-04-02
  • 浅谈JavaScript的几种继承实现方式
    目录当前需求: 实现 Student 继承自 Person构造函数Person构造函数Student希望满足的条件功能利用原形链实现方法的继承方式1: 子类原型指向父类原型方式2 子...
    99+
    2023-05-17
    JavaScrip 继承
  • Vue组件通信传递数据的三种方式
    目录Vue传值传递数据的三种方式方式一方式二方式三Vue传值 Vue.js是一个组件化的前端开发框架,支持父子组件之间的消息传递和数据通信。子组件向父组件传递消息的过程称为&ldqu...
    99+
    2023-05-17
    Vue组件通信几种方式 Vue组件通信实现
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作