当前位置: 首页 > 知识库问答 >
问题:

在Grpc-Android Java中使用双向流时如何检测(物理)断开

符献
2023-03-14

我有使用双向流GRPC使用异步存根的概念。

@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);
    }
};

共有1个答案

子车心思
2023-03-14

TCP可能不会发现连接中断,这取决于服务器如何宕机和客户端正在做什么。您应该在ManagedChannelBuilder上启用KeepAliveTime()。Javadoc应该能让您入门,如果您感兴趣的话,8-client-side-keepalive.md有更多的信息。

您可能还希望启用idletimeout()

 类似资料:
  • 我正在使用Grpc的同步C++API通过双向流发送消息,该流需要无限期地保持开放。 我用以下命令启动服务器: 在Ubuntu 16.04 LTS上使用Grpc 1.10.0

  • 我想从React客户端向服务器发送文件。我知道为此,我应该使用grpc流媒体并将文件分割成块。所以,问题是如何将这些块发送到服务器?

  • 问题内容: 我知道我可以检查是否有鼠标左键 但是如何检查他们是否双击了?还有什么方法可以检查用户是否向前或向后移动了滚轮? 问题答案: 我从未使用过-但是: 检测双击: 猜测一下,而不是立即处理每次单击,而是施加50ms的延迟,然后查看您在该时间是否收到另一个单击事件。用户可能不会注意到50ms的延迟。 区分上/下滚轮: 请参阅此文档页面上的注释。显然,定义了五个按钮-左,中,右,上滚轮和下滚轮。

  • 在 Spark 流式处理中,如何检测空批次? 让我们以有状态流式处理字数为例:https://github.com/apache/spark/blob/master/examples/src/main/java/org/apache/spark/examples/streaming/JavaStatefulNetworkWordCount.java。是否可以仅在将新单词添加到流中时才打印字数RDD

  • 例如,我正在进行web自动化测试,假设我有两个非常基本的场景: 测试a)步骤1:将记录添加到数据库步骤2:检查网站是否正确显示记录 测试b)步骤1:在网站上编辑记录步骤2:检查记录是否正确保存在数据库中 根据记录,假设它是一个带有“值”的简单文本字段 因此,对于第一种情况,我将使用Assert equal: 但是,对于第二种情况,它将是: 所以基本上它们都做相同的事情,但都是相反的,为了在断言不正