Kapitel 12 Android-Netzwerkanwendung

Inhaltsverzeichnis

1 TCP-basierte Netzwerkkommunikation

1.1 TCP-Grundlagen

1.2 Kommunikation über Socket

1.3 Multithreading hinzufügen

2 Verwenden Sie URI, um auf Netzwerkressourcen zuzugreifen

2.1 Verwenden Sie die URL, um Netzwerkressourcen zu lesen

2.2 Senden Sie eine Anfrage über die URL-Verbindung

3 Verwenden Sie HTTP, um auf das Netzwerk zuzugreifen

4 Netzwerkprogrammierung mit Web Service

4.1 Webdienst mit SOAP-Protokoll

4.2 Webdienst mit RESTful-Schnittstelle


1 TCP-basierte Netzwerkkommunikation

1.1 TCP-Grundlagen

TCP (Transmission Control Protocol) ist ein verbindungsorientiertes, zuverlässiges, Bytestrom-basiertes Transportschicht-Kommunikationsprotokoll. Das heißt, bevor Daten übertragen werden können, muss eine Verbindung zwischen den beiden kommunizierenden Einheiten hergestellt werden.

1.2 Kommunikation über Socket

In Android können Sie einen TCP-Client erstellen, eine Verbindung zum Server herstellen und das Socket-Objekt für die Kommunikation mit dem Server verwenden. Ein einfaches Beispiel für die Erstellung eines Sockets und das Senden von Daten an den Server ist wie folgt:

// 注意:网络操作应在非主线程中进行,这里只是简单示例
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 Multithreading hinzufügen

Um ein Blockieren des UI-Threads zu verhindern, sollte Code für die Netzwerkkommunikation in einem Arbeitsthread ausgeführt werden. Der obige Code wird in einem neuen Thread ausgeführt.

2 Verwenden Sie URI, um auf Netzwerkressourcen zuzugreifen

2.1 Verwenden Sie die URL, um Netzwerkressourcen zu lesen

Mit der Klasse können Sie java.net.URLbeispielsweise Netzwerkressourcen lesen:

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 Senden Sie eine Anfrage über die URL-Verbindung

Mit der Klasse können Sie java.net.HttpURLConnectionbeispielsweise HTTP-Anfragen senden:

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 Verwenden Sie HTTP, um auf das Netzwerk zuzugreifen

Zusätzlich zur Verwendung von HttpURLConnection können Sie auch eine leistungsfähigere Bibliothek eines Drittanbieters wie OkHttp verwenden, die eine präzisere und effizientere API zum Senden von HTTP-Anfragen bereitstellt, zum Beispiel:

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 Netzwerkprogrammierung mit Web Service

Web Service ist ein serverseitiges Anwendungsprogramm, und Clients können über Protokolle wie HTTP oder SOAP interagieren. Sie können die SOAP- oder RESTful-Schnittstelle verwenden, um den Webdienst aufzurufen. Die spezifische Codeimplementierung hängt jedoch von Ihrer Webdienstschnittstelle und der von Ihnen ausgewählten Bibliothek ab.

Für Webdienste gibt es hauptsächlich zwei häufig verwendete Implementierungsformen: SOAP und RESTful. Der Aufruf in Android erfordert die Verwendung einiger Bibliotheken, da die Android-Plattform keine offizielle SOAP-Unterstützung bietet.

4.1 Webdienst mit SOAP-Protokoll

SOAP (Simple Object Access Protocol) ist ein XML-basiertes Protokoll zum Austausch von Informationen im Netzwerk. In Android können Sie die Open-Source-Bibliothek kSOAP2 verwenden, um auf den SOAP-Webdienst zuzugreifen.

Hier ist ein einfaches Codebeispiel:

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();

Beachten Sie, dass Aufrufe von SOAP-Webdiensten Netzwerkvorgänge erfordern und in einem neuen Thread ausgeführt werden sollten.

4.2 Webdienst mit RESTful-Schnittstelle

RESTful ist ein gängiger Designstil für Webdienste. Sie können jede Bibliothek verwenden, die HTTP-Anforderungen senden kann, um die RESTful-Schnittstelle aufzurufen, z. B. HttpUrlConnection oder OkHttp.

Hier ist ein Beispiel mit 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();
        }
    }
});

Der obige Code sendet eine GET-Anfrage an die angegebene URL und empfängt die zurückgegebenen Daten asynchron.

Bei diesen beiden Beispielen handelt es sich um grundlegende Verwendungsbeispiele. Bei der tatsächlichen Verwendung müssen möglicherweise weitere Funktionen hinzugefügt werden, z. B. das Festlegen von Anforderungsheadern, die Verarbeitung verschiedener HTTP-Statuscodes usw. Gleichzeitig können bei Netzwerkanforderungen verschiedene Probleme auftreten, sodass der eigentliche Code mehr Fehlerbehandlung durchführen muss.

Guess you like

Origin blog.csdn.net/m0_52537869/article/details/131238691