Как видите, я пытаюсь вернуть поток сообщений с сервера grp c, но я получаю только одно сообщение назад. Я очень хорошо знаю это, поэтому не знаю, что я делаю. Любая помощь приветствуется. Прежде всего, это мой файл прото:
syntax = "proto3";
package CarParkOperations;
option java_package = "CarParkOperations.proto.cp";
option java_multiple_files = true;
option java_outer_classname = "ClassName";
service carParkService{
rpc showStatus(carparkRequest) returns (carParkResponse) {};
rpc setFull(CarParkToUpdateRequest) returns (carParkResponse){};
rpc setSpaces(CarParkToUpdateRequest) returns (carParkResponse){};
rpc allCarParks(allCarp) returns (stream carParkResponse){};
}
message CarPark{
int32 carPark_id = 1;
string status =2;
string location =3;
}
message carparkRequest{
int32 carPark_id = 1;
}
message CarParkToUpdateRequest {
int32 device_id = 1;
}
message allCarp{
string status = 1;
}
message carParkResponse{
CarPark carPark =1;
}
Все методы делают то, что они должны делать, но метод allCarParks rp c. Это метод в клиенте, который я использую для allCarParks:
public void allCarParks(String status) {
channel =ManagedChannelBuilder.forAddress("localhost", 3000)
// Channels are secure by default (via SSL/TLS). For the example we disable TLS to avoid
// needing certificates.
.usePlaintext()
.build();
blockingStub = carParkServiceGrpc.newBlockingStub(channel);
asyncStub = carParkServiceGrpc.newStub(channel);
logger.info("Will try to get CarPark " + status + " ...");
allCarp request = allCarp.newBuilder().setStatus(status).build();
Iterator<carParkResponse> response;
try {
response = blockingStub.allCarParks(request);
for (int i = 1; response.hasNext(); i++) {
carParkResponse cParkResponse = response.next();
allCarsArea.append(i + cParkResponse.getCarPark().toString());
}
}catch(StatusRuntimeException e) {
logger.log(Level.WARNING, "RPC failed: {0}", e.getStatus());
return;
}
}
Пользователь должен ввести «статус» в текстовое поле, которое должно быть заполнено или заполнено пробелами. И затем ответьте, например, если пользователь наберет Full, он получит поток всех парковок, которые заполнены. Это метод на сервере:
public void allCarParks(allCarp rAllCarp, StreamObserver<carParkResponse> rStreamObserver) {
ArrayList<CarParkOperations.proto.cp.CarPark> carList = Car.getInstance();
for(CarParkOperations.proto.cp.CarPark c : carList) {
if(c.getStatus() == rAllCarp.getStatus()) {
continue;
}
carParkResponse response = carParkResponse.newBuilder().setCarPark(c).build();
rStreamObserver.onNext(response);
}
}
В конце концов, это класс автомобиля, в котором я храню объект carPark:
package CarParkOperations.proto.cp;
import java.util.ArrayList;
import com.google.rpc.Status;
public class Car extends ArrayList<CarPark>{
public static Car carparkCar;
public static Car getInstance() {
if(carparkCar == null) {
carparkCar = new Car();
}
return carparkCar;
}
public Car() {
this.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(1).setStatus("Full").setLocation("Behind Building 1").build());
this.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(2).setStatus("Full").setLocation("Behind Building 1").build());
this.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(3).setStatus("Full").setLocation("Behind Building 4").build());
this.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(4).setStatus("Full").setLocation("Behind Building 3").build());
this.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(5).setStatus("Full").setLocation("Behind Building 2").build());
this.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(6).setStatus("Full").setLocation("Behind Building 1").build());
this.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(7).setStatus("Full").setLocation("Behind Building 1").build());
this.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(8).setStatus("Full").setLocation("Behind Building 6").build());
this.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(8).setStatus("Full").setLocation("Behind Building 1").build());
this.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(8).setStatus("Spaces").setLocation("Behind Building 1").build());
this.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(8).setStatus("Spaces").setLocation("Behind Building 1").build());
this.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(8).setStatus("Spaces").setLocation("Behind Building 1").build());
}
}
Как я уже говорил, все остальные методы работает нормально, поэтому я знаю, что это связано только с методами allCarParks, которые я создал. Это, наверное, очень очевидно, но я не могу этого увидеть. Я хочу, чтобы пользователь набрал Full в текстовое поле и получил все объекты парковки со статусом Full. Кроме того, allCarsArea именно там, где я отображаю данные. это JTextArea. Какие-либо предложения?