我目前正在尝试完成一个项目,该项目侦听多个端口并接收传入数据。
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线程的接收数据?
您可以执行以下操作-
-
添加您希望接收的数据类型的队列。最好使用同步版本或创建自己的版本,取决于.Net。请参阅http://msdn.microsoft.com/en-us/library/dd997305(v=vs.110).aspx。将你得到的每一个新东西都添加到队列中,并将队列公开,以便其他类可以访问它。希望访问传入数据的其他线程可以从队列中读取数据,如果队列为空,则可以进行阻塞,或者通过定期检查是否存在项目进行轮询。
-
另一种选择是使用事件(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.
}
}