コード例 #1
0
        private static async IAsyncEnumerator <ReadOnlySequence <byte> > ShopLists(CancellationToken cancellationToken)
        {
            await Task.CompletedTask;

            var serializer = new DataContractHessianSerializer(typeof(AggregatedChanges));
            var lists      = new[]
            {
                "Lorem ipsum dolor sit amet",
                "Consectetur adipiscing elit",
                "Sed do eiusmod tempor incididunt"
            };

            foreach (var list in lists)
            {
                var description = new ShopListInfo
                {
                    Title = list
                };

                using (var stream = new MemoryStream())
                {
                    serializer.WriteObject(stream, description);
                    yield return(new ReadOnlySequence <byte>(stream.ToArray()));
                }
            }
        }
コード例 #2
0
        private static TPacket LoadPacketContent <TPacket>(Stream stream)
            where TPacket : IIncomingPacket
        {
            var serializer = new DataContractHessianSerializer(typeof(TPacket));

            return((TPacket)serializer.ReadObject(stream));
        }
コード例 #3
0
        private static byte[] GetSerializedPacket <TPacket>(TPacket packet)
            where TPacket : IOutgoingPacket
        {
            using (var buffer = new MemoryStream())
            {
                var serializer = new DataContractHessianSerializer(typeof(TPacket));

                serializer.WriteObject(buffer, packet);

                return(buffer.ToArray());
            }
        }
コード例 #4
0
            public Task SendAsync(string text)
            {
                ArraySegment <byte> data;

                using (var stream = new MemoryStream())
                {
                    var serializer = new DataContractHessianSerializer(typeof(IncomingChatMessage), settings);

                    serializer.WriteObject(stream, new IncomingChatMessage
                    {
                        Author  = principal.Identity.Name,
                        Content = text
                    });

                    data = new ArraySegment <byte>(stream.ToArray());
                }

                return(socket.SendAsync(data, WebSocketMessageType.Binary, true, CancellationToken.None));
            }
コード例 #5
0
            public void StartReceive()
            {
                var ct = cts.Token;

                receive = Task.Run(async() =>
                {
                    while (WebSocketState.Open == socket.State)
                    {
                        ArraySegment <byte> data;
                        WebSocketReceiveResult result;

                        using (var stream = new MemoryStream())
                        {
                            var buffer = new ArraySegment <byte>(new byte[8192]);

                            do
                            {
                                result = await socket.ReceiveAsync(buffer, ct);
                                await stream.WriteAsync(buffer.Array, buffer.Offset, result.Count, ct);
                            } while (false == result.EndOfMessage);

                            ct.ThrowIfCancellationRequested();

                            data = new ArraySegment <byte>(stream.ToArray());
                        }

                        if (0 < data.Count && WebSocketMessageType.Binary == result.MessageType)
                        {
                            OutgoingChatMessage message;

                            using (var stream = new MemoryStream(data.Array))
                            {
                                var serializer = new DataContractHessianSerializer(typeof(OutgoingChatMessage), settings);
                                message        = serializer.ReadObject(stream) as OutgoingChatMessage;
                            }

                            MessageArrived?.Invoke(this, new ChatMessageEventArgs(message));
                        }
                    }
                }, ct);
            }
コード例 #6
0
        private Task OnStreamMessage(ChatMessage message, StreamSequenceToken sst)
        {
            ArraySegment <byte> data;

            using (var memoryStream = new MemoryStream())
            {
                var serializer = new DataContractHessianSerializer(typeof(OutgoingChatMessage), settings);

                serializer.WriteObject(memoryStream, new OutgoingChatMessage
                {
                    Author  = message.Author,
                    Content = message.Content,
                    Created = message.Created
                });

                data = new ArraySegment <byte>(memoryStream.ToArray());
            }

            var tasks             = new List <Task>();
            var registeredSockets = registry[roomId];
            var sockets           = registeredSockets.ToArray();

            sockets.AsParallel().ForAll(socket =>
            {
                try
                {
                    logger.LogDebug($"[ChatRoomWebSocketHandler.OnStreamMessage] Sending data length: {data.Count}");
                    var task = socket.SendAsync(data, WebSocketMessageType.Binary, true, CancellationToken.None);
                    tasks.Add(task);
                }
                catch (WebSocketException exception)
                {
                    Console.WriteLine(exception);
                    registeredSockets.Remove(socket);
                }
            });

            return(Task.WhenAll(tasks));
        }
コード例 #7
0
        public override Task OnMessageAsync(WebSocket webSocket, WebSocketMessageType messageType, ArraySegment <byte> data)
        {
            if (WebSocketMessageType.Binary != messageType)
            {
                logger.LogDebug($"Unsupported message type: {messageType}");
                return(Task.CompletedTask);
            }

            IncomingChatMessage message;

            using (var memoryStream = new MemoryStream(data.Array))
            {
                var serializer = new DataContractHessianSerializer(typeof(IncomingChatMessage), settings);
                message = (IncomingChatMessage)serializer.ReadObject(memoryStream);
            }

            return(stream.OnNextAsync(new ChatMessage
            {
                Author = message.Author,
                Content = message.Content,
                Created = DateTime.UtcNow
            }));
        }
コード例 #8
0
 protected override void Arrange()
 {
     Serializer = new DataContractHessianSerializer(Data.GetType(), settings: null);
 }