[JAVA] Überprüfen Sie die Kommunikation von Android zum node.js-Server mit Protokollpuffern

Umgebung

Android Seite

Serverseite

Dinge die zu tun sind

Kommunizieren Sie mit dem Server über das Protobuf-Gradle-Plugin Überprüfen Sie, ob Sie unter Android serialisieren und deserialisieren und mit dem Server kommunizieren können

[Verfahren zur Klassengenerierung](http://qiita.com/natsuki_summer/items/987f230ec90d231a623c#%E3%82%AF%E3%83%A9%E3%82%B9%E7%94%9F%E6%88%90 % E6% 89% 8B% E9% A0% 86) usw. sind dieselben wie im vorherigen Artikel, daher werden sie weggelassen.

Wenn Sie nur Android und Node haben, sollten Sie in der Lage sein, ohne den obigen Protoc-Befehl auszuführen

Referenz

Fast so wie es ist http://qiita.com/trairia/items/45488e9eee197d58ed7d offiziell https://github.com/google/protobuf-gradle-plugin

.proto Datei

Der Inhalt war in Ordnung, also ist es der gleiche wie zuvor

search_request.proto



syntax = "proto3";

package test;

message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
}

Beschreibung für Protokollpuffer zu build.gradle des Android-Projekts hinzugefügt, das Sie verwenden möchten

build.gradle



buildscript {
    repositories {
        //...
        mavenCentral()
    }
    dependencies {
        //...
        classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.1'
    }
}

//...

app/build.gradle



apply plugin: 'com.android.application'
apply plugin: 'com.google.protobuf'

android {
    //Kürzung
}
//Protobuf-Plug-In-Einstellungen
protobuf {
    //Protokolleinstellungen
    protoc {
        artifact = "com.google.protobuf:protoc:3.0.0"
    }
    //Verwenden Sie das Javalite-Plug-In
    plugins {
        lite {
            artifact = "com.google.protobuf:protoc-gen-javalite:3.0.0"
        }
    }
    //Aufgabenbezogen
    generateProtoTasks {
        all().each { task ->
            task.plugins {
                lite {}
            }
        }
    }
}

dependencies {
    //...
    compile 'com.google.protobuf:protobuf-lite:3.0.0'
    compile 'com.squareup.okhttp:okhttp:2.7.5'
}

Fügen Sie die .proto-Datei zu {project} / app / src / main / proto / hinzu

app/src/main
 ├proto
 │   └search_request.proto
 └java
    └com/example/testapp
        └MainActivity.java

Führen Sie einfach die oben genannten Schritte aus, und die SearchRequestOuterClass.SearchRequest-Klasse wird automatisch im Paket generiert, und Sie sollten über die Java-Datei Ihres Projekts darauf zugreifen können. Beim Erstellen eines Objekts sieht es wie folgt aus

SearchRequestOuterClass.SearchRequest.newBuilder()
                .setQuery("xxxx")
                .setPageNumber(1)
                .setResultPerPage(1)
                .build();

Kommunikation mit OKHttp getestet Richten Sie einen lokalen Server mit node.js ein und senden Sie serialisierte Daten sowie serielle Daten auf der Serverseite als Antwort. Bestätigen Sie die gegenseitige Kommunikation, Serialisierung und Deserialisierung

Client-Seite

Das Kommunikationsziel ist http://127.0.0.1:3000/. Wenn Sie jedoch beispielsweise einen Knotenserver auf einem lokalen PC einrichten und mit dem tatsächlichen Android darauf zugreifen, müssen Sie den Teil von "127.0.0.1" neu schreiben und mit demselben WLAN verbinden Bitte machen Sie es zu einer zugänglichen IP, die Sie von ifconfig usw. auf der Mac-Seite erhalten

MainActivity.java


public class MainActivity extends AppCompatActivity {
    private String TAG = getClass().getName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new AsyncTask<Void, Void, Void>(){
            @Override
            protected Void doInBackground(Void... params) {
                request();
                return null;
            }
        }.execute();

    }
    //Angemessene Datengenerierung
    public static SearchRequestOuterClass.SearchRequest getData(){
        return SearchRequestOuterClass.SearchRequest.newBuilder()
                .setQuery("huga")
                .setPageNumber(1)
                .setResultPerPage(1)
                .build();
    }

    private void request(){
        postBinary("http://127.0.0.1:3000/", new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {
                Log.d(TAG, "request --- onFailure:"+e);
            }

            @Override
            public void onResponse(Response response) throws IOException {
                Log.d(TAG, "request --- onResponse:"+response);
                SearchRequestOuterClass.SearchRequest data = SearchRequestOuterClass.SearchRequest.parseFrom(response.body().bytes());
                Log.d(TAG, "response --- data.getQuery:"+data.getQuery());
            }
        });
    }

    private void postBinary(String url, final Callback callback){
        OkHttpClient client = new OkHttpClient();
        Request.Builder builder = new Request.Builder();
        builder.url(url).post(RequestBody.create(MediaType.parse("application/octet-stream"), getData().toByteArray()));
        Request request = builder.build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Request call, IOException e){
                Log.d(TAG, "onFailure --- e:"+e);
                if(callback != null) callback.onFailure(call, e);
            }

            @Override
            public void onResponse(Response response) throws IOException {

                if(callback != null) callback.onResponse(response);
            }
        });
    }
}

Serverseite

server.js



var fs = require('fs')
var protobuf = require('protocol-buffers')
var messages = protobuf(fs.readFileSync('search_request.proto'))
//Angemessene Nachrichtengenerierung
var buf = messages.SearchRequest.encode({
  query: "hoge",
  page_number: 1234
})

require('connect')().use(function(req, res, next) {
	next();
}).use(function(req, res) {
	//Serialisieren Sie Anforderungen von Android Java
	var body = [];
	req.on('data', function (data) {
		// body +=data;
		body.push(data);
	});
	req.on('end',function(){
		var buf = Buffer.concat( body );

		try {
			console.log(body);
			console.log(buf);
			var obj = messages.SearchRequest.decode(buf)
			console.log(obj)
		} catch (e) {
			console.log(e)
		}
		res.writeHead(200, {'Content-Type': 'application/octet-stream'});
		//Antwortnachricht
		res.write(buf, 'binary');
		res.end();
	});
  }).listen(3000);

Starten Sie den Server (er läuft mit Ctl + C ab, führen Sie ihn also beim Starten auf der iOS-Seite aus).

node server.js

Anders als beim Empfang von server.js von Objective-C ist die Deserialisierung fehlgeschlagen, es sei denn, es wird ein Byte geschrieben, das an var body = []; Bestätigt, dass es auch von Objective-C mit dem obigen Code empfangen werden kann

das ist alles

Recommended Posts

Überprüfen Sie die Kommunikation von Android zum node.js-Server mit Protokollpuffern
[Android] Hochladen von Bildern vom Terminal auf den Server
Android: Umgang mit "Java-Version von '10 .0.1 'konnte nicht ermittelt werden"
Ich habe versucht, den Betrieb des gRPC-Servers mit grpcurl zu überprüfen
Protokoll-Puffer-Migration von 2.x auf 3.x.
Stoppen Sie das erneute Senden vom Client zum Server
Führen Sie node.js von Android Java aus (Verarbeitung)
Stellen Sie mit dem iPhone eine Verbindung zum Rails-Server her
Aktualisieren Sie MySQL mit Docker von 5.7 auf 8.0
So überprüfen Sie, bevor Sie mit Spring Integration eine Nachricht an den Server senden
Finden Sie Raspberry Pi von Android mit mDNS
Erste Schritte mit dem Language Server Protocol mit LSP4J