简体   繁体   English

用于Socket通信的Consumer Publisher模型

[英]Consumer Publisher model for Socket communication

I am implementing publisher consumer model for UDP socket communication. 我正在实现UDP套接字通信的发布者使用者模型。 In that application the consumers will create the UDP socket while subscribing the events.So each consumer will have different IP address and port for data sending. 在该应用程序中,使用者将在订阅事件时创建UDP套接字。因此,每个使用者将具有用于发送数据的不同IP地址和端口。 And process of subscribing to events is dynamic means we can add subscribers run time. 订阅事件的过程是动态的,这意味着我们可以增加订阅者的运行时间。 In my application the publisher invokes the event when after some interval of time. 在我的应用程序中,发布者会在一段时间后调用事件。 Suppose in my application currently I have 5 subscribers so after invoking the method by publisher, this data should be sent to 5 different subscribers using their IP and Port. 假设在我的应用程序中当前有5个订阅者,因此在由发布者调用该方法之后,应使用其IP和端口将此数据发送给5个不同的订阅者。 As I am having single method of sending data in subscribers, I am not getting how to send data to different IP and port simultaneously? 由于我只有一种在订户中发送数据的方法,因此无法同时将数据发送到不同的IP和端口? How to maintain the states of event handlers? 如何维护事件处理程序的状态? Please help me. 请帮我。

Here I am adding the sample code. 我在这里添加示例代码。

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
         }
    }

There may be better ways of doing this. 可能有更好的方法可以做到这一点。 But, this is what I've done based on my understanding. 但是,根据我的理解,这就是我所做的。 This should work as prototype for your requirements. 这应该可以作为满足您需求的原型。

 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);
    }
}

I think a better approach. 我认为是更好的方法。

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