Grpc-将消息从一个客户端发送到连接到同一服务器的另一客户端

时间:2019-08-30 05:02:51

标签: c# server client message grpc

是否可以将消息从一个客户端发送到连接到同一服务器的另一个客户端?

我想将数据从一个客户端发送到服务器,然后发送到特定客户端。我想我需要获取客户端ID,但我不知道如何获取此ID以及如何从服务器向该客户端发送此消息。

2 个答案:

答案 0 :(得分:2)

我在这里有一个样品。这是一个聊天服务器-客户端应用程序。多个客户端可以连接到服务器。当客户端编写一条消息时,服务器仅向接收服务器流RPC的所有客户端广播该消息。

https://github.com/cactuaroid/GrpcWpfSample

请参阅这些服务器端实现。客户端调用Subscribe()时,它将等待m_chatService.Added事件。客户端调用Write()时,它将引发事件,并且事件参数ChatLog写入responseStream上。

https://github.com/cactuaroid/GrpcWpfSample/blob/f6e8c4b2493c23cdcbaffeca29b5bb6705fbe95c/GrpcWpfSample.Server/Grpc/ChatServiceGrpcServer.cs https://github.com/cactuaroid/GrpcWpfSample/blob/f6e8c4b2493c23cdcbaffeca29b5bb6705fbe95c/GrpcWpfSample.Server/Model/ChatService.cs

您可以添加逻辑,例如指定要订阅/写入的频道名称,或定义客户端第一次调用的OpenChannel(字符串密码),以便服务器可以将客户端IP地址绑定到频道,无论您如何喜欢。

答案 1 :(得分:1)

没有任何特殊的gRPC功能可以使您做到这一点(所有RPC都在服务器和客户端之间,没有“广播”或“选择性广播”功能可以连接到连接到同一服务器的其他客户端。 / p>

您想要的逻辑肯定可以实现,但是这种解决方案的细节取决于您的需要。可能有效的幼稚方法是这个:

  • 每个客户端向服务器打开一个双向出价调用
  • 服务器保留已连接客户端的目录
  • 一旦服务器从客户端接收到一条消息,它将根据目录选择应转发到的客户端。
  • 服务器将邮件转发给客户端。

不用说,此设置感觉有点复杂(您基本上是在gRPC之上实现自己的网络协议),因此即使这可能是您正确的选择,但考虑一下还是有道理的如何简化协议,以便可以使用gRPC直接支持的功能。