2013-12-08 2 views
0

В настоящее время я пытаюсь выполнить проект, который прослушивает несколько портов и получает входящие данные.Нитевидный сетевой прослушиватель с возвращаемыми значениями

DeviceListener класс:

-Есть метод, называемый PortListener. Требуется два параметра: IP и порт. Он постоянно прослушивает определенный порт для входящих данных.

-The Другой метод называется StartListen, который запускает PortListener в потоке.

Основная программа:

-Он получает список портов и начинает PortListener для каждого порта с использованием StartListen метода.

Psuedo Like Code: 

class DeviceListener() 
{ 

    private string PortListener(string ip, int port) 
    { 
     //listen ip and port. 
     //wait for data. 
     //recieve and return data. 

     RecieveData(); 
     string data = recieved data; 
     return data; 
    } 
    public void StartListen(string ip, int port) 
    { 
     //start PortListener in a thread 
     Thread t = new Thread (() => PortListener(ip,port)); 
     t.Start(); 
    } 

} 

void Main() 
{ 
    ip = ip adress; 
    List portlist; 
    foreach (port in portlist) 
    { 
     string data = DeviceListener.StartListen(ip, port); 
    } 
} 

Моя проблема: я просто не могу вернуть полученные данные в свою основную программу.

Есть ли способ получить полученные данные для каждого потока PortListener?

ответ

0

Я решил проблему с помощью делегата метод.

class DeviceListener() 
{ 
    public delegate void PassData(string str); 
    public PassData passdata;  

    private void PortListener(string ip, int port) 
    { 
     //listen ip and port. 
     //wait for data. 
     //recieve and return data. 

     RecieveData(); 
     string data = recieved data; 

     passdata(data); 
    } 
    public void StartListen(string ip, int port) 
    { 
     //start PortListener in a thread 
     Thread t = new Thread (() => PortListener(ip,port)); 
     t.Start(); 
    } 

} 

void Main() 
{ 
    DeviceListener.passdata = new DeviceListener.PassData(Some_Function); 

    ip = ip adress; 
    List portlist; 
    foreach (port in portlist) 
    { 
     DeviceListener.StartListen(ip, port); 
    } 

    private void Some_Function(string data) 
    { 
     //do something with returned string. 
    } 
} 
4

Вы можете сделать следующее -

  1. Добавить очередь из данных типа вы хотите получить. Лучше всего использовать синхронизированные версии или создавать свои собственные, зависит от .Net. См. http://msdn.microsoft.com/en-us/library/dd997305(v=vs.110).aspx. Добавьте каждый новый материал, который вы попадете в очередь, и сделайте очередь открытой, чтобы другие классы могли получить к ней доступ. Другие потоки, которые хотят получить доступ к входящим данным, могут читать, могут читать из очереди и блокировать, если очередь пуста или опрос, периодически проверяя наличие элементов.

  2. Другой вариант заключается в использовании события (http://msdn.microsoft.com/en-us/library/aa645739(v=vs.71).aspx) Ваш класс может выставить событие с соответствующими данными настоящего и вызывать его по прибытии данных. Другие классы будут регистрировать и получать уведомления о новых входящих данных.

Первый вариант лучше, если у вас есть один объект для чтения, то второй лучше, если несколько лиц заинтересованы в данных.

+0

Спасибо Вадим. Я посмотрю на статьи. – ozz

+0

Это именно он в правильном направлении, с точки зрения потоковой передачи, для управления входящими данными. В зависимости от количества ожидаемых соединений вариант 2, вероятно, лучше. Сохраните данные, сообщите поток, который у вас есть, и верните его. Это позволяет очень малую задержку при обслуживании других соединений. Нить может процесс неторопливо. –

Смежные вопросы