C#tcp stream - 是否可以在没有监听器的情况下运行流?

时间:2015-03-12 09:35:46

标签: c# tcp stream tcpclient multicast

我想写一部分代码,我开始使用tcp流发送包,但没有任何部分通过互联网接收它。 与此同时,我还希望有另一种方法可以随时连接到该特定流,并从连接时开始接收字节。 我想使用多播,但我发现在互联网上做这件事是不可能的 有办法吗?到目前为止我只发现了一些信息,C#中的tcp连接采用点对点方式,所以我的情况听起来无法实现,因为监听器必须始终处于活动状态才能初始化流转化器,我该如何绕过它呢?

2 个答案:

答案 0 :(得分:3)

编辑 添加了一个简单“代理”的示例,该代理重新发布其收到的所有邮件。

使用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数据包可以保证传送,这既是祝福又是诅咒。

如果你想要保证消息你需要实现自己的解决方案,一个方法是数据报的计数器,如果有消息丢失则监听器会监视它然后请求重新发送该消息。

答案 1 :(得分:-1)

您可以创建一个派生自Stream的新类,覆盖Write方法,并在此管理对tcp客户端的写入。无论客户端是否连接,您都可以从代码中写入此流。当没有客户端连接时,数据将被忽略。