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

210 lines
7.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Sodao.FastSocket.Client;
using Sodao.FastSocket.Client.Messaging;
using Sodao.FastSocket.Client.Protocol;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using Chat.Framework.WXSdk.Implement;
using Sodao.FastSocket.SocketBase;
using Chat.Framework.WXSdk.Events;
namespace Chat.Framework.WXSdk.IPAD
{
interface ISocket
{
FastSocketStatus Status { get; set; }
bool Connection(List<string> host, int port);
bool Connection(string host, int port);
void Stop();
}
public enum FastSocketStatus
{
= 1,
= 2,
= 3,
= 4
}
internal class FastSocket : ISocket,IDisposable
{
public FastSocket(WXClientImpl_IPAD client) {
this.client = client;
}
WXClientImpl_IPAD client { get; set; }
public FastSocketStatus Status { get; set; }
public SocketClient<WeChatMessage> WeChatClient { get; set; }
public void Stop()
{
try
{
Status = FastSocketStatus.;
if (WeChatClient != null)
{
WeChatClient.ReceivedNotifyMessage -= WeChatClient_ReceivedNotifyMessage;
WeChatClient.ReceivedUnknowMessage -= WeChatClient_ReceivedUnknowMessage;
this.WeChatClient.UnRegisterEndPoint("WeChat");
this.WeChatClient.Stop();
this.WeChatClient = null;
}
}
catch { }
}
public bool Connection(List<string> host, int port)
{
try
{
this.Stop();
//先不改了 - -5s
WeChatClient = new SocketClient<WeChatMessage>(new WeChatProtocol(), 1024, 1024, 60000, 60000);
WeChatClient.ReceivedNotifyMessage += WeChatClient_ReceivedNotifyMessage;
WeChatClient.ReceivedUnknowMessage += WeChatClient_ReceivedUnknowMessage;
//绑定Unknow 未知包 异常包 事件
List<IPEndPoint> IPEnds = new List<IPEndPoint>();
foreach (string item in host)
{
var ip = Dns.GetHostAddresses(item);
IPEnds.Add(new IPEndPoint(ip[0], port));
}
return WeChatClient.TryRegisterEndPoint("WeChat", IPEnds.ToArray(),
connection =>
{
var source = new TaskCompletionSource<bool>();
connection.Disconnected += Connection_Disconnected;//如果触发这个事件呢 你好像吧原有的事件叠加了 - -
//在这里绑定
//此包保持长链接 若链接成功后不发包 则会断开 底层socket 已处理了重连机制
Request<WeChatMessage> request = null;
if (client.Status!= WxStatus.线 || true)//全局登录成功的标志位有么 //meijinzheli 不要改 这里是断线重连才会触发的 连接首次连接也会触发
{
request = WeChatClient.NewRequest("noping", Util.StrToHex("00 00 00 10 00 10 00 01 00 00 00 01 00 00 00 01"), 10000,
//绑定异常回调
ex =>
{ //IsAsync=false时 接收超时也会触发断开链接并且重连IsAsync=ture 不会断开重连 超时?由于计算引起的?
//超时会自动废弃包
Console.WriteLine("连接失败:" + ex);
source.TrySetException(ex);
//Connection_Disconnected(connection,ex);
source.TrySetResult(false);
},
//绑定返回请求的回调
onResultMessage =>
{
Console.WriteLine("long.weixin.qq.com Connect success!");
//触发此回调说明已经从底层的_receivingQueue 队列中移除了
//byte[] buff = onResultMessage.Msg.BaseMsg.Payloads.ToByteArray();
this.Status = FastSocketStatus.;
source.TrySetResult(true);
});
connection.BeginSend(request);
var task = source.Task;
return task;
}
else
{
//这里还没改呢 - -
//绑定SYNC同步消息的包 你改一下,表示没看懂,你让我怎么改~ 告诉sync同步消息的包在我知道了 - -
source.SetResult(true);
client.AsyncSyncMessage();
return source.Task;
}
});
}
catch (Exception ex)
{
Console.WriteLine("异常:" + ex.Message);
}
return false;
}
private void WeChatClient_ReceivedUnknowMessage(IConnection i, WeChatMessage message)
{
try
{
int Ret = Sodao.FastSocket.SocketBase.Utils.NetworkBitConverter.ToInt32(message.Msg.BaseMsg.Payloads.ToByteArray(), 18);
Console.WriteLine("ReceivedUnknowMessage CMD" + message.CmdID + " 异常返回Ret:" + Ret);
if (Ret == -13 && client.Status == WxStatus.线)
{
client.ResetConnection();
}
}
catch { }
}
private void WeChatClient_ReceivedNotifyMessage(IConnection i, WeChatMessage message)
{
try
{
switch (message.CmdID)
{
case 24:
client.AsyncSyncMessage();
break;
case 318:
var data = message.Msg.BaseMsg.Payloads.ToByteArray(); //这个DATa就是一个完整的包
client.DecodeSecureNotifyThread(data);
break;
default:
Console.WriteLine("ReceivedNotifyMessage 未知 CMD:" + message.CmdID);
//client.WriteLog("ReceivedNotifyMessage 未知 CMD" + message.CmdID,true);
break;
}
}
catch { }
}
private void Connection_Disconnected(IConnection connection, Exception ex)
{
Console.WriteLine("当前状态:"+Status);
if (connection != null && Status == FastSocketStatus. )
{
Status = FastSocketStatus.;
if (client.Status == WxStatus.线)
{
client.ResetConnection();
}
//else
//{
// client.connection_grpc();
//}
}
}
public bool Connection(string host, int port)
{
var list = new List<string>();
list.Add(host);
return Connection(list, port);
}
public void Send(Request<WeChatMessage> request)
{
WeChatClient.Send(request);
}
public void Dispose()
{
}
}
}