2013-10-04 2 views
0

Я внедряю потребительскую модель издателя для связи сокетов UDP. В этом приложении потребители создадут сокет UDP при подписке на события. Каждый пользователь будет иметь разные IP-адрес и порт для отправки данных. Процесс подписки на события является динамическим, и мы можем добавить время работы подписчиков. В моем приложении издатель вызывает событие, когда через некоторое время. Предположим, что в моем приложении в настоящее время у меня 5 подписчиков, поэтому после вызова метода издателем эти данные должны быть отправлены 5 различным подписчикам с использованием их IP и порта. Поскольку у меня есть единственный способ отправки данных в подписчиках, я не получаю, как отправлять данные на разные 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 
     } 
    } 
+0

Вы должны показать свою работу. –

+0

Помог ли мой ответ? –

ответ

0

Могут быть лучшие способы сделать это. Но это то, что я сделал на основе моего понимания. Это должно работать как прототип для ваших требований.

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); 
    } 
} 
Смежные вопросы