203 lines
6.2 KiB
C#
203 lines
6.2 KiB
C#
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;
|
||
using static JiangsuEarthquake.Common.SocketHelper;
|
||
|
||
namespace JiangsuEarthquake.Models
|
||
{
|
||
public class ServerModel : NotifyBase
|
||
{
|
||
private SocketInfo SI { get; set; } = 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;
|
||
|
||
/// <summary>
|
||
/// 服务器是否开启
|
||
/// </summary>
|
||
public bool IsOpened
|
||
{
|
||
get { return isOpened; }
|
||
set { isOpened = value; this.DoNotify(); }
|
||
}
|
||
|
||
//private bool isConnected = false;
|
||
|
||
///// <summary>
|
||
///// 客户端是否连接
|
||
///// </summary>
|
||
//public bool IsConnected
|
||
//{
|
||
// get { return isConnected; }
|
||
// set { isConnected = value; this.DoNotify(); }
|
||
//}
|
||
|
||
/// <summary>
|
||
/// 启动服务器
|
||
/// </summary>
|
||
/// <param name="socketInfo"></param>
|
||
/// <returns></returns>
|
||
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);
|
||
server.pushSockets = ReceiveMess;
|
||
|
||
Console.WriteLine("Server:服务器开启成功,开始接收数据");
|
||
}
|
||
|
||
return IsOpened;
|
||
}
|
||
catch(Exception ex)
|
||
{
|
||
IsOpened = false;
|
||
Console.WriteLine("Server DoStart Error:" + ex.Message);
|
||
|
||
return IsOpened;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 停止服务器
|
||
/// </summary>
|
||
public bool DoStop()
|
||
{
|
||
server.Stop();
|
||
IsOpened = false;
|
||
Console.WriteLine("Server:服务器已关闭");
|
||
|
||
return IsOpened;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 委托刷新客户数据
|
||
/// </summary>
|
||
private void ReceiveMess(SocketHelper.Sockets sks)
|
||
{
|
||
if (sks.ex != null)
|
||
{
|
||
//在此处理异常信息
|
||
if (sks.ClientDispose)
|
||
{
|
||
//客户端非主动断开连接下线. 非正常下线
|
||
if (sks.Ip != null)
|
||
{
|
||
server.ClientList.Remove(sks);
|
||
server.IsConnected = false;
|
||
//IsConnected = false;
|
||
|
||
Console.WriteLine("Server ReceiveMess Error:客户端非主动断开连接下线");
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (sks.Offset == 0)
|
||
{
|
||
//正常是不会发送0包的,只有客户端主动断开连接时发送空包.
|
||
//客户端下线.
|
||
if (sks.Ip != null && server.ClientList.Contains(sks))
|
||
{
|
||
server.ClientList.Remove(sks);
|
||
server.IsConnected = false;
|
||
|
||
Console.WriteLine("Server ReceiveMess Error:客户端主动断开连接下线");
|
||
}
|
||
|
||
//IsConnected = false;
|
||
}
|
||
else if (sks.NewClientFlag)
|
||
{
|
||
server.ClientList.Add(sks);
|
||
server.IsConnected = true;
|
||
|
||
Console.WriteLine("Server:监测到新客户端" + SI.IP + "/" + SI.Port);
|
||
//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<byte>(buffer), stationName);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Console.WriteLine("Server ReceiveMess Error:" + ex.ToString());
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 发送消息给客户端
|
||
/// </summary>
|
||
public void SendToClient(IPEndPoint ip, byte[] SendData)
|
||
{
|
||
Task.Factory.StartNew(new Action(() =>
|
||
{
|
||
Thread.Sleep(1000);
|
||
server.SendToClient(ip, SendData);
|
||
}));
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 推送消息
|
||
/// </summary>
|
||
public bool SendMessage(byte[] SendData)
|
||
{
|
||
bool result = false;
|
||
try
|
||
{
|
||
//Task.Factory.StartNew(new Action(() =>
|
||
//{
|
||
server.SendToAll(SendData);
|
||
result = true;
|
||
//}));
|
||
}
|
||
catch(Exception ex)
|
||
{
|
||
Console.WriteLine("Server SendMessage Error:" + ex.ToString());
|
||
|
||
result = false;
|
||
}
|
||
return result;
|
||
}
|
||
}
|
||
}
|