Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
服务器到客户端通信gRpc_C_Http_Go_Websocket_Grpc - Fatal编程技术网

服务器到客户端通信gRpc

服务器到客户端通信gRpc,c,http,go,websocket,grpc,C,Http,Go,Websocket,Grpc,我在试图找到解决方案时遇到了一些困难,不知道是否有人能为我指明正确的方向 我正在实现一个系统,其中多个客户端使用gRpc与服务器通信。 服务是用golang编写的,客户端是用C编写的 我正试图找出如何最好地处理从服务器到客户端的通信 到目前为止,我考虑的方案有: 在每个客户端上设置一台服务器 考虑到可能有多个客户端从一个外部ip运行,我不确定是否有可能创建一个监听公共ip、本地ip和端口组合的客户端 使用 这似乎是上述错误的应用程序,您是否需要生成一个新进程来保持打开的连接 打开gRpc

我在试图找到解决方案时遇到了一些困难,不知道是否有人能为我指明正确的方向

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

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

到目前为止,我考虑的方案有:

  • 在每个客户端上设置一台服务器
    • 考虑到可能有多个客户端从一个外部ip运行,我不确定是否有可能创建一个监听公共ip、本地ip和端口组合的客户端
  • 使用
    • 这似乎是上述错误的应用程序,您是否需要生成一个新进程来保持打开的连接
  • 打开gRpc服务旁边的websocket
    • 我觉得这不是正确的解决方案,但似乎是3个方案中最简单的
  • 对于在C中实现上述每一项所需的工作,我也不是完全有信心,因为C中似乎没有包含很多帮助器功能

    更新: 因此,我使用go客户端+服务器实现了一个解决方案。利用双向rpc流

    服务器
    • 为连接的每个客户端创建一个chan,并将其存储在服务的映射中
    • 在stream方法中为
      • 检查chan是否有任何消息,然后致电stream.sen
      • 删除客户端chan if stream.Context().Err()
    客户
    • 为从stream方法返回的消息创建一个通道
    • 在流服务上启动调用stream.Recv的goroutine
    这是保持连接对连接的客户端开放的合理方法吗

    关于您的选择:

  • 在每个客户端上设置一个服务器
  • 我不知道您的用例,但通常您不能要求或保证用户可以打开侦听器。通常的方法是客户端连接到服务器并保持通道打开

  • 使用双向流
  • gRPC
    可用作接收服务器端事件(SSE)的流媒体。所以这是一个很好的选择。

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

    我看不出这种方法有什么错

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