old_flsystem/类库/Chat.Framework/WXSdk/IPAD/Push.cs

242 lines
7.6 KiB
C#

using Chat.Framework;
using Chat.Framework.WXSdk.Implement;
using socket.core.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Chat.Framework.WXSdk.IPAD
{
public class Push
{
private TcpPushClient client;
Random random = new Random();
DnsEndPoint hostEndPoint;
public Push(DnsEndPoint hostEndPoint, WeixinBase weixin)
{
this.weixin = weixin;
client = new TcpPushClient(0x20000);
client.OnConnect += Client_OnConnect;
client.OnReceive += Client_OnReceive;
client.OnSend += Client_OnSend;
client.OnClose += Client_OnClose;
this.hostEndPoint = hostEndPoint;
}
public bool Connect()
{
client.Connect(hostEndPoint.Host, hostEndPoint.Port);
return client.Connected;
}
public void ClearPack()
{
lock (mPackDic)
{
var vas = mPackDic.ToList().Where(f => f.Value.Time < DateTime.Now.AddMinutes(-5));
foreach (var item in vas)
{
mPackDic.Remove(item.Key);
}
}
}
private void Client_OnClose()
{
Console.WriteLine($"Push断开");
}
private void Client_OnReceive(byte[] obj)
{
//Console.WriteLine($"Push接收长度[{obj.Length}] {random.Next(1, 9999)}");
DePack(obj);
}
/// <summary>
/// 通过seq取微信服务器返回的socket包数据
/// </summary>
/// <param name="Seq"></param>
/// <returns></returns>
public byte[] GetBuffBySeq(int Seq)
{
lock (mPackDicLock)
{
//Thread.Sleep(10);
byte[] buf = null;
try
{
if (mPackDic.ContainsKey(Seq))
{
buf = mPackDic[Seq].Data;
mPackDic.Remove(Seq);
return buf;
}
}
catch (Exception ee)
{
LogHelper.GetSingleObj().Error("Wechat GetBuffBySeq", $"{weixin.WeixinHao}- 获取超时!{ee.Message}");
}
return buf;
}
}
private void Client_OnConnect(bool obj)
{
// Console.WriteLine($"Push连接{obj}");
}
public bool connected
{
get
{
return client == null ? false : client.Connected;
}
}
private void Client_OnSend(int obj)
{
// LogHelper.GetSingleObj().Info("发送成功");
}
public void AsynSend(byte[] data,string text="")
{
//Console.WriteLine("1111111111");
client.Send(data, 0, data.Length,text);
}
public void AsynSend(byte[] data, int offset, int length)
{
client.Send(data, offset, length);
}
public void Disconnect()
{
client.Close();
}
private object mPackDicLock = new object();
private byte[] packageData = null;
public bool DePack(byte[] bys)
{
bool result = false;
int x = bys.Length;
if (packageData != null)
{
byte[] temp = new byte[packageData.Length + x];
Buffer.BlockCopy(packageData, 0, temp, 0, packageData.Length);
Buffer.BlockCopy(bys, 0, temp, packageData.Length, x);
packageData = temp;
}
else
{
packageData = new byte[x];
Buffer.BlockCopy(bys, 0, packageData, 0, x);
}
while (packageData != null && packageData.Length > 16)
{
int newPackageLength = WXClientTool.ReadInt(packageData, 0);
if (newPackageLength <= 0 || newPackageLength > 8000000)
{
LogHelper.GetSingleObj().Error("Wechat DePack", "长度不合法");
packageData = null;
}
else if (newPackageLength <= packageData.Length)
{
byte[] newPackage = new byte[newPackageLength];
Buffer.BlockCopy(packageData, 0, newPackage, 0, newPackageLength);
if (newPackageLength < packageData.Length)
{
byte[] temData = new byte[packageData.Length - newPackageLength];
Buffer.BlockCopy(packageData, newPackageLength, temData, 0, packageData.Length - newPackageLength);
packageData = temData;
}
else
{
packageData = null;
}
HandlePackage(newPackage);
}
else
{
break;
}
}
return result;
}
//解析包
public void HandlePackage(byte[] bys)
{
if (bys.Length == 20 && bys[3] == 20 && bys[5] == 16 && bys[7] == 1)
{
// 有新消息就会接受到此包
SaveBufferToPackDic(bys);
return;
}
else
{
if (bys.Length >= 16 && bys[16] != (byte)191
&& !(bys[3] == 58 && bys[5] == 16 && bys[7] == 1 && bys.Length == 58)
&& !(bys[3] == 47 && bys[5] == 16 && bys[7] == 1 && bys.Length == 47))
{
return;
}
SaveBufferToPackDic(bys);
}
}
class SocketResult
{
public DateTime Time { get; set; }
public byte[] Data { get; set; }
}
Dictionary<int, SocketResult> mPackDic = new Dictionary<int, SocketResult>();
public WeixinBase weixin;
public Func<byte[], bool> NotifyCallback { get; set; }
// int Seq = 0;
//保存数据到mPackDic
public void SaveBufferToPackDic(byte[] bys)
{
lock (mPackDicLock)
{
var Seq = WXClientTool.ReadInt(bys, 12);
if (Seq == 0)
{
byte[] buffers = new byte[bys.Length];
Buffer.BlockCopy(bys, 0, buffers, 0, bys.Length);
int cmd = WXClientTool.ReadInt(buffers, 8);
int selector = WXClientTool.ReadInt(buffers, 16);
LogHelper.GetSingleObj().Info("Wechat SaveBufferToPackDic", $"{weixin.WeixinHao}-收到{buffers.Length}字节!");
if (cmd == 318 && NotifyCallback != null)
{
NotifyCallback(buffers);
}
if (cmd == 24 && NotifyCallback != null)
{
NotifyCallback(buffers);
}
if (cmd != 24 && cmd != 318)
{
}
}
else
{
byte[] buffers = new byte[bys.Length];
Buffer.BlockCopy(bys, 0, buffers, 0, bys.Length);
mPackDic[Seq] = new SocketResult() { Data = buffers, Time = DateTime.Now };
Seq = 0;
}
}
}
}
}