第十二章 Android网络应用

目录

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 状态码等。同时,网络请求可能会出现各种问题,所以实际的代码需要进行更多的错误处理。

猜你喜欢

转载自blog.csdn.net/m0_52537869/article/details/131238691