using Google.Protobuf.WellKnownTypes; using JiangsuEarthquake.Common; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; namespace JiangsuEarthquake.Models { public class ServerModel : NotifyBase { SocketInfo SI = new SocketInfo(); private LowerComputerModel lowerComputerModel { get; set; } = new LowerComputerModel(); //public Server server { get; set; } = new Server(); public SocketHelper.TcpServer server { get; set; } = new SocketHelper.TcpServer(); private bool isOpened = false; /// /// 服务器是否开启 /// public bool IsOpened { get { return isOpened; } set { isOpened = value; this.DoNotify(); } } //private bool isConnected = false; ///// ///// 客户端是否连接 ///// //public bool IsConnected //{ // get { return isConnected; } // set { isConnected = value; this.DoNotify(); } //} /// /// 启动服务器 /// /// /// public bool DoStart(SocketInfo socketInfo) { SI.IP = socketInfo.IP; SI.Port = socketInfo.Port; try { server.InitSocket(socketInfo.IP, socketInfo.Port); //初始化设备的IP和端口号 IsOpened = server.Start(); if (IsOpened) { SocketHelper.pushSockets = new SocketHelper.PushSockets(ReceiveMess); } return IsOpened; } catch { IsOpened = false; return IsOpened; } } /// /// 停止服务器 /// public bool DoStop() { server.Stop(); IsOpened = false; return IsOpened; } /// /// 委托刷新客户数据 /// private void ReceiveMess(SocketHelper.Sockets sks) { if (sks.ex != null) { //在此处理异常信息 if (sks.ClientDispose) { //客户端非主动断开连接下线. 非正常下线 if (sks.Ip != null && server.ClientList.Contains(sks)) { server.ClientList.Remove(sks); server.IsConnected = false; //IsConnected = false; } } } else { if (sks.Offset == 0) { //正常是不会发送0包的,只有客户端主动断开连接时发送空包. //客户端下线. if (sks.Ip != null && server.ClientList.Contains(sks)) { server.ClientList.Remove(sks); server.IsConnected = false; } //IsConnected = false; } else if (sks.NewClientFlag) { server.ClientList.Add(sks); //IsConnected = true; server.IsConnected = true; } else { //IsConnected = true; //接收客户端消息 byte[] buffer = new byte[sks.Offset]; Array.Copy(sks.RecBuffer, buffer, sks.Offset); try { int stationName = 0; if (SI.Port == int.Parse(Tools.GetAppSetting("XWJ_Service_Port1")) && SI.IP == Tools.GetAppSetting("XWJ_Service_IP1")) { stationName = 1; } else if (SI.Port == int.Parse(Tools.GetAppSetting("XWJ_Service_Port2")) && SI.IP == Tools.GetAppSetting("XWJ_Service_IP2")) { stationName = 2; } lowerComputerModel.ParsingData(new List(buffer), stationName); } catch (Exception ex) { return; } } } } /// /// 发送消息给客户端 /// public void SendToClient(IPEndPoint ip, byte[] SendData) { Task.Factory.StartNew(new Action(() => { Thread.Sleep(1000); server.SendToClient(ip, SendData); })); } /// /// 推送消息 /// public bool SendMessage(byte[] SendData) { bool result = false; try { //Task.Factory.StartNew(new Action(() => //{ server.SendToAll(SendData); result = true; //})); } catch { result = false; } return result; } } }