繁体   English   中英

用于Socket通信的Consumer Publisher模型

[英]Consumer Publisher model for Socket communication

我正在实现UDP套接字通信的发布者使用者模型。 在该应用程序中,使用者将在订阅事件时创建UDP套接字。因此,每个使用者将具有用于发送数据的不同IP地址和端口。 订阅事件的过程是动态的,这意味着我们可以增加订阅者的运行时间。 在我的应用程序中,发布者会在一段时间后调用事件。 假设在我的应用程序中当前有5个订阅者,因此在由发布者调用该方法之后,应使用其IP和端口将此数据发送给5个不同的订阅者。 由于我只有一种在订户中发送数据的方法,因此无法同时将数据发送到不同的IP和端口? 如何维护事件处理程序的状态? 请帮我。

我在这里添加示例代码。

public class Program
    {        
        public static EventHandler<ListEventArgs> DataSending;

        static void Main(string[] args)
        {

            Class1.CreateNewEvent();          
            Class1.CreateNewEvent();
            Class1.CreateNewEvent();
            Class1.CreateNewEvent();
            Class1.CreateNewEvent();
            OnDataSending("Hello2");
            Console.ReadLine();          

        }

        static void OnDataSending(object data)
        {
            if (DataSending != null)
            {
                List<string> ss = new List<string>();
                ss.Add(IPADDRESS);
                ss.Add(PORT);               
                DataSending(data,new ListEventArgs(ss));
            }
        }
    }




public static class Class1
    {      

         public static void CreateNewEvent()
         {
             Program.DataSending += new EventHandler<ListEventArgs>(newEvent);
         }

         static void newEvent(object o, ListEventArgs e)
         {
            //Code for socket creation and sending data
         }
    }

可能有更好的方法可以做到这一点。 但是,根据我的理解,这就是我所做的。 这应该可以作为满足您需求的原型。

 public class Program
 {
    static List<Subscriber> GetSubscribers()
    {
        return
            new List<Subscriber>
            {
                new Subscriber{IP ="1.2.3.4",Port="1521"},
                new Subscriber{IP="2.2.2.2",Port="8080"},
                new Subscriber{IP="4.4.4.4",Port="1250"},
                new Subscriber{IP="6.6.6.6",Port="4123"}
            };

    }

    static void Main(string[] args)
    {

        Publisher p = new Publisher();
        List<Subscriber> subs = GetSubscribers();
        p.PublishEvent += new Publisher.PublishData(subs[0].PrintMessage);
        p.PublishEvent += new Publisher.PublishData(subs[1].PrintMessage);
        p.PublishEvent += new Publisher.PublishData(subs[2].PrintMessage);
        p.PublishEvent += new Publisher.PublishData(subs[3].PrintMessage);
        p.OnPublishData();
        Console.ReadKey();
    }

}

class Publisher
{

    public delegate void PublishData();
    public event PublishData PublishEvent;
    public void OnPublishData()
    {           
        if (PublishEvent != null)
            PublishEvent();
    }
}


class Subscriber
{
    public string IP { get; set; }
    public string Port { get; set; }

    public void PrintMessage()
    {
        Console.WriteLine("Data has arrived for IP " + IP + " Port " + Port);
    }
}

我认为是更好的方法。

public class Program
{
    static List<Subscriber> GetSubscribers()
    {
        return
            new List<Subscriber>
            {
                new Subscriber{IP ="1.2.3.4",Port="1521"},
                new Subscriber{IP="2.2.2.2",Port="8080"},
                new Subscriber{IP="4.4.4.4",Port="1250"},
                new Subscriber{IP="6.6.6.6",Port="4123"}
            };

    }

    static void Main(string[] args)
    {

        PublishDataEventArgs e = new PublishDataEventArgs();
        e.Message = "Hello from Subscriber";

        Publisher p = new Publisher();
        List<Subscriber> subs = GetSubscribers();
        p.PublishData += new EventHandler<PublishDataEventArgs>(subs[0].PrintMessage);
        p.PublishData += new EventHandler<PublishDataEventArgs>(subs[1].PrintMessage);
        p.PublishData += new EventHandler<PublishDataEventArgs>(subs[2].PrintMessage);
        p.PublishData += new EventHandler<PublishDataEventArgs>(subs[3].PrintMessage);
        p.OnPublishData(e);
        Console.ReadKey();
    }

}

class Publisher
{  
    public void OnPublishData(PublishDataEventArgs p)
    {
        EventHandler<PublishDataEventArgs> _PublishData = PublishData;
        if (_PublishData != null)
            _PublishData(this, p);
    }


    public event EventHandler<PublishDataEventArgs> PublishData;
}

class PublishDataEventArgs:EventArgs
{
    public string Message{get;set;}
}


class Subscriber
{
    public string IP { get; set; }
    public string Port { get; set; }

    public void PrintMessage(object sender,PublishDataEventArgs e)
    {
        Console.WriteLine("Data has arrived for IP " + IP + " Port " + Port + " message " + e.Message );
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM