Ejemplo n.º 1
0
        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);
                }
            }
        }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
 private void ReactOnChatMessage(ChatMessageFromServer message) =>
 messageOutputService.OutputMessage(message.Message, message.Name);