具有返回值的线程化网络侦听器



我目前正在尝试完成一个项目,该项目侦听多个端口并接收传入数据。

DeviceListener类:

-我有一个名为PortListener的方法。它需要两个参数,即IP地址和端口地址。它持续侦听特定端口的传入数据。

-另一个方法称为StartListen,它在线程中运行PortListener

主程序:

-它获取端口列表,并使用StartListen方法为每个端口启动PortListener

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线程的接收数据?

您可以执行以下操作-

  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)类可以公开具有相关数据的事件,并在数据到达时调用它。其他类将注册并收到新传入数据的通知。

如果您有一个读取实体,第一个选项更好,如果多个实体对数据感兴趣,第二个选项更好。

我使用委托方法解决了这个问题。

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

最新更新