/// <summary>
 /// The listener starts to wait for messsages from the miniserver
 /// </summary>
 private void BeginListening()
 {
     if (Listener != null)
     {
         TokenSource.Cancel();
         Listener = null;
     }
     Listener = Task.Run(async() => {
         while (WebSocket.State == WebSocketState.Open)
         {
             WebserviceResponse response = await ReceiveWebsocketMessage(1024, TokenSource.Token);
             if (!HandleWebserviceResponse(response) && !ParseEventTable(response.Content, response.Header.Type))
             {
                 OnReceiveMessge?.BeginInvoke(WebSocket, new MessageReceivedEventArgs(response), null, null);
             }
             await Task.Delay(10);
         }
     }, TokenSource.Token);
 }
Example #2
0
        private async Task ReadStream()
        {
            var forSize      = new byte[8];
            var forGuid      = new byte[16];
            var forType      = new byte[1];
            var clientStream = tcpClient.GetStream();

            while (true)
            {
                await clientStream.ReadAsync(forSize, 0, 8);

                var size = BitConverter.ToInt64(forSize, 0);

                await clientStream.ReadAsync(forGuid, 0, 16);

                var id = new Guid(forGuid);

                await clientStream.ReadAsync(forType, 0, 1);

                var type = (MessageType)forType[0];
                logger.LogDebug($"read packetId {id} type is {type}");

                var contentStream = new MemoryStream();
                //TODO обрезание long в int!!!!
                await clientStream.CopyPart(contentStream, (int)size - 17);

                contentStream.Position = 0;
                try
                {
                    switch (type)
                    {
                    case MessageType.Message:
                        InvokeMessage message = DecodeMessage(contentStream, id);
                        tasksSet.Add(Task.Factory.StartNew(() => OnReceiveMessge?.Invoke(message)));
                        logger.LogDebug($"invoked message handler for {id}, go to new iteration");
                        break;

                    case MessageType.Result:
                        InvokeResult result = DecodeResult(contentStream, id);
                        await OnReceiveResult?.Invoke(result);

                        logger.LogDebug($"invoked result handler for {id}, go to new iteration");
                        break;

                    case MessageType.PingRequest:
                        logger.LogDebug($"Request for ping");
                        await SendPingResponse(id);

                        logger.LogDebug($"Sended ping response");
                        break;

                    case MessageType.CreateInstanceRequest:
                        logger.LogDebug("need new service instance");
                        var password = await ReadPassword(contentStream, (int)size - 17);

                        await OnNeedNewInstance?.Invoke(password);

                        break;

                    default:
                        logger.LogWarning($"incorrect message type {type}");
                        break;
                    }
                }
                catch (Exception ex)
                {
                    logger.LogInformation(ex, $"EXCEPTION {ex.Message}");
                }
            }
        }