您现在的位置是:首页 > 正文

第十二章 Android网络应用

2024-04-01 02:29:19阅读 3

目录

1 基于TCP的网络通信

1.1 TCP基础

1.2 使用Socket进行通信

1.3 加入多线程

2 使用URI访问网络资源

2.1 使用URL读取网络资源

2.2 使用URL Connection提交请求

3 使用HTTP访问网络

4 使用Web Service进行网络编程

4.1 使用SOAP协议的Web Service

4.2 使用RESTful接口的Web Service


1 基于TCP的网络通信

1.1 TCP基础

TCP (Transmission Control Protocol) 是一种面向连接的、可靠的、基于字节流的传输层通信协议。这意味着在数据传输之前,需要先在两个通信实体之间建立一个连接。

1.2 使用Socket进行通信

在 Android 中,可以创建一个 TCP 客户端,连接到服务器,使用 Socket 对象与服务器进行通信。一个简单的创建 Socket 和发送数据到服务器的示例如下:

// 注意:网络操作应在非主线程中进行,这里只是简单示例
new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            // 创建 Socket
            Socket socket = new Socket("www.example.com", 80);
            // 获取输出流
            OutputStream os = socket.getOutputStream();
            // 写入数据
            os.write("Hello World".getBytes());
            os.flush();
            socket.shutdownOutput(); //关闭输出流
            // 关闭 Socket
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}).start();

1.3 加入多线程

为了防止阻塞 UI 线程,网络通信的代码应该在工作线程中运行。以上的代码就是在新的线程中执行的。

2 使用URI访问网络资源

2.1 使用URL读取网络资源

可以使用 java.net.URL 类来读取网络资源,例如:

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            // 创建URL对象
            URL url = new URL("https://www.example.com");
            // 打开连接并获取输入流
            InputStream in = url.openStream();
            int data = in.read();
            while (data != -1) {
                // 读取并处理数据
                data = in.read();
            }
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}).start();

2.2 使用URL Connection提交请求

可以使用 java.net.HttpURLConnection 类来发送 HTTP 请求,例如:

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            // 创建URL对象
            URL url = new URL("https://www.example.com");
            // 打开连接并获取HttpURLConnection对象
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            // 设置请求方式
            conn.setRequestMethod("GET");
            // 获取并处理响应码
            int responseCode = conn.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                // 请求成功,读取并处理响应数据
            }
            conn.disconnect();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}).start();

3 使用HTTP访问网络

除了使用 HttpURLConnection,你还可以使用更强大的第三方库,如 OkHttp,它提供了更简洁和高效的 API 来发送 HTTP 请求,例如:

OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
      .url("https://www.example.com")
      .build();

client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        e.printStackTrace();
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        if (response.isSuccessful()) {
            // 请求成功,读取并处理响应数据
        }
    }
});

4 使用Web Service进行网络编程

Web Service 是一种服务端应用程序,客户端可以通过 HTTP 或者 SOAP 等协议进行交互。你可以使用 SOAP 或 RESTful 接口调用 Web Service,但具体的代码实现取决于你的 Web Service 接口和你选择的库。

对于 Web Service,其主要有两种常用的实现形式:SOAP 和 RESTful。在 Android 中调用它们需要使用到一些库,因为 Android 平台没有提供官方的 SOAP 支持。

4.1 使用SOAP协议的Web Service

SOAP(Simple Object Access Protocol)是一种基于 XML 的协议,用于交换网络中的信息。在 Android 中,可以使用 kSOAP2 这个开源库来访问 SOAP Web Service。

以下是一个基础的代码示例:

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

            // 如果方法有参数,那么添加参数
            request.addProperty("paramKey", "paramValue");

            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            envelope.setOutputSoapObject(request);

            HttpTransportSE httpTransport = new HttpTransportSE(SERVICE_URL);
            httpTransport.call(SOAP_ACTION, envelope);

            SoapObject result = (SoapObject) envelope.bodyIn;

            // 在主线程更新 UI
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    // 处理返回的数据
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}).start();

注意,SOAP Web Service 的调用需要网络操作,应该在新的线程中进行。

4.2 使用RESTful接口的Web Service

RESTful 是一种常用的 Web Service 设计风格,你可以使用任何能发送 HTTP 请求的库来调用 RESTful 接口,如 HttpUrlConnection 或者 OkHttp。

以下是一个使用 OkHttp 的例子:

OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
        .url("https://api.example.com/users/1")
        .build();

client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        e.printStackTrace();
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        if (response.isSuccessful()) {
            // 你可以在这里处理返回的数据
            String responseData = response.body().string();
        }
    }
});

上述代码会发送一个 GET 请求到指定的 URL,并异步接收返回的数据。

这两个例子都是基础的用法,实际使用时可能需要添加更多的功能,如设置请求头,处理不同的 HTTP 状态码等。同时,网络请求可能会出现各种问题,所以实际的代码需要进行更多的错误处理。

网站文章

  • C++ 之类的封装

    C++ 之类的封装

    2024-04-01 02:29:11
  • mmcls中的配置文件继承

    mmcls中的配置文件继承

    mmcls的配置文件更改

    2024-04-01 02:28:32
  • 一文探究数据仓库体系(2.7万字建议收藏)

    https://mp.weixin.qq.com/s?__biz=MzI2MDQzOTk3MQ==&mid=2247485691&idx=1&sn=d6cb1353031e07e4b02cd903d8...

    2024-04-01 02:28:24
  • 打开命令提示符并进行编程

    这些只是一些常用的编程命令示例,命令提示符提供了更多的功能和命令,您可以根据自己的需求进行进一步的学习和探索。通过命令提示符进行编程操作可以提供更高的灵活性和控制力,尤其在自动化任务和批处理处理等方面...

    2024-04-01 02:28:17
  • SpringCloud(一)注册中心

    SpringCloud(一)注册中心

    SpringCloud注册中心

    2024-04-01 02:27:27
  • 【js前台获取服务器控件RadComboBox的值】

    【js前台获取服务器控件RadComboBox的值】

    js前台获取服务器控件 RadComboBox的选中项(文本和值)服务器控件<telerik:RadComboBox ID="ddlMine" AutoPostBack="true" Enabled=...

    2024-04-01 02:27:19
  • IDEA控制台中文乱码

    IDEA控制台中文乱码

    IDEA控制台中文乱码解决方案步骤:关键在第4部,传统的javaweb项目需要重点关注,进行修改。步骤1:检查IDEA的设置步骤2:设置VM参数[-Dfile.encoding=UTF-8]步骤3:IDEA的配置文件中设置参数步骤4:修改Tomcat的日志配置参数提示 :部分系统和软件设置编码为UTF-8任然无效的话,可以尝试将第二步以后的编码设置为GBK即可解决问题。...

    2024-04-01 02:27:12
  • 水晶报表VS2008使用

    两种模式:PUSH,PULL,简单的说就是将字段确定好,具体的见:http://wenku.baidu.com/link?url=a4UND7yk_-q3gJklb0tMUh2KNxmQEuZPYsMB7JEnw-9yylITD0vLxKBWbe7CuWqo1WOHhQi6-ybpIhNYLHHuDXy4j1lPDqSmTRcE2NYFASq讲的很好,先要保证数据库能连接。

    2024-04-01 02:26:31
  • Java02 变量和运算符

    Java02 变量和运算符

    Java代码的基本格式-变量和运算符

    2024-04-01 02:26:23
  • (译)Effective Kotlin系列之遇到多个构造器参数要考虑使用Builder(二)

    (译)Effective Kotlin系列之遇到多个构造器参数要考虑使用Builder(二)

    翻译说明: 原标题: Effective Java in Kotlin, item 2: Consider a builder when faced with many constructor par...

    2024-04-01 02:26:15