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

时间:2013-12-08 10:53:58

标签: c# multithreading sockets network-programming

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

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线程获取收到的数据?

2 个答案:

答案 0 :(得分: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)您的类可以公开存在相关数据的事件,并在数据到达时调用它。其他类将注册并将收到新传入数据的通知。< / p>

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

答案 1 :(得分: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.
   }
}