在对该需求展开进行说明前,我们需要先了解几个基本名词。
1、酷Q是什么?
简单来说,酷Q是一个QQ机器人软件,能在QQ群里回答、发布信息。相关的机器人软件比较多,如QQLight、
2、ZeroMQ是什么?
简单来说,ZeroMQ是一个网络层的数据通信组件,支持TCP或UDP发送数据。具体到C#,有一个NetMQ的组件,简单好用。
酷Q的使用就不多说了,可以加入酷Q官网或者相关技术群进行学习。
NetMQ的使用非常简单,我们需要创建一个服务端和一个客户端。服务端接收数据,客户端发送数据。
第一步:引用两个类库,AsyncIO和NetMQ,可直接在NuGet下载。
第二步:创建服务端,通过While(true)保持监听
using (NetMQSocket serverSocket = new ResponseSocket())
{
serverSocket.Bind("tcp://127.0.0.1:5555");
while (true)
{
string message1 = serverSocket.ReceiveFrameString();
Console.WriteLine("Receive message :\r\n{0}\r\n", message1);
string[] msg = message1.Split(':');
string message = msg[1];
serverSocket.SendFrame(message);
if (message == "exit")
{
break;
}
}
}
第三步:创建客户端
using (NetMQSocket clientSocket = new RequestSocket())
{
clientSocket.Connect("tcp://127.0.0.1:5555");
string message = "Hello";
clientSocket.SendFrame(num + ":" + message);
string answer = clientSocket.ReceiveFrameString();
Console.WriteLine("Answer from server:{0}", answer);
}
需要特别注意的是,客户端必须接收服务端的回馈信息,否则会报异常。
上面三步就已经搭建起了基本的NetMQ通信框架。现在我们将这段代码移植到酷Q插件中去。
在插件加载的事件中,将酷QAPI的对象存储下来,然后创建一个NetMQHelper类,在该类的Push(方法名称随意)事件中,编写如下代码。
Task.Factory.StartNew(() =>
{
using (this.Socket = new ResponseSocket($"@tcp://{Common.NetMQSrv}:{Common.ZeroMqPort}"))
{
BEnable = true;
while (BEnable)
{
//log.Info("ZeroMQ", "Execing");
string msg = this.Socket.ReceiveFrameString();
if (!string.IsNullOrEmpty(msg))
{
//log.Info("ZeroMQ", msg);
File.AppendAllText($@"{Common.RunDirectory}/Logs/NetMQ.log", $"{DateTime.Now} 收到 {msg}\r\n");
if (OnMessage != null)
{
OnMessage(msg);
}
}
Socket.SendFrame(msg);
//Console.WriteLine("进行 线程" + Thread.CurrentThread.ManagedThreadId);
}
}
}, TaskCreationOptions.LongRunning);
其中的OnMessage是一个代理事件,当通过NetMQ接收到数据后,可通过OnMessage和其它业务关联起来进行业务处理,比如调用酷Q的群消息推送。
操作原理就是这样了,赶紧去试试,不明白的可以加群一起讨论。在此说明下,插件的开发是使用的Native.SDK开发框架,在网上搜搜,此处就略过不表。
杀京东 做最走心的电商舆情监控平台 免费开源的价格监控软件 欢迎加入QQ群415014949一起讨论