繁体   English   中英

服务器到客户端通信 gRpc

[英]Server to client communication gRpc

我在试图找到解决方案时遇到了一些麻烦,想知道是否有人可以指出我正确的方向。

我正在实现一个系统,其中多个客户端使用 gRpc 与服务器进行通信。 服务是用 golang 编写的,客户端是用 C 编写的。

我试图找出如何最好地处理从服务器到客户端的通信。

到目前为止,我考虑过的选项是:

  1. 在每个客户端上设置一个服务器
    • 考虑到可能有多个客户端从一个外部 ip 运行,我不确定是否可以创建一个客户端来监听公共 ip、本地 ip 和端口的组合?
  2. 使用双向流
    • 这似乎是上面的错误应用程序,您是否必须生成一个新进程来保持打开连接?
  3. 在 gRpc 服务旁边打开一个 websocket
    • 我觉得这不是正确的解决方案,但似乎是 3 个中最简单的

我也不完全相信在 C 中实现上述每一项所需的工作,因为 C 中似乎没有包含很多辅助功能

更新:

所以我使用go客户端+服务器实现了一个解决方案。 利用双向 rpc 流,

服务器

  • 为每个连接的客户端创建一个 chan 并将其存储在服务的地图中
  • 在流方法中运行一个 for
    • 检查 chan 是否有任何消息并调用 stream.sen
    • 如果 stream.Context().Err() 删除客户端 chan

客户

  • 为从流方法返回的消息创建一个通道
  • 在流服务上启动一个 goroutine 调用 stream.Recv

这是保持连接对连接的客户端开放的合理方法吗?

关于您的选择:

  1. 在每个客户端上设置一个服务器

我不知道你的用例,但通常你不能要求或保证用户可以打开侦听器。 正常的方式是客户端连接到服务器并保持通道打开。

  1. 使用双向流

gRPC可用作流接收服务器端事件 (SSE)。 所以这可能是一个不错的选择。 https://docs.servicestack.net/server-events-grpc#streamserverevents

这是保持连接对连接的客户端开放的合理方法吗?

我看不出这种方法有什么问题。

  1. 在 gRpc 服务旁边打开一个 websocket

到目前为止,我不知道通过 WebSocket 以外的 http 协议来通信事件的更好解决方案。 它很容易实现,有一个基于事件的成熟API,支持文本和二进制数据。 从开发的角度来看,您只需要担心wswss协议的特定反向代理规则。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM