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

Java gRPC:从客户端到服务器的异常

万俟旭
2023-03-14

有可能从客户端向服务器抛出异常吗?我们有一个从服务器到客户端的开放流:

rpc addStream(Request) returns (stream StreamMessage) {}     

当我尝试这样的事情时:

throw Status.INTERNAL.withDescription(e.getMessage()).withCause(e.getCause()).asRuntimeException();

我在客户端的StreamObserver.on错误中获得了异常,但在服务器端没有异常。

共有1个答案

鄢禄
2023-03-14

服务器可以用存根应用编程接口公开的“状态”来响应。然而,客户端只能“取消”RPC。服务器不知道取消的来源;可能是因为客户端取消了,也可能是传输控制协议中断了。

在客户端流式或双流式调用中,客户端可以通过调用observer.onError()来取消(而不必调用onFuleted())。但是,如果客户端调用了onFuleted()或者RPC有一个一元请求,那么您需要使用ClientCallStream观察者Context

java prettyprint-override">stub.someRpc(request, new ClientResponseObserver<Request, Response>() {
  private ClientCallStreamObserver<Request> requestStream;

  @Override public void beforeStart(ClientCallStreamObserver<Request> requestStream) {
    this.requestStream = requestStream;
  }
  ...
});

// And then where you want to cancel

// RequestStream is non-thread-safe. For unary requests, wait until
// stub.someRpc() returns, since it uses the stream internally.
// The string is not sent to the server. It is just "echoed"
// back to the client's `onError()` to make clear that the
// cancellation was locally caused.
requestStream.cancel("some message for yourself", null);


// For thread-safe cancellation (e.g., for client-streaming)
CancellableContext ctx = Context.current().withCancellation();
StreamObserver requestObserver = ctx.call(() ->
  stub.someRpc(new StreamObserver<Response>() {
    @Override public void onCompleted() {
      // The ctx must be closed when done, to avoid leaks
      ctx.cancel(null);
    }

    @Override public void onError() {
      ctx.cancel(null);
    }
  }));

// The place you want to cancel
ctx.cancel(ex);
 类似资料:
  • 我正在创建我的产品,并与这个问题。有一天,我设置了Socket.io,一切都很好。第二天,我将服务器和客户端从http迁移到HTTPS。迁移后客户端和服务器端仍然连接,但不能从客户端发射到服务器,从服务器发射到客户端。 我的ssl证书位于和中,它们加载正确。运行在上的服务器 我的示例react组件。我的react应用程序运行在上。HTTPS连接良好,工作良好。 我该怎么办?也许我在中错误地使用了s

  • 我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下: 我在服务器上制作了一个中央服务器插座,所有应用程序都可以连接到该插座。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。每个客户端都会创建一个新的ServerSocket,所有客户端都可以连接到它。 换句话说:每个客户端都有一个Se

  • 问题内容: 首先,我将请求的文件从服务器发送到客户端,然后再将文件的计算出的sha从服务器发送到客户端,以便客户端可以检查发送文件和接收文件中的sha是相同的。 我设法发送了文件,但是当我尝试也发送sha(这是一个变量)时,我收到一个错误消息(我相信sha也已添加到文件内容中) 如何分别发送? 和客户: 问题答案: 您应该重新设计应用程序的工作方式: 首先,服务器将文件大小发送给客户端 客户端读取

  • 我正在尝试使用hazelcast v3。2.4(服务器和客户端上的版本相同)。服务器(我可以安装的简单实现)正在服务器上运行。客户端尝试连接到远程服务器-服务器打印身份验证请求,但我收到以下日志输出(包括异常)-关于我可以做什么不同的想法(复制日志输出和配置文件)。我正在尝试通过TCP/IP进行连接,我检查了网络连接——我没有看到任何东西阻止连接。 堆栈中提到的代码行: 配置 日志输出 服务器输出

  • 我正在学习系统如何将数百万个连接扩展到一个盒子。 通过早期的一套学习TCP 3路握手,NIO接受连接的方式。我运行了多个测试(简单的客户端-服务器代码),并一直遵循计数器- 在服务器上成功接受的次数() 在客户端成功打开()的次数,即成功计数 在客户端,成功的总和很重要 Ex:要启动的连接数N=10_000 场景1:(没有被服务器拒绝的连接,即在调用opne()时客户端没有引发异常) 服务器成功计