public override async Task chat(IAsyncStreamReader <ChatMessage> requestStream, IServerStreamWriter <ChatMessageFromServer> responseStream, ServerCallContext context) { // Keep track of connected clients responseStreams.Add(responseStream); while (await requestStream.MoveNext(CancellationToken.None)) { // Get the client message from the request stream var messageFromClient = requestStream.Current; // Create a server message that wraps the client message var message = new ChatMessageFromServer { Message = messageFromClient }; // Send to connected clients foreach (var stream in responseStreams) { await stream.WriteAsync(message); } } }
public override async Task chat( IAsyncStreamReader <ChatMessage> requestStream, IServerStreamWriter <ChatMessageFromServer> responseStream, ServerCallContext context) { long id = ++_id; WriteLine($"New streaming request [{_id}]:"); s_responseStreams.TryAdd(id, responseStream); try { while (await requestStream.MoveNext(CancellationToken.None)) { // Get the client message from the request stream var messageFromClient = requestStream.Current; WriteLine($"Received new request [{_id}]: {messageFromClient.From}"); // Create a server message that wraps the client message var message = new ChatMessageFromServer { Message = messageFromClient }; foreach (var streamKvp in s_responseStreams) { try { // Send to connected clients await streamKvp.Value.WriteAsync(message); } catch (RpcException ex) { // TODO: remove the key from list. WriteLine($"Write error [{streamKvp.Key}]: {ex}"); } } } } finally { WriteLine($"Exit streaming request [{_id}]:"); IServerStreamWriter <ChatMessageFromServer> dummy; s_responseStreams.TryRemove(id, out dummy); } }
public override async Task Chat(IAsyncStreamReader <ChatMessage> requestStream, IServerStreamWriter <ChatMessageFromServer> responseStream, ServerCallContext context) { ResponseStreams.Add(responseStream); while (await requestStream.MoveNext(CancellationToken.None)) { var messageFromClient = requestStream.Current; var message = new ChatMessageFromServer { Message = messageFromClient }; foreach (var stream in ResponseStreams) { await stream.WriteAsync(message); } } ResponseStreams.Remove(responseStream); }
private void ReactOnChatMessage(ChatMessageFromServer message) => messageOutputService.OutputMessage(message.Message, message.Name);