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

gRPC服务器端半关闭是否应隐式终止客户端?

左丘耀
2023-03-14

在http p2-spec中,服务器半关闭流(服务器发送了http.END_STREAM),客户端仍然允许发送数据(因为它是半关闭的)。

考虑下面的GRPC场景:

  • 客户端打开bidi-stream到服务器并开始发送数据
  • 服务器关闭响应流并发送状态预告片(转换为发送http.END_STREAM)
  • 客户端继续发送数据

gRPC中是否定义了语义?

可能的方式:

  • 遵循http2规范:允许客户端继续发送服务器处理的数据
  • 不遵循http2规范:如果服务器关闭流,客户端连接将隐式终止

注意:我刚刚测试过,看起来gRPC for Java遵循的是变体“不遵循http2规范”,即如果服务器关闭向下的流,则向上的流也会关闭。

共有1个答案

桂志诚
2023-03-14

在gRPC的语义中,当服务器发送状态时,意味着整个调用已完成。根据HTTP/2 RFC第8.1节的这一部分,除了在HTTP/2协议级别发送RST_流以关闭两个方向的流之外,官方服务器还发送RST_流

如果响应不依赖于请求中尚未发送和接收的任何部分,服务器可以在客户端发送整个请求之前发送完整的响应。如果是这样,服务器可能会请求客户端在发送完整的响应(即带有END_STREAM标志的帧)后,通过发送错误代码NO_ERRORRST_STREAM来无错误地中止请求的传输。

当服务器不这样做时,gRPC协议不会禁止客户端在收到状态后发送更多数据,但服务器不会处理,因此没有理由这样做。因此,当官方GRPC客户端接收到状态时,他们认为呼叫完成并停止发送数据。

 类似资料:
  • 将grpc定义的服务视为: 并利用客户端连接到此服务类似于: 如果我们要在一个单独的线程中生成调用,那么处理终止一个永远运行、我们不想再使用的grpc连接的正确方法是什么?是否有任何连接或流控制方法可以调用?

  • 问题内容: 我在两个Java应用程序之间建立了一个套接字TCP连接。当一侧关闭插槽时,另一侧保持打开状态。但我希望将其关闭。而且我也迫不及待想看看它是否可用,然后关闭它。我想要某种方式从一侧完全关闭它。我能做什么? 问题答案: TCP不能像这样工作。操作系统将不会释放资源,即文件描述符以及端口,直到应用程序显式关闭套接字或死掉,即使TCP堆栈知道另一端已将其关闭。从对等方收到FIN后,从内核到用户

  • 我对gRpc很陌生,已经开始探索它们的基础知识(在C语言中)。我想获得有关如何发送心跳以检查客户端/服务器是否仍处于连接状态以及在断开连接时采取恢复措施的指导。任何示例或参考任何文档/文章都将有助于我开始学习。谢谢

  • 我正在开发一个非常简单的Java客户机/服务器系统(只是为了让我的脚沾满套接字)。由于某种原因,我一直收到“套接字已关闭”错误。。。这是我的密码。。 服务器文件 客户端文件 我在客户端的第41行得到了错误,然后在第46行得到了NullPointerException。。 提前感谢您的帮助。我只是想在这里学习。

  • 下面的代码片段显示了如何在gRPC AspNet核心应用程序中启用gRPC web: 客户端应用程序的代码如下所示: