// Regarding the async modifier - see https://github.com/Code-Sharp/WampSharp/issues/122 protected override async void OnMessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args) { try { Stream stream = args.GetDataStream().AsStreamForRead(); MemoryStream memoryStream = new MemoryStream(); await stream.CopyToAsync(memoryStream); stream.Position = 0; WampMessage <TMessage> message = mBinaryBinding.Parse(stream); RaiseMessageArrived(message); } catch (Exception ex) { RaiseConnectionError(ex); if (mWebSocket != null) { mWebSocket.Dispose(); } } }
void ws_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args) { var log = LogManager.GetLogger(Global.CallerName()); try { // Instead of using args.GetDataReader, using args.GetDataStream. and create DataReader ourself. // Because if there's no length to read then using GetDataReader would cause exception var dataReader = new DataReader(args.GetDataStream()); if (args.MessageType == SocketMessageType.Utf8) { using (dataReader) { // if there's no length to read then do nothing. preventing exception if (dataReader.UnconsumedBufferLength == 0) { return; } // The encoding and byte order need to match the settings of the writer // we previously used. dataReader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8; dataReader.ByteOrder = Windows.Storage.Streams.ByteOrder.LittleEndian; var data = dataReader.ReadString(dataReader.UnconsumedBufferLength); log.Info("ws_MessageReceived e.Message= " + data); this.OnData(data); } } else if (args.MessageType == SocketMessageType.Binary) { using (dataReader) { // if there's no length to read then do nothing. preventing exception if (dataReader.UnconsumedBufferLength == 0) { return; } dataReader.ByteOrder = Windows.Storage.Streams.ByteOrder.LittleEndian; byte[] bytes = new byte[dataReader.UnconsumedBufferLength]; dataReader.ReadBytes(bytes); log.Info("ws_MessageReceived e.Message= " + bytes); this.OnData(bytes); } } else { throw new InvalidDataException("MessageWebSocketMessageReceivedEventArgs wrong MessageType "); } } catch (Exception e) { this.OnError("ws_MessageReceived", e); } }
private async void OnTextMessage(object sender, MessageWebSocketMessageReceivedEventArgs messageEventArgs) { var result = ""; using (var reader = messageEventArgs.GetDataStream()) using (var sr = new StreamReader(reader.AsStreamForRead(), Encoding.GetEncoding("UTF-8"))) { result = sr.ReadToEnd(); await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { ResultData.Text = result; }); } }
private void OnVoiceMessage(object sender, MessageWebSocketMessageReceivedEventArgs messageEventArgs) { using (var reader = messageEventArgs.GetDataStream()) using (var stream = reader.AsStreamForRead()) using (var mStream = new MemoryStream()) { var bufferSize = 32000; var bytes = new List <byte>(); var buf = new byte[bufferSize]; var length = stream.Read(buf, 0, buf.Length); while (length - bufferSize == 0) { bytes.AddRange(buf); length = stream.Read(buf, 0, buf.Length); } if (length > 0) { bytes.AddRange(buf.Take(length).ToArray()); } var fullData = bytes.ToArray(); mStream.Write(fullData, 0, fullData.Length); mStream.Position = 0; var bitsPerSampleBytes = fullData.Skip(34).Take(2).ToArray(); var channelBytes = fullData.Skip(22).Take(2).ToArray(); var samplingBytes = fullData.Skip(24).Take(4).ToArray(); var bitsPerSample = BitConverter.ToInt16(bitsPerSampleBytes, 0); var channel = BitConverter.ToInt16(channelBytes, 0); var samplingRate = BitConverter.ToInt32(samplingBytes, 0); using (var player = new WasapiOutRT(AudioClientShareMode.Shared, 250)) { player.Init(() => { var waveChannel32 = new WaveChannel32(new RawSourceWaveStream(mStream, new WaveFormat(samplingRate, bitsPerSample, channel))); var mixer = new MixingSampleProvider(new[] { waveChannel32.ToSampleProvider() }); return(mixer.ToWaveProvider16()); }); player.Play(); while (player.PlaybackState == PlaybackState.Playing) { } } } }
/// <summary> /// Converts received stream to a parsed message and passes it to the WebSocketMessageReceived handler. /// </summary> /// <param name="sender">The <see cref="MessageWebSocket" /> that sent the message.</param> /// <param name="args">The message from the web socket.</param> private void MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args) { using (IInputStream inputStream = args.GetDataStream()) { Stream stream = new MemoryStream(); Task copyTask = inputStream.AsStreamForRead().CopyToAsync(stream); copyTask.Wait(); // Ensure we return with the stream pointed at the origin. stream.Position = 0; this.ConvertStreamToMessage(stream); } }
private async void MessageReceived(IWebSocket sender, MessageWebSocketMessageReceivedEventArgs args) { using (var stream = args.GetDataStream()) { //read in info about the frame byte[] header = new byte[info.key_bytes + info.len_bytes]; await stream.ReadAsync(header.AsBuffer(), (uint)header.Length, InputStreamOptions.Partial); //this fancy slice stuff is because we may have to reverse the buffer due to endianness ulong key = bytes2Long(info.key_bytes, header.Take((int)info.key_bytes).ToArray <byte>()); ulong N = bytes2Long(info.len_bytes, header.Skip((int)info.key_bytes).ToArray <byte>()); //find the index of the key we're setting uint i; for (i = 0; i < bufferNumber; i++) { if (keys[i] == key) { break; } } if (i == bufferNumber || N == 0) { return; //this message must be no longer needed or does not exist } //lazily make our buffer. if (buffers[i] == null) { buffers[i] = new byte[info.max_buffer_size]; } sizes[i] = (uint)N; await stream.ReadAsync(buffers[i].AsBuffer(), (uint)N, InputStreamOptions.Partial); //mark it as loaded loaded[i] = true; //fire if (KeyLoadedEvent != null) { KeyLoadedEvent.Invoke(this, key); } } }
private void OnSocketMessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args) { if (SocketMessageType.Binary != args.MessageType) { return; } var packet = ReadPacket(args.GetDataStream().AsStreamForRead()); switch (packet.PacketType) { case PacketType.QueryProfileResponse: { var content = packet.Content; QueryProfileResponsePacket response; using (var memoryStream = new MemoryStream(content.Array, content.Offset, content.Count)) { response = LoadPacketContent <QueryProfileResponsePacket>(memoryStream); } packetReceived.Invoke(this, new PacketReceivedEventArgs(response)); break; } case PacketType.DateTime: { var content = packet.Content; DateTimeResponsePacket response; using (var memoryStream = new MemoryStream(content.Array, content.Offset, content.Count)) { response = LoadPacketContent <DateTimeResponsePacket>(memoryStream); } packetReceived.Invoke(this, new PacketReceivedEventArgs(response)); break; } } }
private void WebSocket_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args) { Logger.LogTrace("WebSocket_MessageReceived()"); try { using (var data = args.GetDataStream()) using (var buffer = new MemoryStream()) { data.AsStreamForRead().CopyTo(buffer); MessageReceived.Invoke(sender, new SignalWebSocketMessageReceivedEventArgs() { Message = buffer.ToArray() }); } } catch (Exception e) { Logger.LogError("WebSocket_MessageReceived failed: {0}\n{1}", e.Message, e.StackTrace); Task.Run(ConnectAsync); } }
private async void Sck_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args) { //[email protected]("Message received " + args); if (args.MessageType == SocketMessageType.Utf8) { Windows.Storage.Streams.DataReader messageReader = args.GetDataReader(); messageReader.UnicodeEncoding = UnicodeEncoding.Utf8; string messageString = messageReader.ReadString(messageReader.UnconsumedBufferLength); com.codename1.io.websocket.WebSocket.messageReceived(id, messageString); } else { Windows.Storage.Streams.IInputStream readStream = args.GetDataStream(); byte[] readBuffer = new byte[4096]; try { while (true) { if (sender != sck) { return; } IBuffer res = await readStream.ReadAsync(readBuffer.AsBuffer(), (uint)readBuffer.Length, 0); if (res.Length == 0) { return; } byte[] resArr = new byte[res.Length]; res.CopyTo(resArr); com.codename1.io.websocket.WebSocket.messageReceived(1, resArr); } } catch (Exception ex) { com.codename1.io.websocket.WebSocket.errorReceived(id, ex.Message, ex.HResult); } } }
private async void WebSocket_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args) { try { using (var data = args.GetDataStream()) { MessageReceived.Invoke(sender, new SignalWebSocketMessageReceivedEventArgs() { Message = data.AsStreamForRead() }); } } catch (Exception e) { Logger.LogError("WebSocket_MessageReceived failed: {0}\n{1}", e.Message, e.StackTrace); try { await ConnectAsync(); } catch (TaskCanceledException) { } } }
protected override void OnMessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args) { try { Stream stream = args.GetDataStream().AsStreamForRead(); StreamReader reader = new StreamReader(stream); string frame = reader.ReadToEnd(); WampMessage <TMessage> message = mTextBinding.Parse(frame); RaiseMessageArrived(message); } catch (Exception ex) { RaiseConnectionError(ex); if (mWebSocket != null) { mWebSocket.Dispose(); } } }
private async void MessageWebSocket_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args) { string recievedText = string.Empty; using (var releaser = await _WebSocketLock.LockAsync()) { using (var reader = new StreamReader(args.GetDataStream().AsStreamForRead())) { recievedText = reader.ReadToEnd(); Debug.WriteLine($"<WebSocket Message> {args.MessageType}: {recievedText}"); } } var param = (JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(recievedText); var type = (string)param["type"]; if (type == "watch") { var body = (JObject)param["body"]; var command = (string)body["command"]; switch (command) { case "servertime": var paramItems = (JArray)body["params"]; var serverTimeString = paramItems[0].ToString(); var serverTimeTick = long.Parse(serverTimeString); var serverTime = DateTime.FromBinary(serverTimeTick); RecieveServerTime?.Invoke(serverTime); break; case "permit": var permit = (string)(((JArray)body["params"])[0]); RecievePermit?.Invoke(permit); break; case "currentstream": var current_stream = (JObject)body["currentStream"]; var currentStreamArgs = new Live2CurrentStreamEventArgs() { Uri = (string)current_stream["uri"], Quality = (string)current_stream["quality"], QualityTypes = ((JArray)current_stream["qualityTypes"]).Select(x => x.ToString()).ToArray(), MediaServerType = (string)current_stream["mediaServerType"], //MediaServerAuth = (string)current_stream["mediaServerAuth"], StreamingProtocol = (string)current_stream["streamingProtocol"] }; if (current_stream.TryGetValue("name", out var name)) { currentStreamArgs.Name = (string)name; } RecieveCurrentStream?.Invoke(currentStreamArgs); break; case "currentroom": var room = (JObject)body["room"]; var currentRoomArgs = new Live2CurrentRoomEventArgs() { MessageServerUrl = (string)room["messageServerUri"], MessageServerType = (string)room["messageServerType"], RoomName = (string)room["roomName"], ThreadId = (string)room["threadId"], Forks = ((JArray)room["forks"]).Select(x => (int)x).ToArray(), ImportedForks = ((JArray)room["importedForks"]).Select(x => (int)x).ToArray() }; RecieveCurrentRoom?.Invoke(currentRoomArgs); break; case "statistics": var countItems = ((JArray)body["params"]) .Select(x => x.ToString()) .Select(x => long.TryParse(x, out var result) ? result : 0) .ToArray(); var statisticsArgs = new Live2StatisticsEventArgs() { ViewCount = countItems[0], CommentCount = countItems[1], Count_3 = countItems[2], Count_4 = countItems[3], }; RecieveStatistics?.Invoke(statisticsArgs); break; case "watchinginterval": var timeString = ((JArray)body["params"]).Select(x => x.ToString()).ToArray()[0]; var time = TimeSpan.FromSeconds(long.Parse(timeString)); RecieveWatchInterval?.Invoke(time); WatchingHeartbaetTimer = new Timer((state) => { SendMessageAsync($"{{\"type\":\"watch\",\"body\":{{\"command\":\"watching\",\"params\":[\"{Props.Program.BroadcastId}\",\"-1\",\"0\"]}}}}").ConfigureAwait(false); } , null, time, time ); break; case "schedule": var updateParam = (JObject)body["update"]; var scheduleArgs = new Live2ScheduleEventArgs() { BeginTime = DateTime.FromBinary((long)updateParam["begintime"]), EndTime = DateTime.FromBinary((long)updateParam["endtime"]), }; RecieveSchedule?.Invoke(scheduleArgs); break; case "disconnect": var disconnectParams = ((JArray)body["params"]).Select(x => x.ToString()).ToArray(); var endtimeString = disconnectParams[0]; var endTime = DateTime.FromBinary(long.Parse(endtimeString)); var endReason = disconnectParams[1]; RecieveDisconnect?.Invoke(); break; case "postkey": var postkeyParams = ((JArray)body["params"]).Select(x => x.ToString()).ToArray(); var postKey = postkeyParams[0]; _Postkey = postKey; break; } } else if (type == "ping") { await SendMessageAsync("{\"type\":\"pong\",\"body\":{}}"); } }
private async void HandleMessage(object sender, MessageWebSocketMessageReceivedEventArgs e) { try { if (UseCompression) { using (var datastr = e.GetDataStream()?.AsStreamForRead()) using (var ms = new MemoryStream()) { datastr.CopyTo(ms); ms.Position = 0; byte[] data = new byte[ms.Length]; ms.Read(data, 0, (int)ms.Length); int index = 0; int count = data.Length; using (var decompressed = new MemoryStream()) { if (data[0] == 0x78) { _compressed.Write(data, index + 2, count - 2); _compressed.SetLength(count - 2); } else { _compressed.Write(data, index, count); _compressed.SetLength(count); } _compressed.Position = 0; _decompressor.CopyTo(decompressed); _compressed.Position = 0; decompressed.Position = 0; using (var reader = new StreamReader(decompressed)) { #if DEBUG string content = await reader.ReadToEndAsync(); Debug.WriteLine("<<< " + content); SocketFrame frame = JsonConvert.DeserializeObject <SocketFrame>(content); if (frame.SequenceNumber.HasValue) { lastGatewayEventSeq = frame.SequenceNumber.Value; } if (operationHandlers.ContainsKey(frame.Operation.GetValueOrDefault())) { operationHandlers[frame.Operation.GetValueOrDefault()](frame); } if (frame.Type != null && eventHandlers.ContainsKey(frame.Type)) { eventHandlers[frame.Type](frame); } #else using (JsonReader jsreader = new JsonTextReader(reader)) { JsonSerializer serializer = new JsonSerializer(); SocketFrame frame = serializer.Deserialize <SocketFrame>(jsreader); if (frame.SequenceNumber.HasValue) { lastGatewayEventSeq = frame.SequenceNumber.Value; } if (operationHandlers.ContainsKey(frame.Operation.GetValueOrDefault())) { operationHandlers[frame.Operation.GetValueOrDefault()](frame); } if (frame.Type != null && eventHandlers.ContainsKey(frame.Type)) { eventHandlers[frame.Type](frame); } } #endif } } } } else { using (var reader = new StreamReader(e.GetDataStream().AsStreamForRead())) using (JsonReader jsreader = new JsonTextReader(reader)) { JsonSerializer serializer = new JsonSerializer(); SocketFrame frame = serializer.Deserialize <SocketFrame>(jsreader); lastGatewayEventSeq = frame.SequenceNumber ?? 0; if (operationHandlers.ContainsKey(frame.Operation.GetValueOrDefault())) { operationHandlers[frame.Operation.GetValueOrDefault()](frame); } if (frame.Type != null && eventHandlers.ContainsKey(frame.Type)) { eventHandlers[frame.Type](frame); } } } } catch (Exception exception) { ConnectedSocket = false; var error = Windows.Networking.Sockets.WebSocketError.GetStatus(exception.HResult); if (error == WebErrorStatus.ConnectionAborted) { GatewayClosed?.Invoke(null, null); } } }
private async void _CommentSessionWebSocket_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args) { string recievedText = string.Empty; using (var releaser = await _CommentSessionLock.LockAsync()) { using (var reader = new StreamReader(args.GetDataStream().AsStreamForRead())) { recievedText = reader.ReadToEnd(); Debug.WriteLine($"<CommentSession Message> {args.MessageType}: {recievedText}"); } var jsonObject = (JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(recievedText); if (jsonObject.TryGetValue("chat", out var chatJson)) { var chat = chatJson.ToObject <Mntone.Nico2.Videos.Comment.NMSG_Chat>(); var liveChatData = new LiveChatData() { Thread = chat.Thread, No = chat.No, Content = chat.Content, Date = chat.Date, DateUsec = chat.DateUsec, IsAnonymity = chat.Anonymity == 1, __Premium = chat.Premium, IsYourPost = chat.Yourpost == 1, Mail = chat.Mail, Score = chat.Score, UserId = chat.UserId, Vpos = chat.Vpos }; CommentRecieved?.Invoke(this, new CommentRecievedEventArgs() { Chat = liveChatData }); } else if (jsonObject.TryGetValue("chat_result", out var chatResultJson)) { var chatResult = chatResultJson.ToObject <Mntone.Nico2.Videos.Comment.Chat_result>(); CommentPosted?.Invoke(this, new CommentPostedEventArgs() { Thread = chatResult.Thread, ChatResult = chatResult.Status, No = chatResult.No }); } else if (jsonObject.TryGetValue("thread", out var threadJson)) { var thread = threadJson.ToObject <Mntone.Nico2.Videos.Comment.NGMS_Thread_Response>(); _Thread = thread; // // コメントの受信開始を受け取ってからハートビートを開始する // StartHeartbeatTimer(); Connected?.Invoke(this, new CommentServerConnectedEventArgs() { LastRes = thread.LastRes, Resultcode = thread.Resultcode, Revision = thread.Revision, ServerTime = thread.ServerTime, Thread = thread.Thread, Ticket = thread.Ticket, }); } else if (jsonObject.TryGetValue("ping", out var pingJson)) { var ping = pingJson.ToObject <Mntone.Nico2.Videos.Comment.Ping>(); // {"ping":{"content":"rs:1"}} // { "ping":{ "content":"ps:5"} } // {"chat_result":{...}} // {"chat":{...}} // { "ping":{ "content":"pf:5"} } // { "ping":{ "content":"rf:1"} } if (ping.Content.StartsWith("pf")) { _MessageSendCount += 1; } } else { Debug.WriteLine("Not Support"); } } }
private async void MessageWebSocket_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args) { string recievedText = string.Empty; using (var releaser = await _WebSocketLock.LockAsync()) { using (var reader = new StreamReader(args.GetDataStream().AsStreamForRead())) { recievedText = reader.ReadToEnd(); Debug.WriteLine($"{args.MessageType}: {recievedText}"); } } var param = (JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(recievedText); var type = (string)param["type"]; if (type == "watch") { var body = (JObject)param["body"]; var command = (string)body["command"]; switch (command) { case "servertime": var paramItems = (JArray)body["params"]; var serverTimeString = paramItems[0].ToString(); var serverTimeTick = long.Parse(serverTimeString); var serverTime = DateTime.FromBinary(serverTimeTick); RecieveServerTime?.Invoke(serverTime); break; case "permit": var permit = (string)(((JArray)body["params"])[0]); RecievePermit?.Invoke(permit); break; case "currentstream": var current_stream = (JObject)body["currentStream"]; var currentStreamArgs = new Live2CurrentStreamEventArgs() { Uri = (string)current_stream["uri"], Name = (string)current_stream["name"], Quality = (string)current_stream["quality"], QualityTypes = ((JArray)current_stream["qualityTypes"]).Select(x => x.ToString()).ToArray(), MediaServerType = (string)current_stream["mediaServerType"], MediaServerAuth = (string)current_stream["mediaServerAuth"], StreamingProtocol = (string)current_stream["streamingProtocol"] }; RecieveCurrentStream?.Invoke(currentStreamArgs); break; case "currentroom": var room = (JObject)body["room"]; var currentRoomArgs = new Live2CurrentRoomEventArgs() { MessageServerUrl = (string)room["messageServerUri"], MessageServerType = (string)room["messageServerType"], RoomName = (string)room["roomName"], ThreadId = (string)room["threadId"], Forks = ((JArray)room["forks"]).Select(x => (int)x).ToArray(), ImportedForks = ((JArray)room["importedForks"]).Select(x => (int)x).ToArray() }; RecieveCurrentRoom?.Invoke(currentRoomArgs); break; case "statistics": var countItems = ((JArray)body["params"]).Select(x => x.ToString()).ToArray(); var statisticsArgs = new Live2StatisticsEventArgs() { ViewCount = int.Parse(countItems[0]), CommentCount = int.Parse(countItems[1]), Count_3 = int.Parse(countItems[2]), Count_4 = int.Parse(countItems[3]), }; RecieveStatistics?.Invoke(statisticsArgs); break; case "watchinginterval": var timeString = ((JArray)body["params"]).Select(x => x.ToString()).ToArray()[0]; var time = TimeSpan.FromSeconds(int.Parse(timeString)); RecieveWatchInterval?.Invoke(time); break; case "schedule": var updateParam = (JObject)body["update"]; var scheduleArgs = new Live2ScheduleEventArgs() { BeginTime = DateTime.FromBinary((long)updateParam["begintime"]), EndTime = DateTime.FromBinary((long)updateParam["endtime"]), }; RecieveSchedule?.Invoke(scheduleArgs); break; case "disconnect": var disconnectParams = ((JArray)body["params"]).Select(x => x.ToString()).ToArray(); var endtimeString = disconnectParams[0]; var endTime = TimeSpan.FromSeconds(int.Parse(endtimeString)); var endReason = disconnectParams[1]; RecieveDisconnect?.Invoke(); break; } } else if (type == "ping") { } }