【问题标题】:Threaded network listener with return values带返回值的线程网络侦听器
【发布时间】:2013-12-08 10:53:58
【问题描述】:

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

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

【问题讨论】:

    标签: c# multithreading sockets network-programming


    【解决方案1】:

    您可以执行以下操作 -

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

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

    【讨论】:

    • 谢谢瓦迪姆。我去看看文章。
    • 从线程的角度来看,这正是管理传入数据的正确方法。根据您期望的连接数,选项 2 可能更好。存储数据,向线程发出信号表明您有可用数据,然后返回。这使您在为其他连接提供服务时的延迟非常低。线程可以从容处理。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-05
      • 1970-01-01
      • 2015-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多