gRPC-java - компиляция файла.proto

Я скомпилировал свой файл.proto, используя компилятор protobuf, и получил набор файлов Java. Я получил файл proto.java и файл.java для каждого элемента в файле.proto, включая тип сообщения и каждый вызов rpc, например publicKeyRequest.java и Quote.java, в качестве типа параметра rpc и request.

Это все файлы, которые необходимы, так как я все еще не могу получить какой-либо простой ответ от сервера.

Я хочу сгенерировать запрос для вызова rpc PublicKeyRequest, я сгенерировал объект запроса, но не знаю, как на самом деле отправить его через канал

Это полный файл.proto:

syntax = "proto3";

option java_multiple_files = true;
option java_package = "io.grpc.decryptiondevice";
option java_outer_classname = "DecryptionDeviceProto";

package decryptiondevice;

service DecryptionDevice {

// Decryption Request RPC
//
// Request contains ciphertext and proof
// Returns the plaintext record
rpc DecryptRecord(DecryptionRequest) returns (Record) {}


// Get Signed Root Tree Hash RPC
//
// Caller provides a nonce
// Returns a signed RTH and nonce
rpc GetRootTreeHash(RootTreeHashRequest) returns (RootTreeHash) {}


// Get Public key RPC
//
// Returns a Remote attestation report containing the public key as user        data
   rpc GetPublicKey(PublicKeyRequest) returns (Quote) {}
}


// Decryption Request
// - Byte array containing ciphertext
// - Proofs represented as JSON trees
message DecryptionRequest {
    bytes ciphertext        = 1;
    string proofOfPresence  = 2;
    string proofOfExtension = 3;
}
// A plaintext record
message Record {
    bytes plaintext = 1;
}



// RTH request contains
// - A random nonce 
message RootTreeHashRequest {
    bytes nonce = 1;
}
// Root Tree Hash
// Random nonce used as message ID
// Signature over rth and nonce
message RootTreeHash {
    bytes rth   = 1;
    bytes nonce = 2;
    bytes sig   = 3;
}



// Public key request message
message PublicKeyRequest {
    bytes nonce = 1;
}
// Attestation Quote, containing the public key
message Quote {
    string quote = 1; //some format.. to be defined later
    //PEM formatted key 
    bytes RSA_EncryptionKey = 2;
    bytes RSA_VerificationKey = 3;
}

И это код, который я пытаюсь запустить на стороне клиента:

public static void main(String[] args) {

DeviceClient client = new DeviceClient("localhost", 50051);
MannagedChanel channel = ManagedChannelBuilder.forAddress("localhost", 50051).usePlaintext(true);

ByteString nonce = ByteString.copyFromUtf8("someRandomString");
PublicKeyRequest keyRequest = PublicKeyRequest.newBuilder().setNonce(nonce).build();

//here I want to send this to the server
ByteString response = DecryptionDeviceProto.getKey(keyRequest, channel);//this line is not even close to being valid, but this is the sort thing I wish to achieve

Sys.out.println(response);
}

Извиняюсь, если это очень неправильно, я новичок в gRPC. Несколько замечаний об этой системе:

  • Клиент и сервер уже написаны на ходу, которые были протестированы и работают с этим же файлом.proto.
  • Я пытаюсь переписать клиент в Java для связи с тем же сервером.

Любая помощь будет оценена. Спасибо

1 ответ

Существует два набора файлов, которые необходимо сгенерировать: Java Protobuf и Java gRPC. Насколько мне известно, для всех языков, кроме Go, это два отдельных этапа генерации (которые можно объединить в один protoc вызов, но они концептуально разделены).

Кажется, вы генерируете код Java Protobuf, но не код Java gRPC. Вам нужно использовать protoc-gen-grpc-java вставить в protoc, Если вы используете Maven или Gradle, прочитайте README от grpc-java. Если вы запускаете Protoc вручную, вы можете загрузить готовый двоичный файл из Maven Central и увидеть ответ на аналогичный вопрос.

Другие вопросы по тегам