242 lines
7.6 KiB
C#
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;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
}
|