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

Grpc - send message from one client to another client that is connected to the same server

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

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

没有允许您执行此操作的特殊 gRPC 功能(所有 RPC 都在服务器和客户端之间,没有 "broadcast" 或 "selective broadcast" 功能可以联系到连接到的其他客户端同一个服务器。

你想要的逻辑是肯定可以实现的,但是这种解决方案的细节取决于你的需要。一种可能有效的天真方法是例如这个:

  • 每个客户端打开对服务器的双向流式传输调用
  • 服务器保存已连接客户端的目录
  • 一旦服务器收到来自客户端的消息,它会根据目录选择应该转发给哪个客户端。
  • 服务器将消息转发给客户端。

不用说这个设置感觉有点复杂(你基本上是在 gRPC 之上实现你自己的网络协议),所以即使这对你来说可能是正确的,但它是有意义的考虑如何简化协议,以便您可以使用 gRPC 直接支持的功能。

我这里有一个样本。这是一个聊天服务器-客户端应用程序。多个客户端可以连接到服务器。当客户端写入消息时,服务器会简单地向所有正在接收服务器流 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

你可以在subscribe/write中添加指定频道名称等逻辑,或者定义客户端第一次调用的OpenChannel(string password),以便服务器将客户端IP地址绑定到频道,随心所欲