Android Seite
Serverseite
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
Fast so wie es ist http://qiita.com/trairia/items/45488e9eee197d58ed7d offiziell https://github.com/google/protobuf-gradle-plugin
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
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);
}
});
}
}
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