我想写一部分代码,我开始使用tcp流发送包,但没有任何部分通过互联网接收它。 与此同时,我还希望有另一种方法可以随时连接到该特定流,并从连接时开始接收字节。 我想使用多播,但我发现在互联网上做这件事是不可能的 有办法吗?到目前为止我只发现了一些信息,C#中的tcp连接采用点对点方式,所以我的情况听起来无法实现,因为监听器必须始终处于活动状态才能初始化流转化器,我该如何绕过它呢?
答案 0 :(得分:3)
编辑 添加了一个简单“代理”的示例,该代理重新发布其收到的所有邮件。
使用UDP并将数据包广播到可能或可能不在任何时间收听的端点。
如果侦听服务处于脱机状态,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数据包可以保证传送,这既是祝福又是诅咒。
如果你想要保证消息你需要实现自己的解决方案,一个方法是数据报的计数器,如果有消息丢失则监听器会监视它然后请求重新发送该消息。
答案 1 :(得分:-1)
您可以创建一个派生自Stream
的新类,覆盖Write
方法,并在此管理对tcp客户端的写入。无论客户端是否连接,您都可以从代码中写入此流。当没有客户端连接时,数据将被忽略。