2024-08-28 01:30:09 +00:00
|
|
|
|
using Google.Protobuf.WellKnownTypes;
|
|
|
|
|
|
using FujianEarthquake.Common;
|
|
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using System.Net;
|
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
using System.Threading.Tasks;
|
2024-08-29 10:03:03 +00:00
|
|
|
|
using FujianEarthquake.Models.ProtocolAnalyseModels;
|
2024-08-28 01:30:09 +00:00
|
|
|
|
|
2024-08-29 10:03:03 +00:00
|
|
|
|
namespace FujianEarthquake.Models.CommModels
|
2024-08-28 01:30:09 +00:00
|
|
|
|
{
|
|
|
|
|
|
public class ServerModel : NotifyBase
|
|
|
|
|
|
{
|
|
|
|
|
|
SocketInfo SI = new SocketInfo();
|
|
|
|
|
|
|
|
|
|
|
|
private LowerComputerModel lowerComputerModel { get; set; } = new LowerComputerModel();
|
|
|
|
|
|
|
|
|
|
|
|
public SocketHelper.TcpServer server { get; set; } = new SocketHelper.TcpServer();
|
|
|
|
|
|
|
|
|
|
|
|
private bool isOpened = false;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 服务器是否开启
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool IsOpened
|
|
|
|
|
|
{
|
|
|
|
|
|
get { return isOpened; }
|
2024-08-29 10:03:03 +00:00
|
|
|
|
set { isOpened = value; DoNotify(); }
|
2024-08-28 01:30:09 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return IsOpened;
|
|
|
|
|
|
}
|
|
|
|
|
|
catch
|
|
|
|
|
|
{
|
|
|
|
|
|
IsOpened = false;
|
|
|
|
|
|
return IsOpened;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2024-08-29 10:03:03 +00:00
|
|
|
|
|
2024-08-28 01:30:09 +00:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 停止服务器
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool DoStop()
|
|
|
|
|
|
{
|
|
|
|
|
|
server.Stop();
|
|
|
|
|
|
IsOpened = false;
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
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);
|
|
|
|
|
|
server.IsConnected = true;
|
|
|
|
|
|
|
|
|
|
|
|
//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("ReceiveMess:" + 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
|
|
|
|
|
|
{
|
|
|
|
|
|
result = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
return result;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|