gpt4 book ai didi

android - Java gRPC 服务器流模型

转载 作者:行者123 更新时间:2023-12-05 00:18:59 27 4
gpt4 key购买 nike

我通过以下示例寻找一个带有客户端监听器的示例,用于服务器端流式传输 - https://grpc.io/docs/languages/java/basics/
我已经按照文档 - https://github.com/grpc/grpc/blob/master/doc/keepalive.md 在客户端和服务器上配置了保活配置
所有示例都表明,当向服务器发出请求时,服务器将以异步或一元模型响应,或者客户端可以与新请求聊天。每次请求都必须发送到服务器进行响应。 Connection 的存活时间要长得多;这很好。
问题:客户端是否可以在不使用 BIDI(双向)模型的情况下发送一个请求并无限期地接收来自服务器的响应?在这种情况下,它会有点基于事件,只要服务器上有可用数据,它将继续发送而不需要进一步的请求。同样,这种通信是单播,而不是广播;这意味着每个连接(用户)都是唯一的,可以根据用户的数据做出响应。
不确定,但一种方法可能是 - 服务器保持请求对象在某处的缓存中处于 Activity 状态并保持响应?客户端是否必须使用轮询循环来无限期地监听响应?
期待可以解决此问题的示例。

最佳答案

一个客户端请求和许多服务器响应是“服务器流式传输”。您将使用 stream关键字仅用于响应。
您可以将阻塞或异步 API 用于服务器流式 RPC。示例中使用了阻塞 API,因为阻塞操作通常更加清晰。但是也可以使用异步 stub 。
对于服务器流,异步客户端 API 让您传递请求和响应观察者以启动调用。之后,它看起来与bidi 示例相同,只是客户端不再发送任何消息。服务端可以在需要发送消息时调用 StreamObserver,当有新消息到达时会调用客户端的 StreamObserver。
要查看示例,您可以替换 the blocking stub of listFeatures() 使用异步 stub :

final CountDownLatch finishLatch = new CountDownLatch(1);
asyncStub.listFeatures(request, new StreamObserver<Feature>() {
int i;

@Override public void onNext(Feature feature) {
info("Result #" + i + ": {0}", feature);
if (testHelper != null) {
testHelper.onMessage(feature);
}
i++;
}

@Override public void onCompleted() {
finishLatch.countDown();
}

@Override public void onError(Throwable t) {
warning("RPC failed: {0}", Status.fromThrowable(t));
if (testHelper != null) {
testHelper.onRpcError(t);
}
finishLatch.countDown();
}
});
finishLatch.await();

关于android - Java gRPC 服务器流模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65138037/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com