using Container.Common; using Container.Model; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Configuration; using System.IO; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.Threading; using System.Windows; using WebSocket4Net; namespace Container.Services { public class WebSocketManageForLive { private WebSocket websocket = null; App app = ((App)System.Windows.Application.Current); public delegate void WebSocketReceiveDelegate(string type, string message); public static event WebSocketReceiveDelegate WebSocketReceiveEvent; private Class_Log log = new Class_Log(); bool reconnect = false; #region WebSocketClient public void OpenWebSocket() { try { log.WriteLogFile(app.deviceid, "live"); string sendmsg = "ip=" + app.deviceid; websocket = new WebSocket(ConfigurationManager.AppSettings["websocketForLive"] + "?" + sendmsg);// 地址 log.WriteLogFile(ConfigurationManager.AppSettings["websocketForLive"], "live"); websocket.Error += new EventHandler(websocket_Error); websocket.MessageReceived += new EventHandler(websocket_MessageReceived); websocket.Open(); //websocket.Opened += new EventHandler(websocket_Opened); websocket.Closed += new EventHandler(websocket_Closed); } catch (Exception ex) { log.WriteLogFile(ex.ToString()); } } void websocket_Closed(object sender, EventArgs e) { if (!reconnect) { reconnect = true; ReConnect(); } } public void CloseWebSocket() { //if (websocket != null) // websocket.Close(); } void websocket_MessageReceived(object sender, MessageReceivedEventArgs e) { try { log.WriteLogFile(e.Message, "WebSocketForLiveLog"); string type = ""; Dictionary dic = Newtonsoft.Json.JsonConvert.DeserializeObject>(e.Message); if (dic["Content"] != null && dic["SenderID"] != null) { Dictionary Commands = JsonConvert.DeserializeObject>(dic["Content"].ToString()); if (!string.IsNullOrEmpty(Commands["Type"].ToString())) { type = Commands["Type"].ToString().ToLower(); } if (type.Trim().Equals("live")) { string liveCode = string.Empty; string mallCode = string.Empty; //Live live = JsonConvert.DeserializeObject(Commands["parameter"].ToString()); //app.live.HFilePath = live.HFilePath; //app.live.Likes = live.Likes; //app.live.LiveCode = live.LiveCode; //app.live.liveurl = live.liveurl; //app.live.MallCode = live.MallCode; //app.live.SenderID = live.SenderID; //app.live.VFilePath = live.VFilePath; //app.live.WatchNum = live.WatchNum; //app.live = live; Dictionary liveData = JsonConvert.DeserializeObject>(Commands["Parameter"].ToString()); if (!string.IsNullOrEmpty(liveData["MallCode"].ToString())) { mallCode = liveData["MallCode"].ToString(); } if (!string.IsNullOrEmpty(liveData["LiveCode"].ToString())) { liveCode = liveData["LiveCode"].ToString(); } app.live.LiveCode = liveCode; app.live.MallCode = mallCode; app.live.MallName = string.IsNullOrEmpty(liveData["MallName"].ToString()) ? "" : liveData["MallName"].ToString(); app.live.QRCode = string.IsNullOrEmpty(liveData["QrCode"].ToString()) ? "" : liveData["QrCode"].ToString(); app.live.ShopName = string.IsNullOrEmpty(liveData["shopName"].ToString()) ? "" : liveData["shopName"].ToString(); string livePath = string.Empty; if (!string.IsNullOrEmpty(liveData["liveurl"].ToString())) { livePath = liveData["liveurl"].ToString(); } app.live.LiveUrl = livePath; app.live.FloorName = string.IsNullOrEmpty(liveData["floorName"].ToString()) ? "" : liveData["floorName"].ToString(); app.live.HouseNum = string.IsNullOrEmpty(liveData["HouseNum"].ToString()) ? "" : liveData["HouseNum"].ToString(); app.live.LogoPath = string.IsNullOrEmpty(liveData["LogoPath"].ToString()) ? "" : liveData["LogoPath"].ToString(); var senderid = dic["SenderID"].ToString(); app.live.SenderID = senderid.LastIndexOf('/') == senderid.Length - 1 ? senderid.Substring(0, senderid.LastIndexOf('/')) : senderid; app.live.HFilePath = string.IsNullOrEmpty(liveData["HFilePath"].ToString()) ? "" : liveData["HFilePath"].ToString(); app.live.VFilePath = JsonConvert.DeserializeObject>(liveData["VFilePath"].ToString()); app.live.CouponInfo = liveData["couponInfo"] ==null?null: JsonConvert.DeserializeObject(liveData["couponInfo"].ToString()); log.WriteLogFile("------" + JsonConvert.SerializeObject(app.live.CouponInfo), "222"); } else if (type.Trim().Equals("shutdownlive")) { app.live.LiveUrl = ""; app.live.HFilePath = ""; app.live.VFilePath = new List(); app.live.LiveCode = ""; app.live.MallCode = ""; app.live.OldLiveCode = ""; } else if (type.Trim().Equals("like") || type.Trim().Equals("watchnum")) { Dictionary liveData = JsonConvert.DeserializeObject>(Commands["Parameter"].ToString()); app.live.Likes = Convert.ToInt32(liveData["Likes"].ToString()); app.live.WatchNum = Convert.ToInt32(liveData["WatchNum"].ToString()); } else if (type.Trim().Equals("livecoupon")||type.Trim().Equals( "getcoupon")) { app.live.CouponInfo = JsonConvert.DeserializeObject(Commands["Parameter"].ToString()); app.curLive.CouponInfo = app.live.CouponInfo; } else if (type.Trim().Equals("shutdowncoupon")) { app.live.CouponInfo = null; app.curLive.CouponInfo = null; } else if (type.Trim().Equals("playprog")) { Dictionary progData = JsonConvert.DeserializeObject>(Commands["Parameter"].ToString()); if (!string.IsNullOrEmpty(progData["ServerTime"].ToString())) { WebSocketManageForLive.SetLocalTimeByStr(progData["ServerTime"].ToString()); string closeTime = Convert.ToDateTime(progData["ServerTime"]).AddHours(1).ToString("yyyy-MM-dd HH" + ":00:00"); app.CloseServerTime = Convert.ToDateTime(closeTime); } List itemList = JsonConvert.DeserializeObject>(progData["Orders"].ToString()); if (app.ScreenWidth > app.ScreenHeight) { itemList = itemList.FindAll(i => i.OrderType == 1); } else { itemList = itemList.FindAll(i => i.OrderType == 2); } foreach (var item in itemList) { HttpClient httpClient = new HttpClient(); string fileName = ""; if (httpClient.DownLoadImage(item.FilePath, "BrandImageFile", ref fileName)) { item.FilePath = fileName; } else { log.WriteLogFile("商户发布广告图下载失败"); } } app.playProgList = itemList; } else if (type.Trim().Equals("shutdownprog")) { Dictionary progData = JsonConvert.DeserializeObject>(Commands["Parameter"].ToString()); if (!string.IsNullOrEmpty(progData["ServerTime"].ToString())) { WebSocketManageForLive.SetLocalTimeByStr(progData["ServerTime"].ToString()); string closeTime = Convert.ToDateTime(progData["ServerTime"]).AddHours(1).ToString("yyyy-MM-dd HH" + ":00:00"); app.CloseServerTime = Convert.ToDateTime(closeTime); } List itemList = JsonConvert.DeserializeObject>(progData["Orders"].ToString()); app.shutDownProgList = itemList; //List deepCopyList = Clone(app.playProgList); //foreach (var item in app.playProgList) //{ // if (itemList.FindAll(i => i.Code == item.Code).Count > 0) // { // deepCopyList.Remove(item); // } //} //app.playProgList = deepCopyList; } } if (WebSocketReceiveEvent != null) { WebSocketReceiveEvent(type, ""); } } catch (Exception ex) { log.WriteLogFile(ex.ToString(), "WebSocketLogLive"); } } /// /// Clones the specified list. /// /// /// The list. /// List{``0}. public List Clone(object List) { using (Stream objectStream = new MemoryStream()) { IFormatter formatter = new BinaryFormatter(); formatter.Serialize(objectStream, List); objectStream.Seek(0, SeekOrigin.Begin); return formatter.Deserialize(objectStream) as List; } } [DllImport("Kernel32.dll")] public static extern bool SetLocalTime(ref SystemTime sysTime); [StructLayout(LayoutKind.Sequential)] public struct SystemTime { [MarshalAs(UnmanagedType.U2)] public short wYear; [MarshalAs(UnmanagedType.U2)] public short wMonth; [MarshalAs(UnmanagedType.U2)] public short wDayOfWeek; [MarshalAs(UnmanagedType.U2)] public short wDay; [MarshalAs(UnmanagedType.U2)] public short wHour; [MarshalAs(UnmanagedType.U2)] public short wMinute; [MarshalAs(UnmanagedType.U2)] public short wSecond; [MarshalAs(UnmanagedType.U2)] public short wMilliseconds; } public static bool SetLocalTimeByStr(string timestr) { bool flag = false; SystemTime sysTime = new SystemTime(); DateTime dt = Convert.ToDateTime(timestr); sysTime.wYear = Convert.ToInt16(dt.Year); sysTime.wMonth = Convert.ToInt16(dt.Month); sysTime.wDay = Convert.ToInt16(dt.Day); sysTime.wHour = Convert.ToInt16(dt.Hour); sysTime.wMinute = Convert.ToInt16(dt.Minute); sysTime.wSecond = Convert.ToInt16(dt.Second); try { flag = WebSocketManageForLive.SetLocalTime(ref sysTime); } catch (Exception e) { Console.WriteLine("SetSystemDateTime函数执行异常" + e.Message); } return flag; } void websocket_Error(object sender, SuperSocket.ClientEngine.ErrorEventArgs e) { log.WriteLogFile(e.Exception.Message + e.Exception.StackTrace, "WebSocketErrorLog"); //try //{ // if (websocket != null) // websocket.Close(); //} //catch //{ //} //ReConnect(); } /// /// websocket重连 /// private void ReConnect() { try { Action ac = new Action(() => { while (true) { try { if (websocket.State == WebSocketState.Closed) { Thread.Sleep(30000); if (websocket.State == WebSocketState.Closed) websocket.Open(); } if (websocket.State == WebSocketState.Open) { //reconnect = false; break; } } catch (Exception ex) { log.WriteLogFile(ex.ToString(), "WebSocketErrorLog"); } finally { Thread.Sleep(3000); } } }); ac.BeginInvoke((o) => { reconnect = false; }, null); } catch (Exception ex) { log.WriteLogFile(ex.ToString(), "WebSocketErrorLog"); } } #endregion } }