编辑添加了一个简单的“代理”示例,该代理重新发布它收到的所有消息。
使用 UDP 并将您的数据包广播到可能会或可能不会在任何时间点侦听的端点。
或者使用消息队列,例如MSMQ、RabbitMQ 或0MQ。
如果侦听服务长时间处于离线状态,那么 MSMQ 可能会成为问题,因为您的调度系统上的消息队列会导致可能会填满的积压。
如果您想使用 UDP 创建一些东西,这里有一些代码。
监听器(服务器):
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace UDPLISTENER
{
class Program
{
static void Main(string[] args)
{
var port = 8750;
var listener = new UdpClient(port);
var group = new IPEndPoint(IPAddress.Any, port);
Console.WriteLine("Listening for datagrams on port {0}", port);
while(true)
{
var data = listener.Receive(ref group);
Console.WriteLine("{0}: {1}", group.ToString(), Encoding.Default.GetString(data, 0, data.Length));
}
}
}
}
代理(服务器和客户端):
sing System;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace UDPCLIENT
{
class Program
{
static void Main(string[] args)
{
int listeningPort = 8749, dispatchPort = 8750;
var listener = new UdpClient(listeningPort);
var group = new IPEndPoint(IPAddress.Any, listeningPort);
// Republish client
var sender = new UdpClient("127.0.0.1", dispatchPort);
Console.WriteLine("Listening for datagrams on port {0}", listeningPort);
while (true)
{
var data = listener.Receive(ref group);
Console.WriteLine("{0}: {1}", group.ToString(), Encoding.Default.GetString(data, 0, data.Length));
sender.Send(data, data.Length);
}
}
}
}
发件人(客户):
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace UDPSENDER
{
class Program
{
static void Main(string[] args)
{
var sender = new UdpClient("127.0.0.1", 8749);
while (true)
{
Console.WriteLine("Message: ");
var data = Encoding.Default.GetBytes(Console.ReadLine());
sender.Send(data, data.Length);
}
}
}
}
根据您希望归档的内容,我推荐消息队列,它们提供了最大的灵活性。
但正如您所见,UDP 的工作方式与 TCP 略有不同。您不需要像 TCP 那样的握手,这意味着如果没有人在收听您的消息,它们就会消失,而发件人不会为此付出任何代价(网络仍然需要付出代价)。但是,如果弹出一个监听器,那么他们就会立即开始使用这些消息。请记住,没有 UDP 数据包可以保证传送,这既是福也是祸。
如果您希望确保消息得到保证,您需要实施自己的解决方案,一种方法是在数据报上设置计数器,如果缺少消息,侦听器会监视该数据报,然后它会请求重新发送该消息。