Я пытаюсь реализовать клиент и сервер, используя grp c. Когда я отправляю запрос на сервер, я получаю ответ, но когда я пытаюсь отправить другой запрос, приложение останавливается или просто постоянно говорит, что ищет запрашиваемый товар. Я очень новичок в этом, поэтому не знаю, что происходит. это методы, которые я реализовал на своем сервере:
package CarParkOperations.proto.cp;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Logger;
import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.stub.StreamObserver;
import java.util.Collection;
public class CarParkService extends carParkServiceGrpc.carParkServiceImplBase{
private static final Logger logger = Logger.getLogger(CarParkService.class.getName());
private Server server;
private void start() throws IOException {
/* The port on which the server should run */
int port = 3000;
server = ServerBuilder.forPort(port)
.addService(new CarParkService())
.build()
.start();
logger.info("Server started, listening on " + port);
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.err.println("*** shutting down gRPC server since JVM is shutting down");
CarParkService.this.stop();
System.err.println("*** server shut down");
}
});
}
private void stop() {
if (server != null) {
server.shutdown();
}
}
/**
* Await termination on the main thread since the grpc library uses daemon threads.
*/
private void blockUntilShutdown() throws InterruptedException {
if (server != null) {
server.awaitTermination();
}
}
/**
* Main launches the server from the command line.
*/
public static void main(String[] args) throws IOException, InterruptedException {
final CarParkService server = new CarParkService();
server.start();
server.blockUntilShutdown();
}
public void showStatus(carparkRequest request, StreamObserver<carParkResponse> rStreamObserver) {
for(CarParkOperations.proto.cp.CarPark c : Car.getInstance()) {
if(c.getCarParkId() == request.getCarParkId()) {
carParkResponse response = carParkResponse.newBuilder().setCarPark(c).build();
rStreamObserver.onNext(response);
rStreamObserver.onCompleted();
return;
}
}
}
@Override
public void allCarParks(allCarp rAllCarp, StreamObserver<carParkResponse> rStreamObserver) {
ArrayList<CarParkOperations.proto.cp.CarPark> carList = Car.getInstance();
for (CarParkOperations.proto.cp.CarPark car : Car.carparkCar) {
carParkResponse response = carParkResponse.newBuilder().setCarPark(car).build();
if(car.getStatus() == rAllCarp.getStatus()) {
rStreamObserver.onNext(response);
}
}
rStreamObserver.onCompleted();
}
public void setFull(CarParkToUpdateRequest request, StreamObserver<carParkResponse> rStreamObserver) {
ArrayList<CarParkOperations.proto.cp.CarPark> carList = Car.getInstance();
for(CarParkOperations.proto.cp.CarPark c : carList) {
if(c.getCarParkId() == request.getDeviceId()) {
Car.carparkCar.clear();
Car.carparkCar.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(c.getCarParkId()).setLocation(c.getLocation()).setStatus("Full").build());
for(CarParkOperations.proto.cp.CarPark car : Car.carparkCar) {
carParkResponse response = carParkResponse.newBuilder().setCarPark(car).build();
rStreamObserver.onNext(response);
rStreamObserver.onCompleted();
return;
}
}
}
}
public void setSpaces(CarParkToUpdateRequest request, StreamObserver<carParkResponse> rStreamObserver) {
ArrayList<CarParkOperations.proto.cp.CarPark> carList = Car.getInstance();
for(CarParkOperations.proto.cp.CarPark c : carList) {
if(c.getCarParkId() == request.getDeviceId()) {
Car.carparkCar.clear();
Car.carparkCar.add(CarParkOperations.proto.cp.CarPark.newBuilder().setCarParkId(c.getCarParkId()).setLocation(c.getLocation()).setStatus("Spaces").build());
for(CarParkOperations.proto.cp.CarPark car : Car.carparkCar) {
carParkResponse response = carParkResponse.newBuilder().setCarPark(car).build();
rStreamObserver.onNext(response);
rStreamObserver.onCompleted();
return;
}
}
}
}
}
Это методы, которые я реализовал на своем клиенте:
public void showStatus(int id) {
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 " + id + " ...");
carparkRequest request = carparkRequest.newBuilder().setCarParkId(id).build();
carParkResponse response;
try {
response = blockingStub.showStatus(request);
}catch(StatusRuntimeException e) {
logger.log(Level.WARNING, "RPC failed: {0}", e.getStatus());
return;
}finally {
channel.shutdown();
}
logger.info("Carpark: " + response.getCarPark());
statusArea.append(response.getCarPark().toString());
}
public void setFull(int id) {
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 " + id + " ...");
CarParkToUpdateRequest request = CarParkToUpdateRequest.newBuilder().setDeviceId(id).build();
carParkResponse response;
try {
response = blockingStub.setFull(request);
}catch(StatusRuntimeException e) {
logger.log(Level.WARNING, "RPC failed: {0}", e.getStatus());
return;
}finally {
channel.shutdown();
}
logger.info("Carpark: " + response.getCarPark());
fullArea.append(response.getCarPark().toString());
}
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> carResponse;
try {
carResponse = blockingStub.allCarParks(request);
for (int i = 1; carResponse.hasNext(); i++) {
carParkResponse carResponse1 = carResponse.next();
info("Result #" + i + ": {0}", carResponse1);
if (testHelper != null) {
testHelper.onMessage(carResponse1);
}
}
} catch(StatusRuntimeException e) {
logger.log(Level.WARNING, "RPC failed: {0}", e.getStatus());
return;
}
}
public void setSpaces(int id) {
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 " + id + " ...");
CarParkToUpdateRequest request = CarParkToUpdateRequest.newBuilder().setDeviceId(id).build();
carParkResponse response;
try {
response = blockingStub.setSpaces(request);
}catch(StatusRuntimeException e) {
logger.log(Level.WARNING, "RPC failed: {0}", e.getStatus());
return;
}finally {
channel.shutdown();
}
logger.info("Carpark: " + response.getCarPark());
spacesArea.append(response.getCarPark().toString());
}
И это файл протока:
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, но это отдельная проблема), но при попытке сделать другой запрос застревает. Я могу отправить второй ответ нечетное время, но это так. Я просто хочу знать, где я иду не так. Любая помощь приветствуется.