using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using WinAPI;
namespace QuickMsg
{
///
/// 消息客户端类
///
public class MsgClient
{
readonly CustomMsg MSG;
///
/// 判断当前消息主服务器是否创建成功
///
public bool IsOk
{
get; private set;
}
///
/// 最后一次接收消息的时间,可用来判断服务端是否有响应
///
public DateTime Last_RecvTime { get; set; } = DateTime.Now.AddDays(-10);
///
/// 主句柄
///
public IntPtr main_handle = IntPtr.Zero;
///
/// 当收到消息时激发
///
public event CustomMsg.MsgEventHandler OnMsg;
///
/// 连接上主服务器时触发
///
public event EventHandler OnConnected;
///
/// 收到服务端关闭通知
///
public event EventHandler OnClose;
///
/// 收到服务端关闭通知,即将关闭
///
public event CustomMsg.ClosingEventHandler OnClosing;
///
/// 服务端大小改变时激发
///
public event CustomMsg.SizeEventHandler OnResize;
private readonly string client_id="";
///
/// 实例化客户端
///
/// 服务端ID
/// 当前客户端ID,会向服务器报告当前ID
/// 客户端
public MsgClient(string main_id,string client_id, Form _form)
{
object mainHandle = RyMemoryShare.ReadFromMemory(1024, typeof(Int64), main_id);
this.client_id = client_id;
if (mainHandle == null)
{
IsOk = false;
}
else
{
main_handle = new IntPtr((Int64)mainHandle);
MSG = new CustomMsg(_form);//创建消息通道
MSG.OnMsg += MSG_OnMsg;
ryCommon.Storage Stor = new ryCommon.Storage();
Stor.SelectNodeBySet();
Stor.SetAttrValue("op", "connect");
Stor.SetAttrValue("clientid", client_id);
MSG.Send(main_handle, MyDb.RyWin32.Sys_chanel_id, "xml" + Stor.XMLText);//向服务端发起连接请求
}
}
///
///
///
~MsgClient()
{
DisConnect();
}
///
/// 断开服务端连接
///
public void DisConnect()
{
if (IsOk)
MSG.Send(main_handle, MyDb.RyWin32.Sys_chanel_id, "disconnect");//向服务端发起断开连接请求
IsOk = false;
}
///
/// 发送消息,采用多线程发送
///
///
///
public void Send(int wParam, string msg)
{
MSG.Send(main_handle, wParam, msg);//发送消息
}
///
/// 向服务端发送心跳包
///
public void SendHeart()
{
MSG.Send2(main_handle, MyDb.RyWin32.Sys_chanel_id, "heart");//发送消息
}
///
/// 判断服务端句柄是否存在。
///
///
public bool MainExist()
{
return User32.IsWindow(main_handle);
}
private void MSG_OnMsg(object sender, MsgArgs e)
{
Last_RecvTime = DateTime.Now;
OnMsg?.Invoke(this,e);
if (e.WParam == MyDb.RyWin32.Sys_chanel_id) //如果是系统通道请求
{
switch (e.Msg_text)
{
case "connected"://与服务端连接成功
IsOk = true;
OnConnected?.Invoke(this,new EventArgs());
break;
case "close"://服务端关闭通知
IsOk = false;
bool cancel = false;
OnClosing?.Invoke(this,cancel);
if (!cancel)
{
OnClose?.Invoke(this, new EventArgs());
}
break;
default:
#region 如果是xml消息
if (e.Msg_text.StartsWith("xml"))
{
ryCommon.Storage Stor = new ryCommon.Storage(e.Msg_text.Substring(3));
Stor.SelectNodeBySet();
switch (Stor.GetAttrValue("op"))
{
case "resize"://服务端大小改变
OnResize?.Invoke(this, Stor.GetAttrValue("width", 0), Stor.GetAttrValue("height", 0));
break;
}
}
break;
#endregion
}
}
}
}
}