/// <summary> /// Sends a message to all connected clients. /// </summary> /// <param name="message">Message container containing everything related to the message.</param> /// <returns>True on success.</returns> public async Task <bool> SendMessage(WebSocketMessageContainer message) { bool succes = false; foreach (var connection in _ListWithConnections) { succes = await connection.Value.SendMessageAsync(message); } return(succes); }
/// <summary> /// Send a message to a specific client. /// </summary> /// <param name="message">Message container containing everything related to the message.</param> /// <param name="clientId">Id of the client to send the message to.</param> /// <returns>True on success.</returns> public async Task <bool> SendMessage(WebSocketMessageContainer message, string clientId) { foreach (var connection in _ListWithConnections) { if (connection.Key.clientId == clientId) { return(await connection.Value.SendMessageAsync(message)); } } return(false); }
/// <summary> /// Stops the websocket server and sends over a reason asynchronous. /// </summary> /// <param name="reason">Overload parameter for reason. </param> /// <returns>True on success.</returns> public async Task <bool> StopServerAsync(string reason = "Server closed connection.") { WebSocketMessageContainer message = new WebSocketMessageContainer() { data = Encoding.UTF8.GetBytes(reason), isClosed = true }; bool succes = await SendMessageAsync(message); if (succes) { _ClientInfo.client.Close(); return(true); } else { return(false); } }
/// <summary> /// Sends a websocket framed message to the client synchronous. /// </summary> /// <param name="message">Message container containing all the information needed for the message.</param> /// <returns>True on success.</returns> public bool SendMessage(WebSocketMessageContainer message) { if (_ClientInfo.client.Connected) { NetworkStream stream = _ClientInfo.client.GetStream(); if (stream.CanWrite) { UInt64 messageLength = (ulong)message.data.Length; List <byte> websocketFrame = new List <byte>(); byte start = 0x00; if (message.isText) { start = 0x81; } if (message.isBinary) { start = 0x82; } if (message.isClosed) { start = 0x88; } if (message.isPing) { start = 0x89; } if (message.isPong) { start = 0x8A; } websocketFrame.Add(start); if (messageLength <= 125) { websocketFrame.Add((byte)messageLength); websocketFrame.AddRange(message.data); } else if (messageLength > 125 && messageLength <= 65535) { UInt16 messageLength16bit = (UInt16)messageLength; byte[] byteArray = BitConverter.GetBytes(messageLength16bit).Reverse <byte>().ToArray(); websocketFrame.Add((byte)126); websocketFrame.AddRange(byteArray); websocketFrame.AddRange(message.data); } else { byte[] byteArray = BitConverter.GetBytes(messageLength).Reverse <byte>().ToArray(); websocketFrame.Add((byte)127); websocketFrame.AddRange(byteArray); websocketFrame.AddRange(message.data); } stream.Write(websocketFrame.ToArray(), 0, websocketFrame.ToArray().Length); stream.Flush(); return(true); } else { return(false); } } else { return(false); } }