Как обнаружить (физическое) отключение при использовании двунаправленного потока в Grpc-Android Java - PullRequest
0 голосов
/ 11 сентября 2018

Я использую Bidirectional Streaming концепцию Grpc, используя Async stub.

Ниже приведен мой код

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btnOnline = (Button) findViewById(R.id.btnOnline);
    btnOffline = (Button) findViewById(R.id.btnOffline);
    btnAcceptRide = (Button) findViewById(R.id.btnAcceptRide);
    btnCancelRide = (Button) findViewById(R.id.btnCancelRide);
    txtCode = (EditText) findViewById(R.id.txtCode);
    txtReply = (TextView) findViewById(R.id.txtReply);
    ClientConnState = 0;
    btnOnline.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            new GrpcTask().execute();

        }
    });
  private class GrpcTask extends AsyncTask<Void, Void, String> {
    private String mHost;
    private String mMessage;
    private int mPort;
    private ManagedChannel mChannel;

    @Override
    protected void onPreExecute() {
        mHost = "localhost";
        mPort = 8080;
        mChannel = ManagedChannelBuilder.forAddress("192.168.0.102", 50049)
                .usePlaintext(true)
                .build();
        blockingStub = bidirectionalserviceGrpc.newBlockingStub(mChannel);
        asyncStub = bidirectionalserviceGrpc.newStub(mChannel);
    }

    @Override
    protected String doInBackground(Void... nothing) {
        try {
            final CountDownLatch countDownLatch = new CountDownLatch(1);
            requestStreamObserver = asyncStub.requestRide(new StreamObserver<Bidirectional.RideReply>() {
                @Override
                public void onNext(Bidirectional.RideReply value) {
                    if (countDownLatch.getCount() > 0) {
                        countDownLatch.countDown();
                    }                     
                }

                @Override
                public void onError(Throwable t) {
                    countDownLatch.countDown();
                }

                @Override
                public void onCompleted() {
                    countDownLatch.countDown();
                }
            });
            Bidirectional.RideRequest rideRequest = Bidirectional.RideRequest.newBuilder()
                    .setRequestid(1)
                    .setDrivercode(txtCode.getText().toString())
                    .build();
            requestStreamObserver.onNext(rideRequest);
            if (!countDownLatch.await(15, TimeUnit.SECONDS)) {
                throw new RuntimeException(
                        "Could not finish rpc within 1 minute, the server is likely down");
            }
            return "completed";
        } catch (Exception e) {
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            e.printStackTrace(pw);
            pw.flush();
            return "Failed... : " + System.lineSeparator() + sw;
        }
    }

    @Override
    protected void onPostExecute(String result) {
        Log.e(logger.getName(), result);
    }
}
  final Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        // Write Logic here
        super.handleMessage(msg);
    }
};

Теперь все работает отлично. Я могу пинг / понг сервера/ клиент, использующий поток, установлен.Но когда я выключаю сервер и делаю потоковый запрос от клиента, это ждет бесконечность.Я кроме этого, чтобы бросить событие OnError(), но это не так.

Может кто-нибудь помочь мне в этом вопросе?

1 Ответ

0 голосов
/ 11 сентября 2018

В зависимости от того, как сервер выходит из строя и что делает клиент, TCP может не обнаружить разрыв соединения.Вы должны включить keepAliveTime() на ManagedChannelBuilder.Javadoc должен помочь вам начать работу, и A8-client-side-keepalive.md имеет больше информации, если вам интересно.

Вы также можете включить idleTimeout().

...