using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace NEIntelligentControl2.Service.WebSocket { /// <summary> /// WebSocket消息 /// </summary> public class StompMessage { private readonly Dictionary<string, string> _headers = new Dictionary<string, string>(); /// <summary> /// Initializes a new instance of the <see cref = "StompMessage" /> class. /// </summary> /// <param name = "command">The command.</param> public StompMessage(string command) : this(command, string.Empty) { } /// <summary> /// Initializes a new instance of the <see cref = "StompMessage" /> class. /// </summary> /// <param name = "command">The command.</param> /// <param name = "body">The body.</param> public StompMessage(string command, string body) : this(command, body, new Dictionary<string, string>()) { } /// <summary> /// Initializes a new instance of the <see cref = "StompMessage" /> class. /// </summary> /// <param name = "command">The command.</param> /// <param name = "body">The body.</param> /// <param name = "headers">The headers.</param> internal StompMessage(string command, string body, Dictionary<string, string> headers) { Command = command; Body = body; _headers = headers; this["content-length"] = body.Length.ToString(); } public Dictionary<string, string> Headers { get { return _headers; } } /// <summary> /// Gets the body. /// </summary> public string Body { get; private set; } /// <summary> /// Gets the command. /// </summary> public string Command { get; private set; } /// <summary> /// Gets or sets the specified header attribute. /// </summary> public string this[string header] { get { return _headers.ContainsKey(header) ? _headers[header] : string.Empty; } set { _headers[header] = value; } } /// <summary> /// 转换为字符串 /// </summary> /// <returns></returns> public override string ToString() { var buffer = new StringBuilder(); buffer.Append(Command + "\n"); if (Headers != null) { foreach (var header in Headers) { buffer.Append(header.Key + ":" + header.Value + "\n"); } } buffer.Append("\n"); buffer.Append(Body); buffer.Append('\0'); return buffer.ToString(); } /// <summary> /// 解析消息 /// </summary> internal static StompMessage Deserialize(string data) { var reader = new System.IO.StringReader(data); var command = reader.ReadLine(); var headers = new Dictionary<string, string>(); var header = reader.ReadLine(); while (!string.IsNullOrEmpty(header)) { var split = header.Split(':'); if (split.Length == 2) headers[split[0].Trim()] = split[1].Trim(); header = reader.ReadLine() ?? string.Empty; } var body = reader.ReadToEnd() ?? string.Empty; body = body.TrimEnd('\r', '\n', '\0'); return new StompMessage(command, body, headers); } } }