/// <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); }
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}"); } } }